JAVA-Web后端学习2 测试
有的时候真的很怀疑自己是否走在了正确的道路上,就像人们都以为自己在往左走其实不知不觉抄了右边的近路
测试
测试是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程
测试阶段划分为:单元测试→集成测试→系统测试→验收测试
测试方法分为:白盒测试,黑盒测试,灰盒测试
白盒测试,清楚代码内部结构和顺序逻辑,验证代码逻辑、结构正确性
黑盒测试,不清楚代码逻辑结构,关注代码的功能正确以及兼容性
灰盒测试,结合二者特点,既关注内部结构又关注外部表现
单元测试为白盒测试,集成测试为灰盒测试,而系统测试和验收测试均为黑盒测试
单元测试
进行单元测试,首先要在Maven中导入Junit依赖项

注意,导入之后一定要点击右侧的重新加载所有Maven项目 否则会报错
接下来,在与main同一级的test目录中编写单元测试方法
//UserService.java
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 ? "男" : "女";
}
}
//UserServiceTest.java
import com.itheima.UserService;
import org.junit.Test;
public class UserServiceTest {
@Test //使用@Test注解标记当前方法为测试方法
public void testGetAge(){
UserService userService = new UserService();
Integer age = userService.getAge("100000200806303015");//该方法为通过身份证号查询年龄
System.out.println(age);
}
}
执行测试查看测试结果(使用不同身份证号,其中有的身份证号存在错误)



其中Junit依赖存在命名规则
类:XxxxTest //规范,不必遵守
方法:public void xxx(){...} //规定,必须遵守
断言测试
测试不仅仅要关注结果正确,还要关注方法本身运行逻辑是否存在问题,而这就涉及到了断言测试
下面是常见的断言方法:

具体书写一个断言判断:
public class UserServiceTest {
@Test
public void testGetGender(){
UserService userService = new UserService();
String gender = userService.getGender("100000200806353015");
Assertions.assertEquals("男",gender,"性别获取有问题"); //判断gender是否等于"男",如果等于的话测试通过,否则报错
}
}
运行结果如下:

此时修改了代码逻辑,强行制造逻辑错误然后被断言捕获,结果如下:

如果抛出异常该如何处理,使用异常断言,来查看出现的是否是符合我们预期的异常
public void testGetGender(){
UserService userService = new UserService();
//IllegalArgumentException.class表示方法接收到了不合适或者不适当的参数
//我们给getGender方法传入null参数从而引发异常
Assertions.assertThrows(IllegalArgumentException.class,()->{
userService.getGender("null");
});
}
运行结果如下:

如果不是符合我们预期的异常:

通过断言可以判断方法运行是否和我们的预期一直,从而判断代码是否存在问题
Junit常见注解
Junit中提供了一些常见注解,用于增强其功能

示例代码:
@ParameterizedTest //参数化测试
@ValueSource(strings={"100000200805053013","100000200805053013","100000200805353013"}) //参数来源
public void testGetGender(String idCard) { //传递形参,形参取自于上一行的参数来源
UserService userService = new UserService();
String gender = userService.getGender(idCard);
Assertions.assertEquals("男",gender);
}
运行结果如下:

@DisplayName用作注解,解释类或者方法,例如:DisplayName("判断用户性别是否正确")
@BeforeEach,@BeforeAll常用于方法使用前的初始化动作
@AfterEach,@AfterAll常用于方法使用后的资源释放动作
覆盖率测试
覆盖率测试用于查验我们当前的测试针对被测试的代码中涉及到的分支与功能覆盖了多少
方法也就是被测试代码中涉及到的方法,行就是涉及到的代码行,分支也就是判断条件分支

通过在编辑配置选项中编辑我们要覆盖测试的软件包和类


浙公网安备 33010602011771号