Spring cloudspringboot

SpringBoot--实战开发--整合Junit(七)

2019-05-06  本文已影响39人  无剑_君

一、Junit简介

  JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。

  1. JUnit提供:
  1. 断言测试预期结果。
  2. 测试功能共享通用的测试数据。
  3. 测试套件轻松地组织和运行测试。
  4. 图形和文本测试运行。
  1. JUnit用于测试:
  1. 整个对象
  2. 对象的一部分 - 交互的方法或一些方法
  3. 几个对象之间的互动(交互)
  1. JUnit的特点
  1. JUnit是用于编写和运行测试的开源框架。
  2. 提供了注释,以确定测试方法。
  3. 提供断言测试预期结果。
  4. 提供了测试运行的运行测试。
  5. JUnit测试让您可以更快地编写代码,提高质量
  6. JUnit是优雅简洁。它是不那么复杂以及不需要花费太多的时间。
  7. JUnit测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
  8. JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件。
  9. Junit显示测试进度的,如果测试是没有问题条形是绿色的,测试失败则会变成红色。

二、添加Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

三、测试类基类

如果没有,我们自己创建一个,由于一个项目中我们会写很多很多测试类,而测试类上面是需要以下几个注解的,每建一个类都去补注解,太麻烦,我们就在这个类中加上注解,其他测试类直接继承这个类就好了:


测试类

import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
 
@RunWith(SpringRunner.class)
@SpringBootTest
//由于是Web项目,Junit需要模拟ServletContext,因此我们需要给我们的测试类加上@WebAppConfiguration。
@WebAppConfiguration
public class TmallApplicationTests {
 
    @Before
    public void init() {
        System.out.println("开始测试-----------------");
    }
 
    @After
    public void after() {
        System.out.println("测试结束-----------------");
    }
}

四、测试类

建一个测试类,继承基类,然后测试我service中的两个方法:


import com.alibaba.service.EntFileService;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
 
/**
 * Description:测试类
 */
public class EntFileTest extends TmallApplicationTests {
 
 
    @Autowired
    private EntFileService entFileService;
    //@Ignore("not ready yet")
    @Test
    public void testGetEntFileById(){
        Assert.assertSame("企业数量有误",500,entFileService.getCount());
    }
 
    @Test
    public void testGetEntFileList(){
        Assert.assertSame("企业数量不为10",10,entFileService.getEntFileList());
    }
}

如上,直接@Autowired引入你想测试的类就好,然后继承基类,测试方法上面要加@Test注解。
然后,第一个测试方法:我想测试一下企业数量是不是600,参数意义:
第一个参数:如果测试不通过,会抛出此消息,此参数可不要;
第二个参数:我预期的值,我这里希望他查出来的结果是600;
第三个参数:是实际的结果,就是我们调用方法返回的结果;

五、运行测试用例

运行有两种方法:
1.选中方法,右键,然后run 。。。;
2.点击方法前的小标;
具体操作如下截图:


运行测试用例

现在看运行结果,如下图:
区块一:这里是测试用例的执行结果,由于未获得预期结果,打印出了我们提前设置的错误信息。
区块二:这是测试用例的覆盖率,类的覆盖,方法的覆盖,行数的覆盖,非常详细。
区块三:此区块是预期结果和实际结果的详细对比,点击后才会显示,如图点击位置。


运行结果

六、打包测试

项目开发完后,我们写了100个测试用例类,我不能每个类都点击进去,然后慢慢执行,SpringBoot提供了打包测试的方式:我们用一个类,把所有的测试类整理进去,然后直接运行这个类,所有的测试类都会执行。
我这里建了两个测试类,分别是EntFileTest,EntFileTest2,现在我打包进TestSuits,让他们一次运行:

@Suite.SuiteClasses({EntFileTest.class,EntFileTest2.class})
打包测试
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
/**
 * Description:打包测试
 */
//@Ignore("not ready yet")
@RunWith(Suite.class)
@Suite.SuiteClasses({EntFileTest.class,EntFileTest2.class})
public class TestSuits { 
    //不用写代码,只需要注解即可
}

七、忽略方法

当我们一个测试类写了10个测试方法时,其中有1个我们暂时不想测,想跳过,但是其他9个我想一次运行,怎么办?这里有一个忽略注解,写在方法上,可以忽略这个测试方法,写在类上,可以忽略这个类。

import com.alibaba.service.EntFileService;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
 
/**
 * Description:测试类
 */
public class EntFileTest extends TmallApplicationTests {
     @Autowired
    private EntFileService entFileService;
 
    @Ignore("not ready yet")
    @Test
    public void testGetEntFileById(){
        Assert.assertSame("企业数量有误",600,entFileService.getCount());
    }
 
    @Test
    public void testGetEntFileList(){
        Assert.assertSame("企业数量不为10",10,entFileService.getEntFileList());
    }
}

此时,运行这个测试类,testGetEntFileById()方法就会忽略执行。

八、单元测试回滚

单元个测试的时候如果不想造成垃圾数据,可以开启事物功能,记在方法或者类头部添加@Transactional注解即可,如下:

@Test
@Transactional
public void add(){
    LearnResource bean = new LearnResource();
    bean.setAuthor("测试回滚");
    bean.setTitle("回滚用例");
    bean.setUrl("http://tengj.top");
    learnService.save(bean);
}

这样测试完数据就会回滚了,不会造成垃圾数据。如果你想关闭回滚,只要加上@Rollback(false)注解即可。@Rollback表示事务执行完回滚,支持传入一个参数value,默认true即回滚,false不回滚。
如果你使用的数据库是Mysql,有时候会发现加了注解@Transactional 也不会回滚,那么你就要查看一下你的默认引擎是不是InnoDB,如果不是就要改成InnoDB。
MyISAM与InnoDB是mysql目前比较常用的两个数据库存储引擎,MyISAM与InnoDB的主要的不同点在于性能和事务控制上。这里简单的介绍一下两者间的区别和转换方法:
MyISAM:MyISAM是MySQL5.5之前版本默认的数据库存储引擎。MYISAM提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。但不支持事务、也不支持外键。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
InnoDB:InnoDB是MySQL5.5版本的默认数据库存储引擎,不过InnoDB已被Oracle收购,MySQL自行开发的新存储引擎Falcon将在MySQL6.0版本引进。InnoDB具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。尽管如此,但是InnoDB包括了对事务处理和外来键的支持,这两点都是MyISAM引擎所没有的。
MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。(4)性能较好的服务器,比如单独的数据库服务器,像阿里云的关系型数据库RDS就推荐使用InnoDB引擎。

十、Maven跳过单元测试

-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。
一 使用maven.test.skip,不但跳过单元测试的运行,也跳过测试代码的编译。

mvn package -Dmaven.test.skip=true 
  1. 工具配置


    具体操作
    具体操作
  2. 使用Maven配置:

    <properties>
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
        <!-- maven方式跳过maven test, 等同$ mvn package -Dmaven.test.skip=true -->
    </properties>
上一篇 下一篇

猜你喜欢

热点阅读