美文网首页Spring cloudspringboot
SpringBoot--实战开发--整合Junit(七)

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

作者: 无剑_君 | 来源:发表于2019-05-06 14:35 被阅读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>
    

    相关文章

      网友评论

        本文标题:SpringBoot--实战开发--整合Junit(七)

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