JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架。 主要被用来进行单元测试、白盒测试和集成测试。 本文主要介绍JUnit在SpringBoot中的使用
前提:加入JUnit 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
使用JUnit进行单元测试
1. 基本使用
加入依赖之后,只需要在src/test/java/ 目录下编写测试文件即可进行单元测试,如:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SimpleTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeClass ...");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is afterClass ...");
}
@Before
public void setUp() throws Exception {
System.out.println("this is before....");
}
@After
public void tearDown() throws Exception {
System.out.println("this is after....");
}
@Test(timeout = 1000)
public void test_method1() {
System.out.println("this is test method1 ...");
assertEquals(1, 1);
}
@Ignore
@Test
public void test_method2() {
System.out.println("this is test method2 ...");
String str = "hello";
assertEquals("hello", str);
}
}
其中:
- @RunWith(SpringRunner.class) 指定Case运行容器为SpringRunner,以便在测试开始的时候自动创建Spring的应用上下文。
- @SpringBootTest 表名是一个SpringBoot单元测试,主要用来获取启动类、加载配置,确定装载Spring Boot
- @Test 表示是一个测试Case。可以设置 timeout属性来设置Case超时时间,时间单位为毫秒:
- @BeforeClass:针对所有测试,只执行一次,且必须为static void;
- @AfterClass:针对所有测试,只执行一次,且必须为static void;
- @Before:每个测试方法前都会执行的方法;
- @After:每个测试方法前都会执行的方法;
- @Ignore:标注来忽略测试用例执行。@Ignore 用在方法上,则指定方法(Case)将不会被执行; 如果一个类用 @Ignore 注解了, 则他下面的所有测试方法将不会被执行。
2. 断言测试
断言测试也就是期望值测试,是单元测试的核心也就是决定测试结果的表达式,Assert对象中的断言方法:
- Assert.assertEquals 对比两个值相等
- Assert.assertNotEquals 对比两个值不相等
- Assert.assertSame 对比两个对象的引用相等
- Assert.assertArrayEquals 对比两个数组相等
- Assert.assertTrue 验证返回是否为真
- Assert.assertFlase 验证返回是否为假
- Assert.assertNull 验证null
- Assert.assertNotNull 验证非null
3. Web模拟测试
在Spring Boot项目里面可以直接使用JUnit对web项目进行测试,Spring 提供了TestRestTemplate对象,使用这个对象可以很方便的进行模拟请求。
Web测试只需要进行两步操作:
- 在@SpringBootTest注解上设置“webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT”随机端口;
- 使用TestRestTemplate进行post或get请求;
示例代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void getName() {
String name = restTemplate.getForObject("/name", String.class);
System.out.println(name);
Assert.assertEquals("Adam", name);
}
}
4. 数据库测试
在测试数据操作的时候,我们不想让测试污染数据库,也是可以实现的,只需要添加给测试类上添加**@Transactional**即可,这样既可以测试数据操作方法,又不会污染数据库了。 示例代码如下:
@Test
@Transactional
public void saveTest() {
User user = new User();
user.setName("Adam");
user.setAge(19);
user.setPwd("123456");
userRepository.save(user);
System.out.println("userId:" + user.getId());
Assert.assertTrue(user.getId()>0);
}
使用JUnit进行集成测试
在单元测试的基础上,可以将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。 使用JUnit进行集成测试一般引入failsafe plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<!-- use mvn integration-test -Dinstance.type=Memcache to pass command line param -->
<environmentVariables>
<instanceType>${instance.type}</instanceType>
</environmentVariables>
<!-- another way to pass command line param -->
<!--<systemPropertyVariables>-->
<!--<WSNSHELL_HOME>hello</WSNSHELL_HOME>-->
<!--</systemPropertyVariables>-->
<!--<!– Skips integration tests if the value of skip.integration.tests property is true –>-->
<!--<skipTests>${skip.integration.tests}</skipTests>-->
<includes>
<include>com/aliyun/open/api/redisa/TestSuites.class</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
- 组织集成测试Case
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
JUnitTestOne.class,
JUnitTestTwo.class
})
public class TestSuites {
@BeforeClass
public static void suitesSetup() {
log.info("suites setup ...");
}
@AfterClass
public static void suitesTearDown() {
log.info("suites teardown...")
}
}
- 运行测试集
# mvn integration-test -Dinstance.type=Memcache
mvn integration-test