一、Junit简介
JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。
- JUnit提供:
- 断言测试预期结果。
- 测试功能共享通用的测试数据。
- 测试套件轻松地组织和运行测试。
- 图形和文本测试运行。
- JUnit用于测试:
- 整个对象
- 对象的一部分 - 交互的方法或一些方法
- 几个对象之间的互动(交互)
- JUnit的特点
- JUnit是用于编写和运行测试的开源框架。
- 提供了注释,以确定测试方法。
- 提供断言测试预期结果。
- 提供了测试运行的运行测试。
- JUnit测试让您可以更快地编写代码,提高质量
- JUnit是优雅简洁。它是不那么复杂以及不需要花费太多的时间。
- JUnit测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
- JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件。
- 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
-
工具配置
具体操作
具体操作 -
使用Maven配置:
<properties>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
<!-- maven方式跳过maven test, 等同$ mvn package -Dmaven.test.skip=true -->
</properties>
网友评论