地铁线路项目-结对编程

地铁线路项目-结对编程

2019.7.25
完成了模块开发;填写PSP实际完成时间;完成了模块设计;进行单元测试、黑盒测试。

PSP表记录:

PSP2.1 Personal Software Process Stages Time Real Time
Planning 计划 1h 1h
??·?Estimate ?? ·?估计这个任务需要多少时间 1h 1h
Development 开发 21h 20.5h
??·?Analysis ?? ·?需求分析?(包括学习新技术) 2h 1.5h
??·?Design Spec ??·?生成设计文档 2h 1h
??·?Design Review ? ?·?设计复审?(和同事审核设计文档) 1h 1.5h
??·?Coding Standard ??·?代码规范?(为目前的开发制定合适的规范) 2h -
??·?Design ? ?·?具体设计 2h 1.5h
??·?Coding ? ?·?具体编码 6h 8h
??·?Code Review ??·?代码复审 2h 1h
??·?Test ? ?·?测试(自我测试,修改代码,提交修改) 4h 6h
Reporting 报告 6h
??·?Test Report ??·?测试报告 2h -
??·?Size Measurement ??·?计算工作量 2h -
??·?Postmortem & Process Improvement Plan ??·?事后总结,?并提出过程改进计划 2h 1.5h
合计 28h

计算模块设计与实现过程

1.模块设计

  • 命令解析模块:接受命令行运行时带入的参数,正确提取参数,并且能够忽略错误的参数,必要时给与响应的提示。

    具体流程:遍历所有参数,判断是否属于一种命令,如果是对应的命令,则提取命令后面对应的参数值,如果没有提取到必须的参数值在提示命令错误信息,以此处理完所有的参数,最后返回提取到的命令和对应的参数值。

  • 地铁地图解析模块:

    (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)读入地图文件中的字符串数据,进行字符串分割并创建上面列出的一系列对象,作为后续线路查询和线路搜索任务的数据。
  • 线路查询模块:

    输入线路名称,获取到一个线路Line line。获取方式为直接通过Map对象的map<string, Line>对象Lines,直接通过站点名字查出Line。

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

    (1)首先通过地铁线路图对象的Stations,通过名字直接找到对应的地铁线路,
    (2)以对应的站点为起点进行广度遍历:向其所在线路的两个方向搜索;
    (3)每一轮搜索前进一个站点,标注当前站点为已访问,并更新路径;
    (4)通过换乘点时增加新的路径(换乘线路的两个方向),直到搜索到对应的终点,或者一条线的终点,或者一个被访问过的点;
    (5)记录经过的每条地铁线路的路径,返回一个路径的数组,即是我们要搜索的最短路径。这样的路径可能不止一条。

性能分析

暂时未做性能分析。

单元测试

单元测试的覆盖率无法看到,设计了9条单元测试用例,如下:
    //测试输入不存在的地图文件初始化地图
    TEST_METHOD(TestInvalidMapPath)
    {
        //
        Map map = Core::InitMap("");
        Assert::AreEqual((int)map.Lines.size(), 0);
    }
    //测试存在的地图文件初始化地图
    //要检测每一条线的每一个站点太费事了,先只统计数量
    TEST_METHOD(TestValidMpathPath)
    {
        Map map = Core::InitMap("subway.txt");
        Assert::AreEqual((int)map.Lines.size(), 6);
        Assert::AreEqual((int)map.Stations.size(), 140);
    }

    //测试存在的地铁线路
    TEST_METHOD(TestSearchExistLine)
    {
        Map map = Core::InitMap("subway.txt");
        string lineName = "1号线";
        string stations[23] = { "刘园","瑞景新苑","佳园里","本溪路","勤俭道","洪湖里","西站","西北角","西南角","二纬路","海光寺","鞍山道","营口道","小白楼","下瓦房","南楼","土城","陈塘庄","复兴门","华山里","财经大学","双林","李楼" };
        Line<Station> line = Core::SearchLine(lineName, map);
        Assert::AreEqual(lineName, line.LineName);
        Assert::AreEqual((int)line.Stations.size(), 23);
        for (int i = 0;i < 23;i++)
        {
            Assert::AreEqual(line.Stations[i].StationName, stations[i]);
        }
    }

    //测试不存在的地铁线路
    TEST_METHOD(TestSearchNotExistLine)
    {
        Map map = Core::InitMap("subway.txt");
        string lineName = "X号线";
        Line<Station> line = Core::SearchLine(lineName, map);
        Assert::AreNotEqual(line.LineName, lineName);
    }

    //搜索起点到终点线路,存在于一条线路上
    TEST_METHOD(TestSearchExistPathInSingleLine)
    {
        Map map = Core::InitMap("subway.txt");
        vector<vector<Path>> pathss = Core::SearchPaths("本溪路", "西站",map);
        string path[4] = { "本溪路","勤俭道","洪湖里","西站" };
        Assert::AreEqual((int)pathss.size(), 1);
        Assert::AreEqual((int)pathss[0].size(), 1);
        for (int i = 0;i < 4;i++)
        {
            Assert::AreEqual(pathss[0][0].PathLine.Stations[pathss[0][0].Start + i].StationName, path[i]);
        }

    }

    //搜索起点到终点线路,存在于多条线路上
    TEST_METHOD(TestSearchExistPathInMultiLines)
    {
        Map map = Core::InitMap("subway.txt");
        vector<vector<Path>> pathss = Core::SearchPaths("洪湖里", "复兴路", map);
        string path[2][2] = { { "洪湖里","西站" }, { "西站","复兴路" } };
        Assert::AreEqual((int)pathss.size(), 1);
        Assert::AreEqual((int)pathss[0].size(), 2);

        for (int i = 0;i < 2;i++)
        {
            for (int j = 0;j < 2;j++) {
                Assert::AreEqual(pathss[0][i].PathLine.Stations[pathss[0][i].Start + j].StationName, path[i][j]);
            }

        }
    }

    //搜索起点到终点线路,起点不存在
    TEST_METHOD(TestSearchNotExistStartStation)
    {
        Map map = Core::InitMap("subway.txt");
        vector<vector<Path>> pathss = Core::SearchPaths("世纪城", "西站", map);
        Assert::AreEqual((int)pathss.size(), 0);
    }

    //搜索起点到终点线路,终点不存在
    TEST_METHOD(TestSearchNotExistEndStation)
    {
        Map map = Core::InitMap("subway.txt");
        vector<vector<Path>> pathss = Core::SearchPaths("西站", "世纪城", map);
        Assert::AreEqual((int)pathss.size(), 0);
    }

    //搜索起点到终点线路,空地图
    TEST_METHOD(TestSearchEmptyMap)
    {
        string empty = "";

        Map map = Core::InitMap("");
        vector<vector<Path>> pathss = Core::SearchPaths("洪湖里", "西站", map);
        Assert::AreEqual((int)pathss.size(), 0);
    }

异常处理说明

  • 参数错误异常:对于不支持的命令类型给出响应的提示;对于命令对应参数数量不全的情况给出响应的提示。
  • 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.命令行提示"缺少输出结果文件路径"
我没法百分之百确定我的程序肯定是正确的:
(1)通过程序的设计和代码走查,程序的逻辑上没有问题;
(2)单元测试部分尽可能覆盖了代码逻辑;
(3)功能测试是采用测试用例设计的方法,尽可能以最少的用例覆盖了更多的情况。

心得体会

通过个人项目和结对编程,我主要有如下的心得:
(1)以软件工程的思想能够开发出耦合度低,复用性强,质量有保证的程序;
(2)结对编程能够帮助组队人互相提高,并且保证产出代码和软件的质量;
(3)通过边做边学的方式能够更好的理解软件工程思想,对于以后进行相关教学工作提供了灵感;
(4)自己当年学习软件工程过程很痛苦,通过这次的学习,有了新的领悟。

原文地址:https://www.cnblogs.com/harry240/p/11247460.html

时间: 2024-08-01 00:38:20

地铁线路项目-结对编程的相关文章

地铁线路项目需求分析

地铁线路项目需求分析 需求分析 1.如何设计读取的文档格式. 2.根据输入的线路获得该线路上的所有站点信息. 3.输入一个起点站一个终点站,能够输出它们之间最短距离所经过的站点数以及站点名称. 4.测试以及性能的检测 5.各环节所需时间 计划阶段 时间 计划 估计此任务所需时间 开发 需求分析 生成设计文档 设计复审 代码规范 具体设计 具体编码 代码复审 测试 报告 测试报告 计算工作量 事后总结 总计 设计思路 题目的主要要求是如何读取数据以及根据用户需要输出站点信息. 在文档中,每行先输入

中小学题目生成项目结对编程代码分析

此篇博客是对杨同学的个人项目“中小学数学卷子自动生成程序”的代码分析. 完成自己的个人项目之后再来看杨同学的项目,会比较容易看出他人程序与自己程序的不同之处. 优点: 由于感觉自己的程序最不足的地方在于括号的添加,所以首先关注杨同学题目中的括号是怎么生成的. 我的括号是在算式生成的过程中随机添加的,导致只能生成括号内括号,而不能生成两个相互独立的括. 类似下图 而对方的代码是在算式生成之后添加的括号, 如下图 并给算式中的每个数字左右两边分别建了两个数组来记录括号的个数,这样就解决了我没有实现的

地铁线路项目

设计需求 1.思考并设计一个简明易懂,可灵活扩张,方便读取的文件格式在文本文件中存储地铁信息 2.实现一个支持显示地铁线路及相关信息与计算换乘的程序 3.实现查询指定地铁线路,指定地铁站点信息等基础查询操作 4.当用户输入两个站点时,显示两个站点之间的最短线路和换乘信息,并将线路信息写入文本文件记录下来 5.设计的软件对于各中各样的出错情况要尽可能进行精确报错 6.测试代码并优化 实现思路 地铁站的相关信息有线路,站点名称,是否开通,是否换乘. 线路编号 站点名称 是否开通 是否换乘 1 刘园

地铁线路项目简析

一.需求分析 依据日常使用来看,地铁线路问题有三个需求:    1.能显示地铁所有的线路.站点信息    2.找出指定地铁线路的所有地铁站    3.找出两个地铁站间最短路径包含换乘信息‘ 二.设计思路 (一)编程语言 本次编程决定使用Java语言来进行,因为比起C语言,Java语言更能通过外接函数库来实现一个软件应有的功能. (二)编程思路 通过构造一个类来保存站点信息 List<Station> linkStations; 可以选择通过Floyd算法或者Dijkstra算法,找到最短路径后

中小学生自动出卷系统——个人项目结对编程分析

在对刘同学的代码进行学习之后,结合我自己项目的开发经验,我尝试对其代码文件作出分析,希望能在过程中收获更多,取长补短. 优点: 代码的层次分明,贯彻了面对对象设计的理念,除主类外分为login.create.accounts三个类,对应了登陆,出题,账户三个在需求中的重点部分.把界面操作.数据处理和数据存储分离. 编程风格统一,函数命名符合规则,可以清晰分辨函数与变量,并从函数名或变量命直接联系到其作用与意义.代码注释清晰,简洁,有重点. 可扩展性,可复用性,可维护性强.代码功能基本上都集成在各

对于结对编程的理解

结对编程是极限编程(XP)的十二个实践之一,是指两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计.同一个算法以及同一段代码,并且两人的角色可以随时互换.XP认为结对编程能提高软件开发效率,很多国外软件企业都在热衷于结对编程,Facebook程序员肯特•贝克(Kent Beck)表示:“结对程序员之间的交流非常充分,你甚至可以再也不用言语进行交流.你只要简单描述再结合着手势就可以.”Grockit首席执行官罗伊•吉尔伯特(Roy Gilbert)表示,这种模式已经证明非常成功,他的程序员“正在

结对编程 地铁最短路径 张波-朱新远

结对编程 地铁最短路径 一.任务: 实现一个帮助进行地铁出行路线规划的命令行程序. PSP 2.1 Personal Software Process Stages Time Planning 计划     · Estimate   · 估计这个任务需要多少时间  7d Development 开发     · Analysis   · 需求分析 (包括学习新技术)  2d   · Design Spec   · 生成设计文档 1d    · Design Review   · 设计复审 (和同

结对编程项目-开发环境搭建过程

开发成员:2015035107169 焦广鑫 2015035107161 杜念泽 结对编程项目:四则元算器 这次我们开发的项目是四则运算器,用到的开发语言为python2.7,具体环境搭建链接为http://jingyan.baidu.com/article/eb9f7b6da950c4869364e8f5.html

结对编程项目——四则运算

1. 结对编程项目---四则运算 (10分) 基本功能要求: 1) 实现一个带有用户界面的四则运算.2) 生成的题目不能重复.3) 支持负数,例如-1,-1/2,-3‘4/5等.(达成) 需要支持的基本设定参数 1) 题目的数量  2) 数值的范围  3) 题目中最多几个运算符(目前没有达成)  4) 题目中或运算过程中有无有分数(比如进行整数除法的时候不能除尽) 5) 题目中是否有乘除法  6) 题目中是否有括号 (目前没有达成) 7) 题目中或运算过程中有无负数         学习感受: