单元测试是黑盒测试的基础,基本的准入测试,既能验证逻辑的准确性,又能给后续的接口重构提供基础
它最直接的好处:
-
减少花在联调的时间
-
提高代码质量
-
减少bug,快速定位bug
-
放心地修改、重构
-
显得专业
然后我们来举个例子,假设我们有个 add(a, b) 函数:
public int add(int a,int b){
return a+b;
}
JUnit 测试函数:
@Test
public void testAdd(){
Assert.assertEquals(3,add(1,2));
}
你传入参数,调用 add 函数,然后很快能得到结果,对比期望值就能知道函数功能是否正常。这种验证方式叫做状态验证(state verification)
怎么写测试用例代码
-
语法规范
-
不要在junit使用System.out.print()方法
-
在junit使用debug级别日志输出
-
一般junit都是验证数据所以大部分都是使用Assert来判断数据的正确性
-
怎么做层级测试
1.dao层
难题:在测试单测环境数据库的前提下,写DAO层的单元测试时,往往测试用例所依赖的数据库数据被修改或删除了,或者在一个新的环境下所依赖的数据库不存在,导致单元测试无法通过,进而构建失败。
思想:使用H2内存数据库来模拟数据库环境是一个很好的解决方案
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:db/schema.sql" />
<jdbc:script location="classpath:db/data.sql" />
</jdbc:embedded-database>
其中schema.sql存放的建表sql,data.sql存放的是数据准备sql,依赖具体业务表和数据
@Test
public void insertTest() {
ActTemplateItem actTemplateItem = getActTemplateItem();
long row = actTemplateItemMapperExt.insertSelective(actTemplateItem);
Assert.assertEquals(1, row);
}
2.service层
难点:
- 团队协同开发依赖其他模块,会导致模块全链路走不通情况
思想:利用 Mock 对象的测试叫做行为(behavior verification)具体使用语法
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@Mock
private SSOFacade ssoFacade;
@Test
public void listByTemplateIdTest() {
when(ssoFacade.ssoUserById("110")).thenReturn(new User());
Assert.assertTrue(ssoFacade.ssoUserById(100) != 2);
}
}
网友评论