解决问题的途径可以采用cppUnit单元测试框架。不过这里为了让学生能够对单元测试和单元测试框架有进一步的理解,我决定自己写一个类似cppUnit的简单的测试框架。
白盒测试实例之八——构建自己的单元测试框架(上)
在上一讲“单元测试的尝试”里我们遇到了几个问题:
1、代码重复的问题太多
2、测试结果需要人工去检查
3、对测试的总体信息也无从得知
本讲将构建一个简单的单元测试框架来解决以上的问题:
1、代码重复的问题太多
这个问题很容易解决,只需要把判断预期结果和实际结果的逻辑提取到某个函数中即可。从整个代码来看,有两种类型的结果的函数:
(1)返回布尔型
(2)返回整数
因此,需要两个类型的判断预期结果和实际结果是否相符的函数:
1. /*
2. * 判断是否取值为真
3. */
4. void assertTrue(char *msg, bool actual)
5. {
6. if(actual)
7. {
8. printf(".");
9. }
10. else
11. {
12. printf("F");
13. }
14. }
15.
16. /*
17. * 判断预期结果和实际结果是否相符
18. */
19. void assertEquals(char *msg, int expect, int actual)
20. {
21. if(expect == actual)
22. {
23. printf(".");
24. }
25. else
26. {
27. printf("F");
28. }
29. }
小知识:XUnit系列的框架的习惯使用assert*的命名来定义判断函数,对于通过的测试习惯打印一个“.”号,而对于失败的测试习惯打印一个“F”。
2、测试结果需要人工去检查
对于测试结果不要使用printf方式打印被测试函数的返回结果值就可以避免这个问题。
3、对测试的总体信息也无从得知
除了问题1的解决办法里使用“.”表示测试通过和“F”表示测试失败可以提高对测试结果的信息的直观性之外,做单元测试的人还希望能够得到以下的信息:
(1)执行的测试用例总数、通过的数量和失败的数量
(2)测试执行的时间
(3)如果测试用例执行失败了,希望知道是哪个测试用例失败,从而去分析失败的原因。
白盒测试实例之九——构建自己的单元测试框架(下)完整的源代码如下:
1、UnitTest.h
1. /*
2. * Copyright (c) 2008, 胡添发
3. *
4. * 简单的单元测试框架
5. *
6. */
7.
8. #include<stdio.h>
9. #include<string.h>
10. #include<time.h>
11. #include<stdlib.h>
12.
13. /*
14. * VC中没有sleep函数,自己写一个
15. * wait单位是毫秒
16. */
17. extern void sleep(clock_t wait);
18.
19.
20. /*
21. * 判断是否取值为真
22. */
23. void assertTrue(char *msg, bool actual);
24.
25. /*
26. * 判断预期结果和实际结果是否相符
27. */
28. void assertEquals(char *msg, int expect, int actual);
29.
30. /*
31. * 初始化测试,开始计时
32. */
33. void init();
34.
35. /*
36. * 结束测试,结束计时,打印报告
37. */
38. void end();
白盒测试实例之十——集成测试的概念
测一、桩模块和驱动模块(以C语言为例):
很多人对桩模块和驱动模块的概念会搞不清楚,下面先介绍这两个概念:
模块结构实例图: