软件单元测试方法.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单元测试
� 什么是单元测试
� 单元测试是开发者编写的一小段代码,用于检验被测代码的 一个很小的、很明确的功能是否正确。 � 通常而言,一个单元测试是用于判断某Hale Waihona Puke Baidu特定条件(或者场 景)下某个特定函数的行为。 � 执行单元测试,是为了证明某段代码的行为确实和开发者所 期望的一致
� 为什么要使用单元测试
序言(3)
� 不写测试的借口
� � � � � � � � 编写单元测试太花时间了 运行测试的时间太长了 测试代码并不是我的工作 我并不清楚代码的行为,所以也就无从测试 这些代码都能够编译通过 公司请我来是为了写代码,而不是写测试 如果我让测试员或者 QA人员没有工作,那么我会觉得很内疚 我的公司并不会让我在真实系统中运行单元测试
� 范围
� 单元测试属于软件模块开发过程中的活动
提纲
1. 序言 2. 一个单元测试示例 3. 测试内容及方法 4. 边界条件 5. 单元测试工具 6. Mock对象 7. 好的测试品质 8. 在项目中进行测试
一个单元测试(1)
� 简单的例子:
查找list[]中的最大值:int Largest(int list[], int length);
一个单元测试(6)
� 其他考虑到的测试方法的尝试
� 存在重复的最大值的情况 [9,7,9,8] � 只有一个元素的情况 [1] � 全是负值的情况 [-9,-8,-7] � 编译源文件并运行修改后的测试,发现重复最大值和只有一个元素 的情况,测试都通过了。但是全是负值的情况出现了问题,如下:
一个单元测试(7)
序言(2)
� 两种不同的做法带来的两种不同的结果:
� 第一个开发者:期限的前一天,集成演示时,一点输出都没 有;利用调试器跟踪,经过长时间的琢磨,找到并纠正了这 个bug,但是,同时又发现了其他好几个 bug。结果,筋疲力 尽,而且未能及时完成任务。 � 第二个开发者:期限的前一天,集成代码到整个系统中,并 且能够很好的运行;虽然在其中也出现了一个小问题,但是 很对就发现了问题所在,并在几分钟之内就解决了这个问题。
� 计划你的测试
� 给定一个数组 [7,8,9],这个方法返回 9。这就构成了一个合 理的测试。 � 你能想出其他一些测试么?
�
如果list中有两个相等的最大值,将会出现什么情况? [7,9,8,9] → 9 如果list中只有一个元素,结果会是怎么样的呢? [1] → 1 如果list所包含的是负数,结果又会怎么样呢? [-9,-8,-7] → -7
� 首份实现代码如下:
int Largest(int list[], int length) { int i,max; for(i = 0; i < (length – 1); i ++ ) { if(list[i] > max) { max=list[i]; } } return max; }
一个单元测试(2)
� 如果数组为null,会出现什么情况? � 如果数组的长度为0,会出现什么情况? 通常,我们会认为这是一个错误,将抛出一个异常,修改方法: int Largest(int list[], int length) { int i, max; if ( list == null || length == 0) { return 0; } …… }
软件单元测试方法
提纲
1. 序言 2. 一个单元测试示例 3. 测试内容及方法 4. 边界条件 5. 单元测试工具 6. Mock对象 7. 好的测试品质 8. 在项目中进行测试
序言(1)
� 要向客户演示系统的基本功能,且临近最终期限时, 两个开发者的两种不同的做法:
� 第一个开发者:每天着急地写代码,写完一个类又写一个 类,写完一个方法又接着写两一个方法,有时不得不停下来 做一些调整,使得代码能够编译通过。 � 第二个模块者:写一个模块的时候,会附带写一个简短的测 试程序来测试这个方法。并且在未对刚写的方法做出确认 (通过测试确认之前的方法和他所期望的结果一致)之前, 是不会接着写新代码的。
� 第三次进行源文件被测试方法的bug查找与修改
� 为什么返回的最大值是 0,它是从哪里来的? � 看来用0来初始化max是个错误的做法 � 我们应该用 list[0]来作为max的初始值 � 修改过后,便以并重新运行该测试,结果也通过了该测试。
一个单元测试(8)
� 是否说明获取数组最大值的方法已经完全没有问题了 呢?
�
�
一个单元测试(3)
� 测试一个简单的方法
� 编写测试代码
TEST(CheckResult, Max_Int) { int list[] = {7,8,9}; CHECK(Largest(List, 3) == 9); }
� 编译结果如下
一个单元测试(4)
� 源程序中被测试方法的错误查找与修改
� 单元测试不但会使你的工作完成的更轻松,而且会令你的设 计变得更好,甚至大大减少你花在调试上面的时间。 � 单元测试可以提高底层代码的正确性,从而提高调用它的高 层代码的正确性。 � 使用单元测试这个简单有效的技术就是为了令代码变得更加 完美。
目的与范围
� 目的
� � � � � � 为了提高软件开发效率和质量 统一单元测试风格 保证文档与单元 测试编码的一致性 方便开发人员进行单元测试的开发 使单元测试能够有效正常的自动执行
� � � � 发现max值没初始化 然后进行修改并且设置 max的初始数值: max=0 重新编译并运行测试 测试运行结果如下:
一个单元测试(5)
� 再次进行源文件被测试方法的bug查找与修改
� 为什么返回的最大值是8,好像程序根本没有考虑list中的最 后一个元素似的。 � 查看源文件,发现for循环结束得早了。 � 修改:将for循环中i < length-1修改成为i < length � 编译源文件并运行该测试,程序将没有failure输出。
提纲
1. 序言 2. 一个单元测试示例 3. 测试内容及方法 4. 边界条件 5. 单元测试工具 6. Mock对象 7. 好的测试品质 8. 在项目中进行测试