目录
- 1. 什么是单元测试和JUnit
- 2. JUnit入门与基本注解
- 2.1测试类的定义:
- 2.2 生命周期注解:
- 2.3断言注解:
- 2.4 参数化
- 单参数
- 多参数
- 通过方法获取参数
- 2.5 测试套件
- 三.用到的依赖包
1. 什么是单元测试和JUnit
单元测试(Unit Testing)是对软件中的最小可测试单元进行检查和验证。它主要包括:
- 测试单元:软件中的最小可测试功能模块,如方法、类等。
- 测试用例:用于验证测试单元的输入、执行和输出是否正确的测试脚本。
- 测试套件:包含多个测试用例的集合。
JUnit是Java语言中最广泛使用的单元测试框架。它允许编写和运行可以重复执行的测试,并且可以自动化测试过程。
JUnit主要功能包括:
- 测试套件(Test Suite)控制多个测试用例;
- 断言(Assertions)验证测试结果;
- 设置超时时间;
- 忽略测试(Ignored Tests );
- 提供测试结果报告等。
JUnit是Java语言中最广泛使用的单元测试框架
2. JUnit入门与基本注解
2.1测试类的定义:
使用@Test注解标注测试方法
按照以往的经验,我们想运行一个程序必须在main方法运行,但是junit给了我们一个注解,我们只需要在方法上注解之后,就可以直接点击运行,以下是代码实例
@Test
public void Test01(){
System.out.println("这是第一个注解");
}
@Test
public void Test02(){
System.out.println("这是我们的Test02");
}
标识测试方法:@Test告诉JUnit这个方法是一个测试方法,需要运行并验证。没有@Test注解的方法不会被认为是测试方法,不会运行。
2.2 生命周期注解:
@BeforeAll,@AfterAll,@BeforeEach,@AfterEach
解释完@Test之后我们来看看这四个注解的意思,再看看他们的执行顺序,话不多说,我们直接上代码
public class JunitTest02 {
@BeforeAll
static void SetUp() {
System.out.println("这是我们BeforeAll里面的语句");
}
@AfterAll
static void TearDown() {
System.out.println("这是AfterAll的语句");
}
@BeforeEach
void BeforeEachTest() {
System.out.println("这是BeforeEach里面的语句");
}
@AfterEach
void AfterEachTest() {
System.out.println("这是AfterEach里面的语句");
}
@Test
void Test01() {
System.out.println("这是JunitTest里面的Test01");
}
@Test
void Test02() {
System.out.println("这是JunitTest里面的Test02");
}
}
执行结果:
具体的解释过程:
- @BeforeAll:在所有的测试执行之前执行一次
- @BeforeEach:每个测试方法执行之前执行
- 测试方法:test1()和test2()被执行
- @AfterEach:每个测试方法执行之后执行
- @AfterAll:在所有的测试执行之后执行一次
所以具体的生命周期如下:
BeforeAll在所有的测试用例运行之前跑对应的方法
BeforeEach在每一个测试用例执行之前跑对应的方法
AfterAll在所有的测试用例运行之前跑对应的方法
AfterEach在每一个测试用例执行之前跑对应的方法
2.3断言注解:
具体来解释一下:
在JUnit5中,断言(Assertions)注解用来验证测试结果是否正确。主要的断言注解有:
- @AssertEquals:判断两个对象或两个原始类型是否相等。
- @AssertTrue:判断给定的布尔值是否为 true。
- @AssertFalse:判断给定的布尔值是否为 false。
- @AssertNull:判断给定的对象引用是否为 null。
- @AssertNotNull:判断给定的对象引用是否不为 null。
- @AssertSame:判断两个对象引用是否指向同一个对象。
- @AssertNotSame:判断两个对象引用是否指向不同的对象。
具体例子如下:
@ParameterizedTest
@ValueSource(strings = {"null1"})
void Test02(String num){
Assertions.assertNull(num);
}
出现的运行情况
** @ParameterizedTest
// @ValueSource(ints = {1})注解提供测试参数1。
@ValueSource(ints = {1})
//方法Test01()有一个int类型参数num。由于@ParameterizedTest的存在,该方法会使用@ValueSource提供的测试参数1执行一次。
void Test01(int num) {
System.out.println(num);
/*
- assertEquals(1, num):判断num是否等于1,通过。
*/
Assertions.assertEquals(1, num);
}**
运行效果如下:
@ParameterizedTest
// @ValueSource(ints = {1})注解提供测试参数1。
@ValueSource(ints = {1})
void Test03( int num){
Assertions.assertNotEquals(1, num);
}
运行结果如下:
我这里只是列举了一些操作,大家可以下去自己尝试一下,看看其他的,是怎么样的情况.
2.4 参数化
单参数
这里我们使用但参数的引入注解是@ValueSource,下面就是这个参数的具体解释。
@ValueSource是一个JUnit的参数化测试注解。它允许使用不同的参数多次运行同一个测试方法。
基本用法是:
- 在测试方法上使用@ValueSource(ints = {…})注解,指定测试参数数组。
- 测试方法必须只有一个参数,这个参数会在不同测试 iterations 中使用 @ValueSource 指定的不同值。
- JUnit 会根据指定的参数数组,多次运行此测试方法,实现参数化。
具体的例子如下:
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void Test04(int num) {
System.out.println(num);
}
@ParameterizedTest
@ValueSource(strings = {"1", "2", "3"})
void Test05(String number) {
System.out.println(number);
}
多参数
我们使用csv的方式.
@CsvFileSource是一个JUnit的参数化测试注解,用于从CSV文件中读取测试参数.
具体的步骤如下:
- 创建一个CSV文件
- 在测试方法上使用@CsvFileSource注解,指定CSV文件的路径
具体例子如下:
//使用Csv文件
@ParameterizedTest
@CsvFileSource(resources = "test02.csv")
public void Test06(int id,String name){
System.out.println("学号:" + id + ",姓名:" + name);
}
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void Test07(String name){
System.out.println(name);
}
最终的输出结果:
test01和test02的内容格式如下:
其实大家看到上面的例子,或许大家还有一个东西没有明白,什么是.CSV文件,我这里来带大家认识一下:
什么是CSV?
CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 , 分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。
CSV文件的结构
每行表示一条记录:CSV 文件中的每一行代表一条记录,相当于数据库中的一行数据。
逗号分隔:每行数据中,使用逗号 , 进行数据分隔,代表不同的数据。
引号包围:当数据单元格中的内容含有逗号时,为避免混淆,需要引号 (单引号 ’ 或双引号 ")将这个数据包围起来,防止误认为是两个不同数据。
具体格式如下:
姓名,年龄,性别
张三,25,男
李四,28,男
王五,22,女
通过方法获取参数
在JUnit5中,@MethodSource注解用于从指定方法中获取测试参数。其基本用法如下:
- 定义一个返回Stream或Iterable的参数提供方法.
public static Stream<Arguments> Generator() {
return Stream.of(Arguments.arguments(
"1,张三",
"2,李四"
));
}
- 在测试方法上使用@MethodSource注解引用此方法
@ParameterizedTest
@MethodSource("Generator")
void Test07(String num, String name) {
System.out.println(num + ":" + name);
}
具体的运行结果:
- JUnit会调用stringProvider()方法获取参数,并使用这些参数重复执行testWithStringArgument()方法,实现参数化测试。
2.5 测试套件
测试套件(Test Suite)是一组组织在一起的测试案例。它允许您将单元测试组合在一起,以匹配整个功能或模块。
测试套件的主要优点是:
- 组织测试:可以按功能、类别等组织管理相关测试,提高可维护性。
- 批量执行:可以一次性执行套件中的全部测试,方便回归测试等场景。
- 层次清晰:套件可以嵌套套件,形成层次结构,mirror应用的结构。
- 管理测试顺序:可以控制套件中测试的执行顺序。
- 测试报告:套件执行会生成汇总报告,使得测试结果更加直观全面。
这里我们使用的是使用@Suite注解定义一个用于存储测试的容器类.
具体对@Suite做出解释:
@Suite是JUnit中的一个注解,用于定义测试套件。
具体的使用步骤:
1.加入@Suite注解
2.在类上添加@Suite.SelectPackages或者 @SelectClasses注解列出该套件包含的测试:
具体的包目录
具体的包里面的类
public class Test07 {
@Test
void Test007() {
System.out.println("Test08 pacage Test007");
}
}
public class Test09 {
@Test
void Test01() {
System.out.println("package test09 test01");
}
}
import org.junit.jupiter.api.Test;
public class JunitTest01 {
@Test
public void Test01(){
System.out.println("这是第一个注解");
}
@Test
public void Test02(){
System.out.println("这是我们的Test02");
}
}
这里提供俩种方式:
通过class运行测试用例
@Suite
@SelectClasses({JunitTest01.class})
public class RunSuite {
}
具体运行结果
通过包运行测试用例
@Suite
@SelectPackages(value = {"Test08","Test09"})
public class RunSuite {
}
具体的运行结果
三.用到的依赖包
<dependencies>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
</dependencies>