1. 单元测试的基本点:
条件分支、循环处理和函数调用
2. 单元测试用例“输入数据”的种类:
被测试函数的输入参数;
被测试函数内部需要读取的全局静态变量;
被测试函数内部需要读取的成员变量;
函数内部调用子函数获得的数据;
函数内部调用子函数改写的数据;
嵌入式系统中,在中断调用时改写的数据
…
3. 单元测试用例“预计输出”的种类:
被测试函数的返回值;
被测试函数的输出参数;
被测试函数所改写的成员变量;
被测试函数所改写的全局变量;
被测试函数中进行的文件更新;
被测试函数中进行的数据库更新;
被测试函数中进行的消息队列更新;
…
4. 驱动代码,桩代码和 Mock
- 驱动代码用来调用被测函数,
桩代码和 Mock 代码是临时代码(用来代替被测函数所调用的真实代码)
- 驱动模块包括3个步骤:调用被测函数前的数据准备、调用被测函数、验证相关结果
- 桩代码:某个函数 A 的内部实现中调用了一个尚未实现的函数 B,为了对函数 A 的逻辑进行测试,那么就需要模拟一个函数 B,这个模拟的函数 B 的实现就是所谓的桩代码。
- 编写桩代码要遵守的3个原则:
① 桩函数要具有与原函数完全相同的原形,仅仅是内部实现不同,这样测试代码才能正确链接到桩函数;
② 用于实现隔离和补齐的桩函数比较简单,只需保持原函数的声明,加一个空的实现,目的是通过编译链接;
③ 实现控制功能的桩函数是应用最广泛的,要根据测试用例的需要,输出合适的数据作为被测函数的内部输入。
- Mock 代码和桩代码的本质区别:
测试期待结果的验证(Assert and Expectiation)。
5. 实际软件项目中单元测试的开展
- 只有底层模块或者核心模块的测试中才会采用单元测试。
- 确定单元测试框架的选型。
(Java 最常用的单元测试框架是 Junit 和 TestNG;C/C++ 最常用的单元测试框架是 CppTest 和 Parasoft C/C++test;)- 对桩代码框架和 Mock 代码框架选型,主要依据开发所采用的具体技术栈。
(通常单元测试框架、桩代码 /Mock 代码的选型工作由开发架构师和测试架构师共同决定。)- 引入计算代码覆盖率的工具(以衡量单元测试的代码覆盖率)。
Java 的 代码覆盖率统计工具有JaCoCo,JavaScript 的 Istanbul- 把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率。
最终以“单元测试通过率”和“代码覆盖率”为标准来决定本次代码递交是否能够被接受。
网友评论