必威体育Betway必威体育官网
当前位置:首页 > IT技术

单元测试规范

时间:2019-09-20 20:10:00来源:IT技术作者:seo实验室小编阅读:52次「手机版」
 

单元测试规范

文章目录

    • 背景
    • UT规范
      • 1.DAO层
      • 2.Service层
        • 2.1 方式一
        • 2.2 方式二(推荐)
      • 3.接入Jacoco插件
      • 4.接入Jenkins

背景

UT的作用:

  • 减少花在联调的时间
  • 提高代码质量
  • 减少bug,快速定位bug
  • 放心地修改、重构
  • 显得专业

UT规范

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. UT全走通全链路,但不依赖第三方库(其他服务和第三方平台
  2. 养成测试驱动开发的好习惯
  3. 整个打包过程的性能

2.1 方式一

思想:外部依赖全部mock,只测试方式本身的业务逻辑

示例

@RunWith(MockitoJUnitRunner.class)
public class ActTemplateItemServiceTest {
 
    @InjectMocks
    private ActTemplateItemServiceImpl actTemplateItemService;
 
    @Mock
    private ActTemplateItemMapperExt actTemplateItemMapperExt;
 
    @Test
    public void listByTemplateIdTest() {
        ActTemplateItem actTemplateItem = ActTemplateItembuilder.buildActTemplateItem();
   when(actTemplateItemMapperExt.selectByTemplateId(any())).thenReturn(Lists.newArrayList(actTemplateItem));
 
        List<ActTemplateItemDTO> result = actTemplateItemService.listByTemplateId(1L);
        Assert.assertEquals("34", result.get(0).getBrandPageId());
    }
}

优点:(1)轻量级 (2)最小单元测试

缺点:(1)无法激起开发人员写UT心情 (2)无法测试整个方式链路的情况,易忽略特殊情况

2.2 方式二(推荐)

思想:增加unittest环境(目前配置环境和test共用一套,日后可单独配置并去除无用配置),走通单元测试方式全链路,依赖的第三方库采用mock方式,自己的内部Service及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>
public class ActTemplateItemServiceTest extends AbstractBaseTest {
 
    @Autowired
    private ActTemplateItemServiceImpl actTemplateItemService;
 
    @Mock
    private ItemAdapter spyItemAdapter;
 
    @Autowired
    private RedisService redisService;
 
    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(spyItemAdapter);
 
        ReflectionTestUtils.setfield(actTemplateItemService, "itemAdapter", spyItemAdapter);
 
        Mockito.when(spyItemAdapter.listItemFrontPrimaryCategory()).thenReturn(getCategoryList());
    }
 
 
    @Test
    public void listByTemplateIdTest() {
        List<ActTemplateItemDTO> result = actTemplateItemService.listByTemplateId(1L);
        Assert.assertEquals("https://mall.hipac.cn/ytms/page/kqfsms_h5.html", result.get(0).getBrandPageId());
    }
 
    @Test
    public void listItemPrimaryCategoryTest() {
        RedisKeyUtils.RedisKey key = RedisKeyUtils.getItemCategoryListKey();
        redisService.del(key.getKey());
        List<ItemFrontPrimaryCategoryDTO> result = actTemplateItemService.listItemPrimaryCategory();
        System.out.println(result);
        Assert.assertEquals(2, result.size());
    }
 
    private List<ItemFrontPrimaryCategoryDTO> getCategoryList() {
        List<ItemFrontPrimaryCategoryDTO> categoryList = Lists.newArrayList();
 
        ItemFrontPrimaryCategoryDTO categoryDTO1 = new ItemFrontPrimaryCategoryDTO();
        categoryDTO1.setPrimaryCategoryId(1L);
        categoryDTO1.setPrimaryCategoryName("尿不湿");
        categoryList.add(categoryDTO1);
 
        ItemFrontPrimaryCategoryDTO categoryDTO2 = new ItemFrontPrimaryCategoryDTO();
        categoryDTO2.setPrimaryCategoryId(2L);
        categoryDTO2.setPrimaryCategoryName("婴儿车");
        categoryList.add(categoryDTO2);
 
        return categoryList;
    }
}

优点:(1)便于发现测试方法的问题(2)刺激开发人员写单元测试的激情

缺点:(1)需要加载整个启动环境(2)当单元测试较多的时候,整个打包过程时间会变长(耗费性能点在于sql执行,日后可mock Dao层数据)

3.接入Jacoco插件

<!-- jacoco plugin -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.9</version>
    <executions>
        <execution>
            <!--
            在maven的initialize阶段,将Jacoco的runtime agent作为VM的一个参数
            传给被测程序,用于监控JVM中的调用。
            -->
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <destFile>
                    ${project.build.directory}/coverage-reports/jacoco.exec
                </destFile>
                <propertyName>surefireArgLine</propertyName>
            </configuration>
        </execution>
        <!--
        在程序的verify阶段,执行report测试的程序。
        文件的输入为perpare-agent阶段中设置或者默认的jacoco.exec.
        参数 includes和excludes可用来选定report中过滤的类。
        -->
        <execution>
            <id>default-report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
                <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

4.接入Jenkins

不再详情介绍。

在这里插入图片描述

相关阅读

新医改持续推进,电子签名成电子病历规范应用管理“标尺

电子病历应用成效自2010年初《电子病历基本规范(试行)》(简称《基本规范》)发布以来,各省市积极开展电子病历试点工作。据不完全统计,电

九钻网CEO爆钻石业黑幕 称急需行业规范

赛迪网讯2月19日消息,&ldquo;网上卖钻石在几年之前还是天方夜谭,到现在来说已经见怪不怪了,这几年网上购钻石发展非常快,我们可以预见

小源科技:保护企业私域流量价值,共促行业监管与规范

7月30-31日,2019国际虚拟运营大会暨中国增值电信业务高峰论坛在北京举行。本次活动主要围绕产业链各方在MVNO、物联网、增值电信生

ODBC接口规范

https://blog.csdn.net/df_xiao/article/details/40511149 第1章     ODBC API基础 1.1 ODBC API句柄 ODBC API 实现数据

CSV格式规范(解析CSV必备)

转自: https://blog.csdn.net/woaixiaoyu520/article/details/78455650

分享到:

栏目导航

推荐阅读

热门阅读