网页后端开发(基础2--maven单元测试)
测试
测试:是一种用来促进鉴定软件的正确性,完整性,安全性和质量的过程。
测试的阶段:
单元测试,集成测试,系统测试,验收测试。
单元测试:对软件的基本组成单位进行测试,是最小的测试单位。
目的:检验软件的基本组成单位的正确性
测试人员:开发人员
测试的方法:白盒测试
集成测试:将已通过单元测试的单元,按设计要求组合成系统或子系统,在进行测试。
目的:检查单元之间的协作是否正确。
测试人员:开发人员
测试的方法:灰盒测试
系统测试:对集成好的软件系统进行彻底的测试。
目的:验证软件系统的正确性,性能是否满足指定的要求
测试人员:测试人员
测试的方法:黑盒测试
验收测试:交付测试,针对用户需求,对业务流程进行正式的测试。
目的:验证软件系统是否满足验收的标准
测试人员:客户/需求方
测试的方法:黑盒测试
测试的方法:白盒测试,黑盒测试,灰盒测试
白盒测试:清楚软件内部结构,代码逻辑。用于验证代码,逻辑的正确性。
黑盒测试:不清楚软件内部结构,代码逻辑。用于验证软件的功能,兼容性等方面。
灰盒测试:结合了白盒测试和黑盒测试的特点,既关注软件的内部结构又考虑外部表现。
入门
main方法测试:
1.测试代码与源码不分离,难以维护。
2.一个方法测试失败,影响后面方法。
3.无法自动化测试,得到测试报告。
单元测试:针对最小的功能单元,编写测试代码对其正确性进行测试。
JUnit:最流行的Java测试框架之一,提供一些固定功能,方便程序进行单元测试
JUnit方法测试:
1.测试代码与源码分离,利于维护。
2.一个方法测试失败,不影响后面方法。
3.可根据需要进行自动化测试。
4.可自动分析测试结果,产出测试报告。
JUnit使用方法
1.在pom.xml中,引入Junit依赖。
<!--junit依赖--><!-- JUnit Jupiter API --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.1</version><scope>test</scope></dependency><!-- JUnit Jupiter Engine --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.8.1</version><scope>test</scope></dependency><!-- JUnit Platform Launcher --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-launcher</artifactId><version>1.8.1</version><scope>test</scope></dependency><!-- JUnit Jupiter Params --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.8.1</version><scope>test</scope></dependency>
2.在test/java目录下,创建测试类,并编写对应的测试方法,并在方法上声明@Test注解。
注:JUnit单元测试类名命名规范为:XxxxxTest。
JUnit单元测试方法,必须声明为public void xxx{}。
注:运行测试单元,测试通过为:绿色,测试失败为:红色。
断言
JUnit提供一些辅助方法,用来帮我们确定被测试的方法是否按照预期的效果正常工作,这种方式被称为断言。
Assertions.assertEquals(object exp,Object act)检查两个值是否相等,不相等就报错。
Assertions.assertNotEquals(object unexp,Object act)检查两个值是否不相等,相等就报错
Assertions.assertNuli(object act)检查对象是否为null,不为null,就报错。
Assertions.assertNotNul(object act)检查对象是否不为null,为null,就报错。
Assertions.assertTrue(boolean condition)检查条件是否为true,不为true,就报错
Assertions.assertFalse(boolean condition)检查条件是否为false,不为false,就报错。
Assertions.assertThrows(class expType,Executable exec)检查两个对象引用是否相等,不相等,就报错。
package com.itheima;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest; // 添加此行导入
import org.junit.jupiter.params.provider.ValueSource;public class UserServiceTest {//UserService 计算年龄@Testpublic void testGetAge() {UserService userService = new UserService();Integer age = userService.getAge("610125190511117117");System.out.println(age);}//计算性别@Testpublic void testGetGender() {UserService userService = new UserService();String gender = userService.getGender("610125190511117117");System.out.println(gender);}//断言@Testpublic void testGenderWithAssert() {System.out.println("断言gender是男");UserService userService = new UserService();String gender = userService.getGender("610125190511117117");Assertions.assertEquals("男",gender);}//断言@Testpublic void testGenderWithAssert2() {System.out.println("断言gender类型");UserService userService = new UserService();Assertions.assertThrows(IllegalArgumentException.class,()->{//期望异常userService.getGender(null);//实际异常});}
}
运行结果 :
总结:
在JUnit单元测试中,断言的作用:
单元测试方法运行不报错,不代表业务方法没问题。
通过断言可以检测方法运行结果是否和预期一致,从而判断业务方法的正确性使用方法:Assertions.assert****()
常见注解
常见注解:
@Test测试类中的方法用它修饰才能成为测试方法,才能启动执行
@ParmeterizedTest 参数化测试的注解(可以让单个测试运行多次,每次运行时仅参数不同)用了该注解,就不需要@Test注解了@DValueSource参数化测试的参数来源,赋予测试方法参数 ,与参数化测试注解配合使用
@DisplayName 指定测试类、测试方法显示的名称 (默认为类名、方法名)
@BeforeEach用来修饰一个实例方法,该方法会在每一个测试方法执行之执行一次,初始化资源(准备工作)
@AfterEach用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次,释放资源(清理工作)
@BeforeAll用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次,初始化资源(准备工作)
@AfterAll用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次,释放资源(清理工作)
注:
1.JUnit单元测试的方法,是否可以声明方法形参?可以的,参数化测试
@ParameterizedTest + @ValueSource
2。如何实现在单元测试方法运行之前,做一些初始化操作@BeforeEach、@BeforeAll
3,如何实现在单元测试方法运行之后,释放对应的资源?@AfterEach、@AfterAll
参数化测试:@ParmeterizedTest

依赖范围<scope>....</scope>
在maven项目中,test目录存放单元测试的代码,是否可以在main目录中编写单元测试呢?
可以,但是不规范
依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>..</scope>设置其作用范围
作用范围:
主程序范围有效。(main文件夹范围内)
测试程序范围有效。(test文件夹范围内)
是否参与打包运行。(package指令范围内)
<!--junit依赖--><!-- JUnit Jupiter API --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.1</version><scope>test</scope></dependency>
<scope>test</scope>
scope的值为test,测试程序范围有效。