软件工程练习:模块化,单元测试,回归测试,TDD

这是《构建之法》实战教学的一部分。适合作为同学们的第二个程序作业。

第一个程序作业: 请看 “概论” 一章的练习,或者老师的题目,例如这个。

作业要求:

软件工程的作业越来越有意思了, 我们在第一个作业中,用各种语言实现了一个命令行的四则运算小程序。 我们看看如果要把我们的小程序升级为能稳定运行,解决用户问题的软件,应该怎么做。

建议在做下面的题目的时候,采用结对编程的方式, 在练习中,让同学们学会模块化编程,信息隐藏,接口设计,TDD,等。

大家写了不少四则运算的练习,这些代码都各有特色,大家写的 “软件” 也有一定的用处。  如果我们要把这个功能放到不同的环境中去 (例如,命令行,Windows 图形界面程序,网页程序,手机App),  就会碰到困难,  因为目前代码的普遍问题是代码都散落在 main() 函数或者其他子函数中,我们很难把这些功能完整地剥离出来,作为一个独立的模块满足不同的需求。

我们看到,不同的代码解决不同层面的问题,有些是内部数据的计算 (例如四则运算);有些是和用户输入相关的 (例如 scanfcin,图形界面的输入输出),有些是和数据的展现相关的 (例如 printf coutprintln,DrawText),有些是和程序所在平台的架构相关的(例如 main 函数,程序倒计时的实现等)。 这就需要我们对软件的架构做一些整理和优化。

建议大家把四则运算的计算功能包装在一个模块中 (这个模块可以是一个类 Class,  一个DLL,等等), 为了方便起见,我们叫它 “计算核心” 模块, 这个模块至少在两个地方可以使用:

  1. 测试程序,这个可以是一个命令行的程序,或者是JUnit 的框架,或者是Visual Studio 单元测试的框架。这样,我们在算法层级保证了这个模块的正确性。

  2. 实际的软件,这是交付给最终用户的软件,有一定的界面和必要的辅助功能。

那么这个“计算核心”模块和使用它的其他模块之间是什么关系呢它们要通过一定的API (Application Programming Interface) 来和其他模块交流。 这个API 接口应该怎么设计呢?  (这是一个给有一定经验和实力的同学的题目), 为了简单,我们可以从下面的最简单的接口开始:

            Calc()

            这个Calc 函数接受字符串的输入(字符串里就是运算式子,例如 “ 5+3.5“  “7/8 – 3/8 ”  “3 + 90 * (-0.3)“  等等),这个模块的返回值是一个字符串,例如,前面几个例子的结果就是 ( 17.5“, “ 1/2”“-24“).

假设我们用的是类,我们的测试程序刚开始可以是非常简单的测试例子: (用伪代码表示)

            String  result  = Core.Calc(“1 + 1”) ;

            Assert ( result == “2”);  //我们断言 1 + 1 的结果一定是 2.

然后同学们实现自己 Core 的这个功能。

第一阶段目标 - 能把计算的功能封装起来,通过测试程序和API 接口测试其简单的加法功能。

加法成功之后,然后我们再做减法, 乘法,除法,我们假设目前为止都是两个操作数的运算,还是很容易实现的。 由于同学们已经在自己以前的程序中实现了各种算法,这时候只要把实现的算法搬过来就好了。 大家可以不断增加测试的数量,在每实现一个新的功能的时候,要保证以前运行正确的例子继续是正确的, 通过这样的 回归测试,  来保证自己实现的函数一直是正确的 (请看书中关于单元测试,回归测试的内容)

第二阶段目标 - 通过测试程序和API 接口测试其简单的加减乘除功能。并能看到代码覆盖率。  

然后,更欢乐的情况出现了, 多个运算符的运算,带负数的运算。

 啊,等一下,如果我们考虑这些情况的话, 我们这个模块有一些参数要设置,例如,最多几个运算符,能带括号么?数据范围是多少,还要设置计算的精度(保留几位小数,必须是用分数形式表示么,等等), 这是由什么API 来决定呢?   我们可以扩展 Calc() 的定义,让它接受一个新的参数 “precision”,  或者我们可以启用一个新的函数 Setting()。

如果我想表示:

    最多4 个运算符

    数值范围是 -1000 到 1000

    精度是小数点后两位

怎么通过API 告诉我们的模块呢?  我们当然可以用函数的参数直接传递,但是参数的组合很多,怎么定义好参数的规范呢?   建议大家考虑用 XML 来传递这些参数。

增加了新的Setting() 函数之后,我们要让模块支持这样的参数,同时,还要保证原来的各个测试用例继续正确地工作

第三阶段目标 - 通过测试程序和API 接口测试对于各种参数的支持。并能看到代码覆盖率。   

这个时候,如果输入是有错误的,例如 “1 ++ 2”, 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768 * 3”,  或者是 “ 248.04 / 0”  怎么办? 怎么告诉函数的调用者 “你错了”?  把返回的字符串定义为 “-1” 来表示? 那么如果真的计算结果是 “-1” 又怎么处理呢?

建议这个时候,我们要定义各种异常 (Exception), 让 Core 在碰到各种异常情况的时候,能告诉调用者 - 你错了! 当然,这个时候,我们同样要进行下面的增量修改:

  定义要增加什么功能 - 例如:支持 “运算式子格式错误” 异常

       写好测试用例,传进去一个错误的式子,期望能捕获这个 异常。 如果没有,那测试就报错。

       在 Core 模块中实现这个功能

       测试这个功能

       同时测试所有以前的功能,保证以前的功能还能继续工作 (没有 regression)

       确认功能完成,继续下一个功能

第四阶段目标 - 界面模块,测试模块和核心模块的松耦合。

既然各组各组同学都写了高质量的各个模块,而且模块之间的关系是明确定义的,一致的,那么,小组A 的测试模块就可以测试小组B 的核心模块;小组C 的用户界面模块就可以和小组B 的核心模块结合起来,正常运行。对吧?! 那我们就让两个小组 (A,B) 在一起,测试一下下面的情况:

      - A 的核心模块, 加上B 的测试模块和用户界面模块

      - B 的核心模块,加上A 的测试模块和用户界面模块

两组同学分析合并之后出现了什么问题,为何会出现这样的问题?如何改进?   并且改进各种模块中的 bug

(请看北航同学的作业心得:https://www.cnblogs.com/SivilTaram/p/4859934.html )

第五阶段目标 - 通过增量修改的方式,改进程序, 完成对各种错误情况的处理。

选择两组程序中高质量的模块,增加必要的功能,把所有代码签入源代码管理服务器, 同时,把这个软件发布出来。

(请看北航一个同学的尝试:https://www.cnblogs.com/skyxuan/p/4858486.html)

第六阶段目标 - 如何把这些模块重用到别的相关项目中去。

例如,现在大家要做一个 【24点游戏】:

有四个数字,通过加减乘除括号等四则运算,把四个数字组成一个算式,结果是 24。 这个游戏有两档难度,入门级:数字在 1..10 之间; 高级:数字在 1..99 之间

可用命令行或本地GUI 或 网页界面的方式实现这个游戏

我们要从头开始写所有的程序么?这个题目需要的一些功能和我们花了很长时间做的 “四则运算” 模块有不少类似之处, 那么,如何把现有模块经过少量的改动,快速地构建成为一个 24 点游戏所需的模块呢? 做到这些,并能总结一些规律,软件工程课程就有点摸到 “工程” 的边了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《构建之法》参考书和链接汇总

《构建之法》 参考书和链接汇总 参考书汇总 一些读者对《构建之法》引用过的参考书也感兴趣,因此我把所有参考书单独列出来。其实人大部分的思想都是受某些外部信息的启发影响而来,很多道理看似新颖,其实别人早就讲过了😀。这个参…

现代软件工程讲义 7 分析和设计方法

(这一节在第一版的 《构建之法》中没有, 是《构建之法》电子书(多看版), 和纸版书第二版中新增加的内容,纸版书第二版预计2015年6月出版) 11.1 分析和设计方法 我们写软件就是要解决用户的需求,我们需要表达和传递下面这些…

三周的 软件工程实践课 课程安排建议

不少学校想在暑期安排软件工程实践课, 在这么短的时间内要做到软件生命周期的完整体验是有很多挑战的,下面是一个建议: 软件工程课程设计 - 三周计划,10 次授课,10 次学生报告。 第一周,准备: 在…

现代软件工程讲义 源代码管理

【现代软件工程课件】 源代码管理 -- 以实践促进学习 移山软件学院的学生果冻问老师: 为啥需要源代码管理? 我自己写代码多爽,别人要,就用QQ 传过去好了。 老师问:原始人怎么建房子? 果冻:或者找一个洞&…

现代软件工程讲义 个人项目和结对项目练习 地铁

很多老师反映教软件工程和程序设计的时候没有合适的题目,《构建之法》提供了下面的题目,都是从简单的解题思路入手,逐步增量改进。学生们可以复习基本的编程技能,然后逐步加入模块化,文件处理,单元测试&…

最新软件工程总结,项目模板,软工作业下载

(改了标题吸引目标用户) 老师教课,学生上课,首先要讲明师生关系。 其次,就是要说明这门课的底线是什么。 我们假设所有人写作业都独立思考,认真实践,不断改进,勇于创新... 这个假设通常是不全面的&#xf…

C语言 教学实践建议

(编程/软件工程课程怎么教) 这是2016年秋季学期和北京工业大学耿丹学院合作教学的计划。这也可以用于其他学校的 C 语言课程。 2016级有四个班,每班大约 32 人,每班配有一个有一定实际工作经验的助教,配合老师把课教好。 C语言是一门基础课&…

团队项目建议 - 英语学习 App

在这几年推广《构建之法》软件工程教学的过程中,我看到很多老师在讲软件工程的时候,虽然讲了很多年,但是手头没有任何项目,学生或者现想(得到一些大而无当,无法在一学期内完成一个可用版本的项目), 或者抄袭…

结对和团队项目建议 - 黄金点游戏

故事看这里: 背景故事 (链接) 作业 这个游戏可以变成一个持续发展的团队项目: 1)在课堂上玩这个黄金点游戏,用Excel 纪录成绩。过渡到做成简单的单机版游戏,锻炼基本的编程能力 2)两人合作,做成简单的 client/server A…

个人和结对项目 - 英语单词词频统计

个人或结对编程项目 英语单词词频统计程序 (最新版本在这里) 实现一个命令行程序,支持几种模式下的单词词频统计 Implement a console application to tally the frequency of words under a directory. For all text files (file extension: "txt") unde…

个人或结对项目 - 动态显示程序运算的过程

现在网上有很多关于动态显示排序过程的小工具,小程序。 1) https://visualgo.net/sorting 2) http://jsdo.it/norahiko/oxIy/fullscreen 3) http://coolshell.cn/articles/4671.html 我们能否也做一些类似的工作呢? 在在这个作业中 (http:…

构建之法 第三版 17 章 部分草稿

构建之法 17 章  人&#xff0c;绩效和职业道德 (<构建之法> 第三版草稿) 2016/12/23 17.1 领导力 在软件开发过程中&#xff0c;有很多平等合作&#xff0c;但是也有上下之分的领导/被领导关系&#xff0c;即使都是平级的员工之间&#xff0c;也有老师傅/新人&#xf…

构建之法 第三版 第3章 部分草稿 (剪牦牛毛、老程序员去金融公司的故事)...

/* * 这是 《构建之法》 第三版的草稿 */ 3.2 软件工程中的几种思维误区 正如我们在第一章讲的那样&#xff0c;软件有很多特性&#xff0c;软件开发有它自己独特的规律&#xff0c;如果不了解这些特性&#xff0c;软件工程师就会产生不符合实际的想法&#xff0c;在开发过程中…

软件工程课的分数系统,和打分方法

考考考&#xff0c;老师的法宝&#xff1b;分分分&#xff0c;学生的命根。 以《构建之法》为核心的软件工程课已经在全国几十个学校开展了好几年&#xff0c;由于采用 Learning by doing (做中学) 的方法&#xff0c; 同学们通过实际的作业获得分数&#xff0c;逐渐累积并转换…

现代软件工程作业 – 计算最长英语单词链

结对编程 – 计算最长英语单词链 《构建之法》练习题 大家经常玩成语接龙游戏&#xff0c;我们试一试英语的接龙吧&#xff1a;一个文本文件中有N 个不同的英语单词&#xff0c; 我们能否写一个程序&#xff0c;快速找出最长的能首尾相连的英语单词链&#xff0c;每个单词最多只…

现代软件工程讲义 个人项目和结对项目练习 四则运算

这是构建之法 《现代软件工程》课的作业题之一。 下面的题目&#xff0c; 从简单的命令行处理和数据处理开始开始&#xff0c;让同学们逐步练习&#xff0c;巩固算法&#xff0c;学会松耦合的设计&#xff0c;学会PSP&#xff0c;源代码控制&#xff0c;单元测试&#xff0c;回…

软件工程作业 - word count

(编程和软件工程作业系列) 实践最简单的项目&#xff1a;WC 实践是理论的基础和验证标准&#xff0c;希望读者贯彻“做中学”的思想&#xff0c;动手实现下面的项目&#xff0c;并和别人的成绩相比较&#xff0c;分析产生差距的原因。 1. 实现一个简单而完整的软件工具(源程序特…

软件工程课, 编程课 助教的工作介绍

在用 "做中学 (Learning By Doing) " 方式讲授编程和软件工程课的时候&#xff0c;我们认为助教在其中起了很大的作用。 费曼学习方法的精髓是 “以教代学” 。如果不能向其他人简单地解释一件事&#xff0c;那么你就还没有真正弄懂它。 我们课程的各位助教&#xff…

软件工程资料 - 优秀的大学怎么教程序开发和软件工程课

他山之石&#xff0c;可以攻玉 世界上很多大学都有不错的教学方法&#xff0c; 例如我们曾经的助教总结他在国外的学习经历&#xff0c;可以看出老师和学校对于如何教好课是花了心思&#xff0c; 有很多投入的。 一门课怎么上&#xff1a; https://zhuanlan.zhihu.com/p/206103…

第二届构建之法论坛预告(草案)

(草案) 时间&#xff1a;2018年7月初 (暂定 7/9 - 7/11) 地点: 北京航空航天大学 活动&#xff1a;为期三天的软件工程教案设计培训和软件专业教育方法的讨论 时间内容工具备注第一天上午 1. 论坛主题演讲 “构建之法教学改进” 构建之法的教学是如何演进到目前的形态的&#x…