目录
配置文件
注解
@Test 标注测试方法
@BeforeAll 和 @AfterAll 标注在测试之前和之后执行的方法
@BeforeEach 和 @AfterEach 标注在每条测试之前和之后执行的方法
@TestMethodOrder 和 @Order(优先级) 标注测试方法的执行顺序
@ParameterizedTest 将测试方法参数化
@ValueSource 单参数
@CsvSource 多参数
@CsvFileSource 通过文件传递多参数
@MethodSource 通过方法传递多参数
@Suite 测试套件(管理测试顺序)
@SelectClasses 管理测试类的执行顺序
@SelectPackages 管理包的执行顺序
断言
Assertions 类实现断言
执行 JS 脚本
配置文件
要想使用 Junit 进行单元测试需要引入以下第三方库:
引入后可以使用 @Test,@BeforeEach等注解
<!-- 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>
<scope>test</scope>
</dependency>
引入后可以进行”参数化“
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
引入后可管理测试用例,如 @Suite
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<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.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
注解
@Test 标注测试方法
public class JunitTest {
@Test //标注下面的方法是测试方法
public void test01(){
System.out.println("==========这是第一个测试用例==========");
}
@Test
public void test02(){
System.out.println("==========这是第二个测试用例==========");
}
}
@BeforeAll 和 @AfterAll 标注在测试之前和之后执行的方法
@BeforeAll
static void Start(){
System.out.println("********** 测试开始 **********");
}
@AfterAll
static void End(){
System.out.println("********** 测试结束 **********");
}
@BeforeEach 和 @AfterEach 标注在每条测试之前和之后执行的方法
@BeforeEach
public void startEach(){
System.out.println("********** 测试开始 **********");
}
@AfterEach
public void endEach(){
System.out.println("********** 测试结束 **********");
}
@TestMethodOrder 和 @Order(优先级) 标注测试方法的执行顺序
如下代码设置 test01 的执行优先级为 2 小于 test02 的执行优先级 1,所以 test02 测试方法先执行,其次才是 test01 方法
// @TestMethodOrder 指定用哪个方法来进行测试方法排序
//MethodOrderer.OrderAnnotation.class 表示用注解排序测试方法
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
//设置测试方法执行的优先级,2 的优先级小于 1
@Order(2)
//标注下面的方法是测试方法
@Test
public void test01(){
System.out.println("==========这是第一个测试用例==========");
}
@Order(1)
@Test
public void test02(){
System.out.println("==========这是第二个测试用例==========");
}
}
@ParameterizedTest 将测试方法参数化
注意:使用 @ParameterizedTest 注解就已经代表该方法是一个测试方法,不需要再使用 @Test 方法,否则会报错
@ValueSource 单参数
如下代码,会依次将 @ValueSource 注解中定义的整数作为参数依次传入 test03 方法中
//将测试方法参数化
@ParameterizedTest
//设置参数的数据源,只支持一个参数
@ValueSource(ints = {1,2,3,4})
public void test03(int x){
System.out.println(x);
}
@CsvSource 多参数
如下代码,会依次将 @CsvSource 注解中定义的多组数据作为参数依次传入 test04 方法中
@ParameterizedTest
//设置参数的数据源,支持多个参数
@CsvSource({"雨林, 20","小菊,22"})
void test04(String name,int age){
System.out.println("name:"+name+" age:"+age);
}
@CsvFileSource 通过文件传递多参数
test05.txt 文件内容
张三,28
李四,19
王五,20
如下代码,以 test05.txt 文件中的数据作为参数,传入 test05 测试方法中
@ParameterizedTest
//通过文件传递多参数
@CsvFileSource(resources = "test05.txt")
void test05(String name,int age){
System.out.println("name:"+name+" age:"+age);
}
注意,如果该测试方法在包中,那么 test05.txt 文件也要放到相同名称的包中
如下图,测试方法在 example 包中
将 test05.txt 文件放到 resources 的 example 包中
@MethodSource 通过方法传递多参数
如下代码,以 Generate 方法中定义的数据作为参数,传入 test06 测试方法中
@ParameterizedTest
//通过方法传递参数
@MethodSource("Generate")
void test06(String name,int age){
System.out.println("name:"+name+" age:"+age);
}
Generate 方法
public static Stream<Arguments> Generate() {
return Stream.of(Arguments.arguments("张三",18),
Arguments.arguments("李四",20));
}
@Suite 测试套件(管理测试顺序)
测试套件,用于管理测试顺序(有许多类和包都用于测试,要管理它们的执行顺序)
@SelectClasses 管理测试类的执行顺序
//测试套件,用于管理测试顺序(有许多类和包都用于测试,要管理它们的执行顺序)
@Suite
//管理测试类的执行顺序
@SelectClasses({JunitTest.class,JunitTest1.class})
public class RunTest {
}
如下图,先执行 JunitTest,再执行 JunitTest1
@SelectPackages 管理包的执行顺序
//测试套件,用于管理测试顺序(有许多类和包都用于测试,要管理它们的执行顺序)
@Suite
//管理测试包的执行顺序
@SelectPackages(value = {"example"})
public class RunTest {
}
如下图,执行了 example 包下的 JunitTest
断言
断言(Assertions)在编程和测试中扮演着重要的角色,特别是在自动化测试、单元测试、集成测试以及验证代码逻辑正确性等方面。
断言的主要作用:
-
验证结果:断言用于验证代码执行后的结果是否符合预期。在测试中,我们通常编写一些测试用例来模拟用户行为,并使用断言来检查程序的状态或输出是否与预期一致。
-
快速失败:断言可以在发现不符合预期的情况时立即停止测试或程序执行,这有助于快速定位问题。如果没有断言,测试可能会继续执行并产生更多难以追踪的错误。
-
提高代码质量:通过编写断言,我们可以确保代码按照预期工作,并在不符合预期时给出清晰的错误消息。这有助于开发人员更快地识别并修复问题,从而提高代码质量。
Assertions 类实现断言
这里只简单的展示 Assertions 类常用的几个方法:
@Test
void test01(){
int a=1;
int b=0;
String tmp=null;
//断言 a,b 的值相等
//Assertions.assertEquals(a,b);
//断言 a,b 的值不相等
//Assertions.assertNotEquals(a,b);
//断言 tmp 的值为 null
//Assertions.assertNull(tmp);
//断言 tmp 的值不为 null
Assertions.assertNotNull(tmp);
}
如果断言失败就会停止测试,并展示失败的详细信息
执行 JS 脚本
如果一些操作我们通过 Junit 不好实现或不能实现,那么可以通过执行 JS 脚本的方式来是实现,语法如下:
((JavascriptExecutor)webDriver).executeScript("js脚本");