测试
- 测试:是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
- 阶段划分:单元测试(白盒)、集成测试(灰盒)、系统测试(黑盒)、验收测试(黑盒)。
单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。
JUnit:最流行的 Java 测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司提供)。
mian方法测试和JUnit单元测试的对比:
下面演示一下JUnit测试,引入一个简单的测试类UserService.java:
package org.example;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
public class UserService {
/**
* 给定一个身份证号,计算出该用户的年龄
* @param idCard 身份证号
*/
public Integer getAge(String idCard){
if (idCard == null || idCard.length() != 18) {
throw new IllegalArgumentException("无效的身份证号码");
}
String birthday = idCard.substring(6, 14);
LocalDate parse = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyyMMdd"));
return Period.between(parse, LocalDate.now()).getYears();
}
/**
* 给定一个身份证号,计算出该用户的性别
* @param idCard 身份证号
*/
public String getGender(String idCard){
if (idCard == null || idCard.length() != 18) {
throw new IllegalArgumentException("无效的身份证号码");
}
return Integer.parseInt(idCard.substring(16,17)) % 2 == 1 ? "男" : "女";
}
}
准备工作:在pom.xml中引入JUnit依赖:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
</dependency>
然后在test目录下编写一个测试类UserServiceTest.java:
package com.itheima;
import org.example.UserService;
import org.junit.jupiter.api.Test;
/**
* 测试类 UserserviceTest
*/
public class UserServiceTest {
@Test //@Test标记表示这是一个单元测试方法,运行测试时,JUnit会自动执行这个方法。
public void testGetAge(){
UserService userService=new UserService();
Integer age=userService.getAge("573910200009101038");
System.out.println(age);
}
}
运行结果:
断言:
当然,JUnit 提供了一些辅助方法,用来帮我们确定被测试的方法是否按照预期的效果正常工作,这种方式称为断言。
| 断言方法 | 描述 |
|---|---|
| Assertions.assertEquals(Object exp, Object act, String msg) | 检查两个值是否相等,不相等就报错。 |
| Assertions.assertNotEquals(Object unexp, Object act, String msg) | 检查两个值是否不相等,相等就报错。 |
| Assertions.assertNull(Object act, String msg) | 检查对象是否为 null,不为 null,就报错。 |
| Assertions.assertNotNull(Object act, String msg) | 检查对象是否不为 null,为 null,就报错。 |
| Assertions.assertTrue(boolean condition, String msg) | 检查条件是否为 true,不为 true,就报错。 |
| Assertions.assertFalse(boolean condition, String msg) | 检查条件是否为 false,不为 false,就报错。 |
| Assertions.assertThrows(Class expType, Executable exec, String msg) | 检查程序运行抛出的异常,是否符合预期。 |
注意:上述方法形参中的最后一个参数
msg,表示错误提示信息,可以不指定(有对应的重载方法)。
Assertions.assertEquals()断言测试:
@Test
public void testGenderWithAssert(){
UserService userService= new UserService();
String gender = userService.getGender("573910200009101038");
Assertions.assertEquals("男",gender); //Assertions.assertEquals(期望值,实际值,错误提示信息)
}
运行结果:
Junit常见注解:
在 JUnit 中还提供了一些注解,还增强其功能,常见的注解有以下几个:
| 注解 | 说明 | 备注 |
|---|---|---|
| @Test | 测试类中的方法用它修饰才能成为测试方法,才能启动执行 | 单元测试 |
| @ParameterizedTest | 参数化测试的注解(可以让单个测试运行多次,每次运行时仅参数不同) | 用了该注解,就不需要 @Test 注解了 |
| @ValueSource | 参数化测试的参数来源,赋予测试方法参数 | 与参数化测试注解配合使用 |
| @DisplayName | 指定测试类、测试方法显示的名称(默认为类名、方法名) | |
| @BeforeEach | 用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。 | 初始化资源(准备工作) |
| @AfterEach | 用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次。 | 释放资源(清理工作) |
| @BeforeAll | 用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。 | 初始化资源(准备工作) |
| @AfterAll | 用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。 | 释放资源(清理工作) |
代码演示一下:
@BeforeAll
public static void beforeAll() {
System.out.println("before All");
}
@AfterAll
public static void AfterAll() {
System.out.println("after All");
}
@BeforeEach
public void beforeEach() {
System.out.println("before Each");
}
@AfterEach
public void afterEach(){
System.out.println("after Each");
}
@Test
public void testGetAge() {
UserService userService = new UserService();
Integer age = userService.getAge("573910200009101038");
System.out.println(age);
}
@Test
public void testGenderWithAssert() {
UserService userService = new UserService();
String gender = userService.getGender("573910200009101038");
Assertions.assertEquals("男", gender);
}
运行结果:
@ParameterizedTest参数化测试:
@ParameterizedTest必须要和@ValueSource一起使用,如下:@ValueSource内的数据传参到下面方法体中的idCard中,表示有三个测试。
@DisplayName("测试用户性别") //显化测试
@ParameterizedTest
@ValueSource(strings= {"573910200009101038","194725490274628493","375920574625117476"})
public void testGetGender2(String idCard){
UserService userService = new UserService();
String gender = userService.getGender(idCard);
Assertions.assertEquals("男", gender);
}
运行结果: