• 预培训-个人项目(地铁线路规划)


    地铁线路项目

    2019.7.21
       完成了程序构思与模块划分;填写PSP表计划时间;完成了模块设计;异常处理说明;测试用例等部分内容,下一步进行单元测试、黑盒测试和并完成程序的分析与优化。
    

    程序构思与模块划分

    本项目核心问题实质上是无向无权图中,求最短路径,通过对此项目进行分析,整个程序大致划分为如下几个模块:
    
    • 命令解析模块:提取命令行输入的参数类型和参数值。
    • IO操作模块:读入地铁线路图数据文件为字符串数组,将输出的数据转换为多行字符串写入输出文件。
    • 地铁地图解析模块:将字符串数组转换为地铁线、地铁站,并提取其中的换乘站,构建一个地铁线路图对象。
    • 线路查询模块:接受输入的线路信息,在地铁线路图对象中查询到对应的线路,输出查询线路的全部站点列表。
    • 线路搜索模块:接受输入的起始点和终点站点信息,通过最短路径搜索算法,查找最短线路路径。
    • 主控模块:协调各个模块,保证程序正确运行。主控模块调用命令解析模块,等到响应的命令和参数;根据不同的命令分别调用地铁解析模块构建地铁线路图对象,调用线路查询模块返回查询到的线路站点信息,调用线路搜索模块获取起点到终点的最短换乘线路。

    估计项开发需要的时间,并通过下面的PSP表记录:

    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.地图文件格式设计
    为了使得文件简单易维护,同时也能够方便程序解析地图文件的数据,我设计的文件格式形式为:

    地铁线1,站点1,站点2,站点3,...,站点n
    
    地铁线2,站点1,站点2,站点3,...,站点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 stations。具体流程如下:

      (1)遍历地铁线路图对象lines,

      (2)判断当前线路的StationName是否与输入的线路名称相等,

      (3)如果相等则返回Line对象。

    • 线路搜索模块:
      接受输入的起点站和终点站的名字,输出多段地铁线路路径vector<vector> paths,可能存在多条相同长度的线路。具体的流程如下:

      (1)首先通过地铁线路图对象的Stations,通过名字直接找到对应的地铁线路,

      (2)以对应的站点为起点进行深度遍历:向其所在线路的两个方向搜索,每一轮搜索前进一个站点,记录路径与经过的站点数量,通过换乘点时增加新的路径(换乘线路的两个方向),直到搜索到对应的终点,

      (3)记录经过的每条地铁线路的路径,返回一个路径的数组,即是我们要搜索的最短路径。这样的路径可能不止一条。

    • IO操作模块:

      (1)读取地图文件:输入地图的文件路径,输出文件中的每一行数据的字符串数组。

      (2)结果写入文件:将处理模块输出的结果(vector stations 或者vector<vector> paths),转为需求要求的结果格式,写入输出文件。

    • 主控模块:
      该模块的主要作用是将各个模块联系起来,构成一个完整的程序,其大致框架如下图所示:

      整体框架

    程序分析与优化

    //TODO:分析思路、优化手段
    

    单元测试

    单元测试部分,我们将每个模块视为一个单元,对模块暴露的接口进行测试,在进行单元测试的时候,很有必要根据模块的具体功能需求,按照白盒测试用例的设计思路采用语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合、路径覆盖等方法尽可能对代码的逻辑路径进行覆盖测试。
    
    //TODO:列举设计的单元测试用例
    

    异常处理说明

    • 参数错误异常:对于不支持的命令类型给出响应的提示;对于命令对应参数数量不全的情况给出响应的提示。
    • IO异常:对于文件的操作,先对文件进行存在性检测,再打开文件;在对文件进行写入时捕获响应的异常,并进行提示。
    • 空指针异常:对所有指针类型进行空指针检查,然后再使用。

    测试用例

    1.测试用例设计

    黑盒测试用例的设计方法多种多样,本次项目主要采用了等价类划分法、边界值分析法、错误推测法等进行用例的设计。
    
    • 等价类划分法:将测试的范围划分为几个不想交的子集,他们的并集就是全集,从每个子集选出若干具有代表性的值作为测试用例。

    • 边界值分析法:大量的测试经验告诉我们,大量的错误是发生在输入范围的边界上,而不是发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。

    • 错误推测法:在测试程序时,人们可以根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例的方法。 这种方法没有固定的形式,依靠的是经验和直觉,很多时候,我们都会不知不觉的使用到。

    2.测试用例

     依据上面的用例设计方法,设计了一些测试用例,下表中列举了部分用例:
    
    序号 标题 前置条件 输入 操作步骤 预期结果
    1 正确查询线路 1.能在当前测试系统上运行
    2.查询的线路存在于地图文件中
    subway.exe -a 1号线 -map subway.txt -o station.txt 1.输入命令
    2.观察命令行输出及程序文件夹目录的station.txt文件
    3.对比结果
    1.程序没有出错
    2.命令行没有错误提示信息
    3.station.txt文件中正确按格式写入了1号线的所有站点,并且顺序正确(此处省略了所有站点信息)
    2 查询线路错误,线路不存在 1.能在当前测试系统上运行
    2.查询的线路不存在于地图文件中
    subway.exe -a 20号线 -map subway.txt -o station.txt 1.输入命令
    2.观察命令行输出及程序文件夹目录的station.txt文件
    3.对比结果
    1.程序没有出错
    2.命令行提示"没有要查找的地铁线"
    3.station.txt文件不存在或者数据为空
    3 查询线路错误,缺少必要参数-o 1.能在当前测试系统上运行 subway.exe -a 1号线 -map subway.txt 1.输入命令
    2.观察命令行输出及程序文件夹目录的station.txt文件
    3.对比结果
    1.程序没有出错
    2.命令行提示"缺少必要的参数-o"
    3.station.txt文件不存在或者数据为空
    4 查询线路错误,缺少必要参数,地图文件路径 1.能在当前测试系统上运行 subway.exe -a 1号线 -map -o station.txt 1.输入命令
    2.观察命令行输出及程序文件夹目录的station.txt文件
    3.对比结果
    1.程序没有出错
    2.命令行提示"缺少地图文件路径"
    3.station.txt文件不存在或者数据为空
    5 查询线路错误,缺少必要参数,输出结果文件路径 1.能在当前测试系统上运行 subway.exe -a 1号线 -map subway.txt -o 1.输入命令
    2.观察命令行输出
    3.对比结果
    1.程序没有出错
    2.命令行提示"缺少输出结果文件路径"
    6 正确搜索路径,单条地铁线 1.能在当前测试系统上运行 subway.exe -b 刘园 洪湖里 -map subway.txt -o routine.txt 1.输入命令
    2.观察命令行输出
    3.对比结果
    1.程序没有出错
    2.命令行无错误信息
    3.routine.txt文件中正确按格式输出了1号线及从刘园到洪湖里的所有站点信息
    7 正确搜索路径,两条地铁线 1.能在当前测试系统上运行 subway.exe -b 洪湖里 复兴路 -map subway.txt -o routine.txt 1.输入命令
    2.观察命令行输出
    3.对比结果
    1.程序没有出错
    2.命令行无错误信息
    3.routine.txt文件中正确按格式输出了:1号线 洪湖里 西站 6号线 复兴路
    8 正确搜索路径,没有可达的线路 1.能在当前测试系统上运行
    2.地图文件中新增一条线路20号线,里面的线路与其他线路都没有换乘站,且该线路上有一个站为世纪城
    subway.exe -b 洪湖里 世纪城 -map subway.txt -o routine.txt 1.输入命令
    2.观察命令行输出
    3.对比结果
    1.程序没有出错
    2.命令行"没有可达的线路"
    3.routine.txt文件不存在或者为空
    9 搜索路径出错,缺少必要参数-o 1.能在当前测试系统上运行 subway.exe -b 洪湖里 复兴路 -map subway.txt 1.输入命令
    2.观察命令行输出
    3.对比结果
    1.程序没有出错
    2.命令行提示"缺少必要的参数-o"
    10 搜索路径出错,缺少必要参数,输出结果文件路径 1.能在当前测试系统上运行 subway.exe -b 洪湖里 复兴路 -map subway.txt 1.输入命令
    2.观察命令行输出
    3.对比结果
    1.程序没有出错
    2.命令行提示"缺少输出结果文件路径"

    心得体会

    //TODO:培训完后再补充心得体会。
    

    效果展示

    查询线路

    路线规划

    目前测试还不全名和还需优化,点击打开GitHub项目地址

  • 相关阅读:
    Java暑期学习第四十天日报
    Java暑期学习第三十七天日报
    Java暑期学习第三十八天日报
    Java暑期学习第三十三天日报
    Java学习第五周汇报
    Windows窗体控件扩展TreeView实例
    ADO.NET:从数据集更新数据库
    如何在加载winform的时候自动改变treeview的指定根节点的字体颜色呢??
    9月15日
    扩展DropDownList控件和ListBox控件(1) 支持分组功能(optgroup标签)
  • 原文地址:https://www.cnblogs.com/harry240/p/11221315.html
Copyright © 2020-2023  润新知