1理论学习
1.1 慕课第三章学习
学堂在线3-1节:了解了Python中单元测试的基本概念,即对软件中最小可测试单元进行测定。程序员通过单元测试对自己代码质量进行基本承诺。单元测。试流程:模块接口-局部数据结构-边界条件-独立路径-出错处理。快速、独立、可重复,黑盒测试与白盒测试,单元测试需要借助PyUnit等框架工具编写测试代码,Mock测试可解决PyUnit无法解决的复杂测试。在代码的初期阶段单元测试的成本最低!
学堂在线3-2节:设计良好的测试用例,帮助理清头绪。测试程序是否满足相应需求:测试用例值-期望结果-前缀值-后缀值。以电话拨号为例进行了细致讲解。选用代表性数据进行测试,考虑错误及异常输入。黑盒测试只考虑输入输出。不考虑内部具体运行过程。等价类划分以更好进行测试,分为字符等价类、变量等价类、数组等价类等多种划分方式。故障往往在边界值附近出现,需要对边界值进行分析测试。
学堂在线3-3-1节:对白盒测试的概念有了进一步了解。测试需求、测试标准、测试覆盖、覆盖程度。以糖豆的示例进行测试需求分析,不同测试标准产生不同结果。白盒测试对所有结构路径及逻辑关系进行测试。控制流图是流程图的简化,该节采用实例对控制流图的形成进行了介绍与说明。
学堂在线3-3-2节:白盒测试以代码覆盖率为测试指标,该节对代码覆盖标准进行了介绍,起包括语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。该节通过一个简单的程序对代码覆盖测试进行了详细介绍,路径覆盖>判定覆盖>语句覆盖。
学堂在线3-3-3节:基本路径测试也是一种白盒方法,在控制流图基础上,通过分析控制构造的环路复杂性,到处可执行路径集合,来进行代码测试。该节仍采用程序实例进行介绍。独立路径寻找构成基本路径集,循环测试检查循环结构有效性。
学堂在线3-4节:本节讲述了单元测试工具及案例,单元测试工具unittest。TestCase类(测试用例,强大断言方法:如asserTrue、assertFalse、assertEqual、assertNotEqual、asserttls)、TestSuite类(测试套件)、TextTestRunner类(执行测试用例)、TestResult类(记录测试结果)、TestLoader类(加载测试)。Python3.3开始内置了mock工具包,可使用mock对象替代指定的python对象,进行模拟。setUp:创建每个测试方法都需要的公共对象;tearDown:销毁公共对象(如果需要的话),如数据库断开连接等
1.2《构建之法》讲义学习
本周进行了《构建之法》讲义中“两人合作”章节的学习,相关学习总结如下:
(1)代码规范与代码复审:团队合作能力,个人能力均需要过硬,但也需要团队的力量。讲义中先以一个较为杂乱程序代码实例引出代码规范对两人合作的重要性,接下来引出代码风格规范的相关具体要求,例如缩进、括号、行宽、分行、命名等。讲义之后继续引出代码规范设计的相关要求,对函数、goto、错误处理、类、析构函数、运算符、异常等进行了简要介绍。最后,讲义介绍了代码复审的重要性,强调代码复审对完善代码的巨大作用。
(2)结对编程:讲义中介绍了1987年, Intuit 公司中两名技术人员在不得已情况下进行的结对编程,由此开启了结对编程模式。讲义强调了结对编程对程序的完善与极限开发,更引申出当前越野赛车(驾驶,领航员)、驾驶飞机(驾驶,副驾驶)、战斗机的编组(长机,僚机)等行业均存在结对现象,并总结出共同点,即在高速度中完成任务,任务有较高的技术要求,任务失败的代价很高。讲义中对为什么要结对编程、不间断地复审进行了分节说明。并认为,结对编程是个渐进的过程,一个成功的软件团队, 成功的企业需要很多合作。最后,讲义以跳舞为例对两人合作的不同阶段进行了形象描述,突出了结对编程的规律。最后,讲义对两人合作过程中如何影响对方,达到相互提升进行了强调。
(3)给人提意见的方式送一个汉堡包:讲义以汉堡包为例对两人及团队合作进行介绍。在没有明显上下级关系中的两人合作中,需要“说服”的方式。在反馈中是两个人意识到对方的习惯,进而相互熟悉,促进团队有效性。讲义中说在给别人反馈的时候, 我们最想让别人接受的当然是最有营养的肉,但是光有肉,别人不好拿,也不好吃。我们要向做汉堡包、三明治的师傅们学习,即把反馈做成汉堡包。
(4)练习和讨论:讲义中以北京地铁路线图的搜索为题目进行结对编程练习。通过让学生题为自己在结对项目的案例和论文进行总结。性格对合作的影响、代码规范的重要性、代码复审的讨论表明结对编程的要求。同时,再次强调了结对编程对重要性。
1.3 对测试驱动开发的简要了解
测试驱动开发(Test-Driven Development,TDD)是一种不同于传统软件开发流程的新型的开发方法。其基本思想就是在开发功能代码之前,先编写测试代码,然后只编写使测试通过的功能代码,从而以测试来驱动整个开发过程的进行。这有助于编写简洁可用和高质量的代码,有很高的灵活性和健壮性,能快速响应变化,并加速开发过程。
当前,测试驱动开发的技术已得到越来越广泛的重视,但由于发展时间不长,相关应用并不是很成熟。现今越来越多的公司都在尝试实践测试驱动开发,但由于测试驱动开发对开发人员要求比较高,更与开发人员的传统思维习惯相违背,因此实践起来有一定困难。对其评价有正有负:
正面评价:①可以有效的避免过度设计带来的浪费。但是也有人强调在开发前需要有完整的设计再实施可以有效的避免重构带来的浪费。②可以让开发者在开发中拥有更全面的视角。
负面评价:①开发者可能只完成满足了测试的代码,而忽略了对实际需求的实现。有实践者认为用结对编程的方式可以有效的避免这个问题。②会放慢开发实际代码的速度,特别对于要求开发速度的原型开发造成不利。这里需要考虑开发速度需要包含功能和品质两个方面,单纯的代码速度可能不能完全代表开发速度。③对于GUI,资料库和Web应用而言。构造单元测试比较困难,如果强行构造单元测试,反而给维护带来额外的工作量。有开发者认为这个是由于设计方法,而不是开发方法造成的困难。④使得开发更为关注用例和测试案例,而不是设计本身。当前对于这个观点有较多的争议。⑤测试驱动开发会导致单元测试的覆盖度不够,比如可能缺乏边界测试。在实际的操作中,和非测试驱动开发一样,当代码完成以后还是需要补充单元测试,提高测试的覆盖度。
2 实践学习
通过查看Python编程基础知识电子书以及网络搜索单元测试相关知识,对第三章生命游戏程序实践进行了单元测试学习与实践。选择生命游戏程序中game_map.py中的接口编写测试用例。主要步骤参照mooc第3.4节并根据网络搜索学习进行测试程序的编写与分析,如下图:
对Game_map模块的相关说明为:rows,cols表示地图行数和列数;reset表示以一定概率设置地图每个格子的状态;get与set表示获取、设置地图某个格子的状态;get_neighbor_count表示获取一个格子的邻居数量;get_neighbor_count_map表示获取每个格子的邻居数量;set_map表示设置地图;print_map表示打印地图。创建测试类并运行测试如下图所示(测试代码码云链接为:https://gitee.com/yang_ke666/software_engineering):
测试程序编写完成后,需要利用Python代码程序覆盖测试工具对代码覆盖率进行检测。代码覆盖测试工具通过pip install coverage进行安装,然而安装过程中出现了无法安装的问题,通过网络搜索与实践未能圆满解决此问题,相关问题如下图所示:
通过转变思想,直接找到coverage所在路径(我的路径为D:\python_pycharm1\Scripts)对代码覆盖率进行测试来解决以上问题。利用coverage进行测试时,需要在路径(D:\python_pycharm1\Scripts)输入cmd命令进行coverage代码覆盖测试的运行!(同时需要将相关测试代码文件,如test_gameMap.py复制到上面路径下!否则找不到测试代码文件)相关运行说明详见https://www.cnblogs.com/zoro-robin/p/5612472.html。代码覆盖率测试运行结果如下图所示:
3 学习时间安排
2020.03.02:学堂在线3-1节、3-2节视频学习。
2020. 03.03:学堂在线及3-3节、3-4节视频学习,以及学堂在线第三章课后测试题完成。
2020. 03.04:《构建之法》讲义第三节“两人合作”的学习及关于测试驱动开发的网上搜索及阅读了解。
2020. 03.05:在网上下载关于python入门编程的讲解视频进行学习,并进行Python编程电子书学习。
2020. 03.06:Python编程电子书学习,python编程的讲解视频学习并开始课后作业题编程练习。
2020. 03.07:Python编程电子书学习,python编程的讲解视频学习并继续课后作业题编程练习。
2020. 03.08:课后作业题编程练习的完成,完成各项任务汇总并上传作业。