本笔记主要来源于《单元测试的艺术》一书和本人些许经验
公众号,欢迎关注
什么是单元测试
没有人没做过单元测试
public class SimpleTest {
public static String hello(String name) {
return "Hello " + name;
}
public static void main(String[] args) {
System.out.println(hello("Ronnie"));
}
}
单元测试定义
- 一个单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个工作单元的单个最终结果的某些假设进行验证。单元测试几乎都是用单元测试框架编写的,能快速运行。单元测试可靠,可读,可维护。只要产品代码不发生变化,单元测试的结果是稳定的
集成测试,一般具有如下属性的,就认为是集成测试
- 时间长
- 不稳定
- 有外部依赖
单元测试的好处
- 可做开发文档
- 重构或修改代码更有信心
- 对自己的程序设计更清晰
测试的三种类型
- 测试返回值
- 测试系统状态改变
- 测试第三方调用
TDD开发流程
- 编写一个会失败的测试
- 编写符合测试预期的产品代码,使测试通过
- 写下一个测试或者重构代码
- 循环下去
不是所有的TDD都能成功,成功的TDD需要一下三种核心技能
- 知道如何编写优秀的测试
- 在编码前编写测试
- 良好的测试设计
单元测试框架
- 编写测试更容易
-
- 提供基础类和接口
- 含有代码级别的标记,用于标记测试方法的属性,@Test
- 提供断言类,用于验证代码
- 可以控制测试的执行策略
-
- 发现测试
- 自动运行
- 显示运行期间状态
- 用命令行自动话
- 显示更详细的运行结果
-
- 已运行测试数目
- 未运行测试数目
- 失败的测试数目
- 失败的原因
- ASSERT消息
- 失败的代码位置
- 异常信息
第一个单元测试
public class SampleTest {
@Test
public void testHello() {
//prepare
String expected = "Hello Ronnie";
//call
String result = Sample.hello("Ronnie");
//validate
assertEquals(result, expected, "not correct");
}
}
单元测试三段式
- 准备预期结果
- 调用测试方法
- 验证预期结果
单元测试核心技术
Mock/Stub
- Mock和Stub都是模拟对象
- Mock对象会使测试失败,测试时会对Mock对象进行断言
- Stub就是模拟对象的行为,不需要被测试
使用Stub破除依赖,使用Mock验证交互
Mock框架实例