美文网首页
单元测试

单元测试

作者: tanhua_badd | 来源:发表于2019-04-12 14:25 被阅读0次

单元测试是黑盒测试的基础,基本的准入测试,既能验证逻辑的准确性,又能给后续的接口重构提供基础

它最直接的好处:

  • 减少花在联调的时间

  • 提高代码质量

  • 减少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)

怎么写测试用例代码

  1. 语法规范

    1. 不要在junit使用System.out.print()方法

    2. 在junit使用debug级别日志输出

    3. 一般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层

难点

  1. 团队协同开发依赖其他模块,会导致模块全链路走不通情况

思想:利用 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);
    }
}

相关文章

网友评论

      本文标题:单元测试

      本文链接:https://www.haomeiwen.com/subject/kdjcwqtx.html