在上周的软件工程课上,王老师讲到了要做软件单元测试的原因以及重要性。反观自己平时写程序的习惯,不禁觉得对这门课相见恨晚,从现在起养成对程序做单元测试的习惯,应该可以把编程的过程变得更加简单直接,快捷方便,有成就感吧。
首先把课堂笔记在此总结一遍。
一、何谓单元测试
单元测试对软件中的最小可测试单元进行检查和验证。是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致使用单元测试这个简单有效的技术就是为了令代码变得更加完美。
二、单元测试的目的
为了提高软件开发效率和质量
统一单元测试风格
保证文档与单元
测试编码的一致性
方便开发人员进行单元测试的开发
使单元测试能够有效正常的自动执行
三、由一个简单的例子练习单元测试
查找list[]中的最大值:int Largest(int list[], int length);
首份实现代码如下:
1 int Largest(int list[], int length) 2 { 3 int i,max; 4 for(i = 0; i < (length – 1); i ++ ) 5 { 6 if(list[i] > max) 7 { 8 max=list[i]; 9 } 10 } 11 return max; 12 }
编写一个程序对Largest函数进行测试,并写出所有的测试用例。
以下是对上述代码编写的简单的测试函数,忘了怎么用动态数组了,所以方法比较笨:
1 int main() 2 { 3 int j; 4 5 cout<<"请输入要比较的数的个数:"<<endl; 6 cin>>j; 7 cout<<"请输入要比较的数:"<<endl; 8 int length=j; 9 int a[100]; 10 for(int i=0;i<j;i++) 11 cin>>a[i]; 12 cout<<"最大值:"<<Largest(a,length)<<endl; 13 return 0; 14 }
测试用例:
首先可以看出在largest函数中max的值没有初始化,尝试对max进行赋值:int max=0;
1、顺序排列的正数:1,3,5,7,9
结果出错,检查largest函数,发现是for(i = 0; i < (length – 1);
i ++
)出了问题,for循环结束的早了,将本句改为:for(i = 0;
i < length ; i ++ )后,出现正确的结果。
2、含有相等的数:7,8,9,9
结果正确。
3、都是负数:-3,-7,-2,-9
可以看出结果出错,得出在largest函数中给max赋值为0是错误的,那么将max的值改为list[0]。在语句中改成:int max=list[0];
改正之后出现正确的结果。
4、正负混合并带有0:-1,0,0,4
测试结果正确。
5、只有一个数:2
6、输入0个数:
通常,我们会认为这是一个错误,将抛出一个异常,修改方法:
1 int Largest(int list[], int length) 2 { 3 int i, max; 4 if ( list == NULL || length == 0) 5 { 6 return 0; 7 } 8 …… 9 }
至此,我们可以认为已将其修改为一个正确的函数。
如下是对函数进行修改后的代码:
1 int Largest(int list[], int length) 2 { 3 int i; 4 int max=list[0]; 5 if ( list == NULL || length == 0) 6 { 7 return 0; 8 } 9 10 for(i = 0; i < length; i ++ ) 11 { 12 if(list[i] > max) 13 { 14 max=list[i]; 15 } 16 } 17 return max; 18 }
四、总结单元测试的内容
单元测试的对象:软件设计的最小单位——模块或函数
(1)输入数据和形参的定义是否一致;是否修改了只做输入用的形式参数;全局变量的定义在各模块中是否一致;……
(2)运算是否正确;逻辑是否正确;是否会产生死循环、不可终止的迭代;……
(3)在循环的第0次、1次、n次;运算或判断中取最大最小值时;输入参数的最大最小值;……
(4)局部变量类型是否正确;是否初始化了;错误的初始值或错误的默认值;……
(5)对错误条件的处理不正确;在对错误进行处理之前,错误条件已经引起系统的干预;模块是否能恢复正常;……
原文:http://www.cnblogs.com/wingwyy511/p/3587720.html