一 要求:
1、在个人电脑中安装一个集成开发环境(Microsoft Visual Studio、Eclipse或其它工具均可),要求该环境能够提供单元自动测试功能;
2、记录安装过程,并将全部内容发表在博客中;
3、实现最大子数组和算法,并将该段代码上传至Coding.net系统中;
4、自行选择合适的覆盖标准并设计测试用例对该段代码进行测试,并将测试结果发布在博客中,结果以如下表格形式完成。
二 解答:
可以看出在本项目中需求不会更改,而且执行流程固定,参考《软件测试》和《构建之法》选择选用瀑布模型是最好的。(计划一周(5天)时间完成)
如下图:
1、分析(与设计一起花了3天)
1 要求分析
根据要求(需求),首先要有集成开发环境,而且开发环境要有单元测试功能;其次要把安装过程记录下来;然后用集成开发环境开发一个实现最大子数组的程序,并把代码上传到Coding.net系统中;最后测试,发表Blog。
2 程序算法分析
实现最大子数组,大致可以分为2种情况:第一种,有负数;第二种,没有负数。
第一种,有负数。即数组中没有负数或者负数个数最少的子数组就是数组的最大子数组。比如-1,-2,0,3,4。最大子数组就是3,4,0。
第二种,没有负数。即数组本身就是数组的最大子数组(包含0)。
2、设计(与分析一起花了3天)
1 通过以上分析,做出如下设计:
思维导图连接地址:https://www.processon.com/mindmap/57ecd006e4b0300f4fc04a3c
2 由于早前就已经安装了VS,所以安装省略。安装过程省略。
3 实现最大子数组的算法:
首先,通过程序算法分析可以知道,程序的重点在于有无负数,也就是说只要数组中数的和在减少(相比较于在加这个数之前有减少)就说明这个数是负数,从这个负数不鞥呢放入最大子数组中,也就是说求最大子数组的程序主要是为了判断负数(正数和0一定在最大子数组内)。如下图所示:
4 模拟实现过程
好了,整理思路。
第一步,得到一个数组(很多数);
第二步,把数组的数进行排序,从大到小或者相反;
第三步,从最大的数开始,依次求和,若和相较于之前的和减小了就不能放入子数组中,否则放入子数组中;(第一次的和为最大数本身,及最大子数组最少有一个数就是最大的数)
第四步,输出最大子数组。
3 编码(一天不到包含调试)
1 函数调用关系:
连接:https://www.processon.com/diagraming/57f1f8bee4b0300f4fd8fbe7
2 代码
链接:https://coding.net/u/SchopenhauerZhang/p/softwareEnjeering/git/blob/prcticesone/092800.cpp
4测试(包含写Blog接近2天时间)
1 测试分模块进行:
测试只要以条件判定和路径判定为主。
1 排序函数:
由于采用倒叙,即最大数在最前面(角标为0)。所以最为理想的数据为完全倒叙的数据如:1 2 3 4 4 5 6 6等
2 赋值函数:
由于用户输入的数据的顺序最好不变(以免对用户的数据产生影响),用牺牲空间的方法把用户的数据复制到一个新建的数组中,在新建的数组中进行操作。
数据如 1 2 3等
3 比较函数:
由于是求和比较,即,把之前得到的和和现在的数相加,如果得到的和不比之前的和小就返回1,否则返回0.数据如:4 3,3 4,4 4.
4 流程控制函数:
输入0结束,否则继续输入,输入的提示数字与输入的数据之间没有关系,即输入数之前输入一个数提示你要输入数。
5 遍历函数:
需要与比较函数一起测试。 (见比较函数)
2 总体测试:
1 测试归纳:
总体代码拼接时有一些不该出现的错误,比如代码的遗漏和代码拼接时的符号错误。
2 总体测试:
5 分析与评价
1 由于第一次接触软件测试,参考了《构件之法》和《软件测试》2本书,感觉不是很理解,深受以前的毒害,编写边测试,摸索着用到了瀑布模型,尝试了单元测试和增式测试2种测试方法。
先根据设计,逐步完成各个模块。对每个完成的模块进行测试,测试完成后在开始下一模块。
最后整体所有模块完成后,在进行拼接,总体测试。
测试中白盒测试感觉不是很到位,总感觉有问题,但是找不出来。希望是多虑了!
2 本程序最大的问题是效率。
构造函数要对所有使用的数组进行初始化,也就是说,在程序使用前,要对201个数的空间进行初始化,花费了大量的时间。
其次是排序方法的使用,冒泡排序的效率感觉不是很好。当然本程序感觉使用冒泡排序是最恰当的。比如比较2个数花费的时间是x;总共Y个数。那么冒泡排序花费的最大时间总共约为:(Y-1)!*x.这里x很小舍去,即为(Y-1)!。也就是说随着数的格式的增加,时间的花费是巨大的。此处应有质疑!个人认为应该选取更好的排序方法。
测试用例比较少,主要还是个人想不出较好的测试数据。举个例子:1 2 3与1 2 3 4 5 6 7 ,,,;的测试效果是一样的,也就是说,不考虑时间成本的话每种情况的测试数据只需要一个就足够了,测试结果与数据的长度无关(不超过最长数据长度)。而且测试用例之间有包含关系。比如排序函数的测试 1 2 2 3 4 4,这组数据包含了1 2 3 4 与 2 2 3 44.也就说这组数据测试了排序的最坏情况还测试了相同数的排序。这个时候一组数据比2组数据好(人为输入数据也是要成本的)。
3 算法优化
最后就是算法优化,其实在分析程序算法的过程中就可以发现。当数组排序后最大的数是负数或者0时,最大子数组就可以直接得到了---最大的数,只有当最大的数是正数时才需要进行遍历相加。所以可以在遍历函数中加判定条件,判断最大数是否是正数,不是就可以直接得出最大子数组---最大数。否则遍历求解。