地鐵線路項目
2019.7.21 完成了程序構思與模塊劃分;填寫PSP表計劃時間;完成了模塊設計;異常處理說明;測試用例等部份內容,下一步進行單元測試、黑盒測試和並完成程序的分析與優化。
程序構思與模塊劃分
本項目核心問題實質上是無向無權圖中,求最短路徑,經過對此項目進行分析,整個程序大體劃分爲以下幾個模塊:
- 命令解析模塊:提取命令行輸入的參數類型和參數值。
- IO操做模塊:讀入地鐵線路圖數據文件爲字符串數組,將輸出的數據轉換爲多行字符串寫入輸出文件。
- 地鐵地圖解析模塊:將字符串數組轉換爲地鐵線、地鐵站,並提取其中的換乘站,構建一個地鐵線路圖對象。
- 線路查詢模塊:接受輸入的線路信息,在地鐵線路圖對象中查詢到對應的線路,輸出查詢線路的所有站點列表。
- 線路搜索模塊:接受輸入的起始點和終點站點信息,經過最短路徑搜索算法,查找最短線路路徑。
- 主控模塊:協調各個模塊,保證程序正確運行。主控模塊調用命令解析模塊,等到響應的命令和參數;根據不一樣的命令分別調用地鐵解析模塊構建地鐵線路圖對象,調用線路查詢模塊返回查詢到的線路站點信息,調用線路搜索模塊獲取起點到終點的最短換乘線路。
估計項開發須要的時間,並經過下面的PSP表記錄:git
PSP2.1 | Personal Software Process Stages | Time | Real Time |
---|---|---|---|
Planning | 計劃 | 1h | |
· Estimate | · 估計這個任務須要多少時間 | 1h | |
Development | 開發 | 21h | |
· Analysis | · 需求分析 (包括學習新技術) | 2h | |
· Design Spec | · 生成設計文檔 | 2h | |
· Design Review | · 設計複審 (和同事審覈設計文檔) | 1h | |
· Coding Standard | · 代碼規範 (爲目前的開發制定合適的規範) | 2h | |
· Design | · 具體設計 | 2h | |
· Coding | · 具體編碼 | 6h | |
· Code Review | · 代碼複審 | 2h | |
· Test | · 測試(自我測試,修改代碼,提交修改) | 4h | |
Reporting | 報告 | 6h | |
· Test Report | · 測試報告 | 2h | |
· Size Measurement | · 計算工做量 | 2h | |
· Postmortem & Process Improvement Plan | · 過後總結, 並提出過程改進計劃 | 2h | |
合計 | 28h |
模塊設計與實現
1.地圖文件格式設計 爲了使得文件簡單易維護,同時也可以方便程序解析地圖文件的數據,我設計的文件格式形式爲:github
地鐵線1,站點1,站點2,站點3,...,站點n\r\n 地鐵線2,站點1,站點2,站點3,...,站點n\r\n 說明:文件中的每一行表示一條地鐵線,經過\r\n分割 經過逗號分割每一行字符串,分割後的字符串數組的第一個字符串爲線路名稱,後面的字符串爲地鐵線路按順序的對應站點。
2.模塊設計算法
-
命令解析模塊:接受命令行運行時帶入的參數,正確提取參數,而且可以忽略錯誤的參數,必要時給與響應的提示。數組
具體流程:遍歷全部參數,判斷是否屬於一種命令,若是是對應的命令,則提取命令後面對應的參數值,若是沒有提取到必須的參數值在提示命令錯誤信息,以此處理完全部的參數,最後返回提取到的命令和對應的參數值。框架
-
地鐵地圖解析模塊:單元測試
(1)分析項目中涉及到的對象,包括站點、地鐵線、地鐵線路圖、路徑(一條線上的兩個站點),分別定義了以下的結構。學習
站點測試
class Station { public: string StationName;//站點名稱 vector<string> BelongTo ;//地鐵線的名稱 vector<int> IndexOfLine;//對應的地鐵線上的站序號 bool Visited;//是否已被訪問 };
地鐵線路
template<class T> class Line { public: string LineName; vector<T> Stations; };
地鐵線路圖
class Map { public: //全部的站點 map<string, Station> Stations; //全部的地鐵線 map<string, Line<Station>> Lines; };
路徑
class Path{ public: int Start;//線路段開始序號 int End;//線路段結束序號 int Next;//下一段序號 Line<Station> PathLine;//當前地鐵線 };
(2)讀入地圖文件中的字符串數據,進行字符串分割並建立上面列出的一系列對象,做爲後續線路查詢和線路搜索任務的數據。
-
線路查詢模塊:優化
vector<Station> stations。具體流程以下:編碼
(1)遍歷地鐵線路圖對象lines,
(2)判斷當前線路的StationName是否與輸入的線路名稱相等,
(3)若是相等則返回Line對象。
-
線路搜索模塊: 接受輸入的起點站和終點站的名字,輸出多段地鐵線路路徑vector<vector<Path>> paths,可能存在多條相同長度的線路。具體的流程以下:
(1)首先經過地鐵線路圖對象的Stations,經過名字直接找到對應的地鐵線路,
(2)以對應的站點爲起點進行深度遍歷:向其所在線路的兩個方向搜索,每一輪搜索前進一個站點,記錄路徑與通過的站點數量,經過換乘點時增長新的路徑(換乘線路的兩個方向),直到搜索到對應的終點,
(3)記錄通過的每條地鐵線路的路徑,返回一個路徑的數組,便是咱們要搜索的最短路徑。這樣的路徑可能不止一條。
-
IO操做模塊:
(1)讀取地圖文件:輸入地圖的文件路徑,輸出文件中的每一行數據的字符串數組。
(2)結果寫入文件:將處理模塊輸出的結果(vector<Station> stations 或者vector<vector<Path>> paths),轉爲需求要求的結果格式,寫入輸出文件。
-
主控模塊: 該模塊的主要做用是將各個模塊聯繫起來,構成一個完整的程序,其大體框架以下圖所示:
程序分析與優化
//TODO:分析思路、優化手段
單元測試
單元測試部分,咱們將每一個模塊視爲一個單元,對模塊暴露的接口進行測試,在進行單元測試的時候,頗有必要根據模塊的具體功能需求,按照白盒測試用例的設計思路採用語句覆蓋、斷定覆蓋、條件覆蓋、斷定條件覆蓋、條件組合、路徑覆蓋等方法儘量對代碼的邏輯路徑進行覆蓋測試。 //TODO:列舉設計的單元測試用例
異常處理說明
- 參數錯誤異常:對於不支持的命令類型給出響應的提示;對於命令對應參數數量不全的狀況給出響應的提示。
- IO異常:對於文件的操做,先對文件進行存在性檢測,再打開文件;在對文件進行寫入時捕獲響應的異常,並進行提示。
- 空指針異常:對全部指針類型進行空指針檢查,而後再使用。
測試用例
1.測試用例設計
黑盒測試用例的設計方法多種多樣,本次項目主要採用了等價類劃分法、邊界值分析法、錯誤推測法等進行用例的設計。
-
等價類劃分法:將測試的範圍劃分爲幾個不想交的子集,他們的並集就是全集,從每一個子集選出若干具備表明性的值做爲測試用例。
-
邊界值分析法:大量的測試經驗告訴咱們,大量的錯誤是發生在輸入範圍的邊界上,而不是發生在輸入輸出範圍的內部。所以針對各類邊界狀況設計測試用例,能夠查出更多的錯誤。
-
錯誤推測法:在測試程序時,人們能夠根據經驗或直覺推測程序中可能存在的各類錯誤,從而有針對性地編寫檢查這些錯誤的測試用例的方法。 這種方法沒有固定的形式,依靠的是經驗和直覺,不少時候,咱們都會不知不覺的使用到。
2.測試用例
依據上面的用例設計方法,設計了一些測試用例,下表中列舉了部分用例:
序號 | 標題 | 前置條件 | 輸入 | 操做步驟 | 預期結果 |
---|---|---|---|---|---|
1 | 正確查詢線路 | 1.能在當前測試系統上運行<br>2.查詢的線路存在於地圖文件中 | subway.exe -a 1號線 -map subway.txt -o station.txt | 1.輸入命令<br> 2.觀察命令行輸出及程序文件夾目錄的station.txt文件<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行沒有錯誤提示信息<br>3.station.txt文件中正確按格式寫入了1號線的全部站點,而且順序正確(此處省略了全部站點信息) |
2 | 查詢線路錯誤,線路不存在 | 1.能在當前測試系統上運行<br>2.查詢的線路不存在於地圖文件中 | subway.exe -a 20號線 -map subway.txt -o station.txt | 1.輸入命令<br> 2.觀察命令行輸出及程序文件夾目錄的station.txt文件<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行提示"沒有要查找的地鐵線"<br>3.station.txt文件不存在或者數據爲空 |
3 | 查詢線路錯誤,缺乏必要參數-o | 1.能在當前測試系統上運行 | subway.exe -a 1號線 -map subway.txt | 1.輸入命令<br> 2.觀察命令行輸出及程序文件夾目錄的station.txt文件<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行提示"缺乏必要的參數-o"<br>3.station.txt文件不存在或者數據爲空 |
4 | 查詢線路錯誤,缺乏必要參數,地圖文件路徑 | 1.能在當前測試系統上運行 | subway.exe -a 1號線 -map -o station.txt | 1.輸入命令<br> 2.觀察命令行輸出及程序文件夾目錄的station.txt文件<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行提示"缺乏地圖文件路徑"<br>3.station.txt文件不存在或者數據爲空 |
5 | 查詢線路錯誤,缺乏必要參數,輸出結果文件路徑 | 1.能在當前測試系統上運行 | subway.exe -a 1號線 -map subway.txt -o | 1.輸入命令<br> 2.觀察命令行輸出<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行提示"缺乏輸出結果文件路徑"<br> |
6 | 正確搜索路徑,單條地鐵線 | 1.能在當前測試系統上運行 | subway.exe -b 劉園 洪湖裏 -map subway.txt -o routine.txt | 1.輸入命令<br> 2.觀察命令行輸出<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行無錯誤信息<br>3.routine.txt文件中正確按格式輸出了1號線及從劉園到洪湖裏的全部站點信息 |
7 | 正確搜索路徑,兩條地鐵線 | 1.能在當前測試系統上運行 | subway.exe -b 洪湖裏 復興路 -map subway.txt -o routine.txt | 1.輸入命令<br> 2.觀察命令行輸出<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行無錯誤信息<br>3.routine.txt文件中正確按格式輸出了:1號線 洪湖裏 西站 6號線 復興路 |
8 | 正確搜索路徑,沒有可達的線路 | 1.能在當前測試系統上運行 <br>2.地圖文件中新增一條線路20號線,裏面的線路與其餘線路都沒有換乘站,且該線路上有一個站爲世紀城 | subway.exe -b 洪湖裏 世紀城 -map subway.txt -o routine.txt | 1.輸入命令<br> 2.觀察命令行輸出<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行"沒有可達的線路"<br>3.routine.txt文件不存在或者爲空 |
9 | 搜索路徑出錯,缺乏必要參數-o | 1.能在當前測試系統上運行 | subway.exe -b 洪湖裏 復興路 -map subway.txt | 1.輸入命令<br> 2.觀察命令行輸出<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行提示"缺乏必要的參數-o"<br> |
10 | 搜索路徑出錯,缺乏必要參數,輸出結果文件路徑 | 1.能在當前測試系統上運行 | subway.exe -b 洪湖裏 復興路 -map subway.txt | 1.輸入命令<br> 2.觀察命令行輸出<br> 3.對比結果 | 1.程序沒有出錯<br>2.命令行提示"缺乏輸出結果文件路徑"<br> |
心得體會
//TODO:培訓完後再補充心得體會。
效果展現
目前測試還不全名和還需優化,點擊打開GitHub項目地址