单元测试
- 白盒测试
- 单元测试框架Junit:
@Before, @Test, @After
,before和after在每个测试用例执行前都会被调用一次
- @BeforeClass, @AfterClass 只会在开始之前执行一次
- 如何对 Exception 进行测试
Assert.assertEquals(expected, actual);
Assert.assertTrue(condition);
Assert.assertNotNull(object);
Assert.assertArrayEquals(expecteds, actuals);
测试套件
@RunWith(Suite.class)
@Suite.SuiteClasses({
xxx.class,
xxx.class
})
public class AllTests {
}
使用Mock对象
- 真实对象不易构造,例如 HttpServlet 必须在 servlet 容器中才能创建出来
- 真实对象的有些行为难于触发
- 真实对象可能还不存在,例如依赖的另外一个模块还未开发完毕
- 使用:录制和回放
mockito
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.7.0</version>
<scope>test</scope>
</dependency>
处理遗留代码
- 确定要测试的类和函数
- 解除依赖
- 编写测试用例
- 重构代码
public class Account {
public void transfer() {
TransactionManager txManager = new TransactionManagerImpl();
txManager.begin();
// ...
txManager.commit();
}
}
// 重构 Refactor -> Extract Method
public class Account {
public void transfer() {
TransactionManager txManager = getTxManager();
// ...
}
private TransactionManagerImpl getTxManager() {
return new TransactionManagerImpl();
}
}
// 测试之前,创建一个子类,重写 getTxManager() 来提供一个 Mock 实现
Account account = new Account() {
@Override
protected TransactionManagerImpl getTxManager() {
return new MockTransactionManager();
}
};
account.transfer();
TDD
- 程序员的两个最基本技能:1. 写测试用例 2. 重构
- 任务分解,边界条件
网友评论