Junit5 进行自动化测试入门
- 在UI自动化测试里面,我们的单元测试主要针对UI界面的功能进行自动化测试
- 首先在我们的项目中引入junit5的依赖,如下:
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
1.注解(当前注解都用在方法上)
selenium编写测试用例的时候,需要在main方法里面实例化类,然后调用测试方法才能实现测试,但是加上注解就不用再实例化
1. @Test
-
表示该方法是测试方法,执行当前这个类时,会自动执行该类下所有带@Test 注解的方法
-
比如当前只执行aaa方法,不会执行dog方法
public class JunitTest {
@Test
public void aaa() {
System.out.println("测试aaa");
}
public void dog() {
System.out.println("测试dog");
}
}
2. @BeforeEach
- 使用该注解的方法需要在每个测试用例执行之前都执行一次
3. @BeforeAll
-
使用该注解的方法需要在当前类下所有用例之前执行一次,
-
被该注解修饰的方法必须为静态方法
4. @AfterEach
- 使用该注解的方法需要在每个用例执行之后都执行一次
public class JunitTest1 {
@Test
public void aaa() {
System.out.println("测试aaa");
}
@Test
public void dog() {
System.out.println("测试dog");
}
@AfterEach
public void cat() {
System.out.println("测试cat");
}
}
5. @AfterAll
- 使用该注解的方法在当前类下所有的用例执行之后执行一次,
- 被该注解修饰的方法必须为静态方法
public class JunitTest2 {
@Test
public void aaa() {
System.out.println("测试aaa");
}
@Test
public void dog() {
System.out.println("测试dog");
}
@AfterAll
public static void FFF() {
System.out.println("测试FFF");
}
}
2.断言
1. 断言匹配/不匹配
- assertEquals方法判断期望值和结果值是否相等,相等则测试用例通过,不相等则报错
- assertNotEquals
public class assertTest {
@Test
public void test(){
Assertions.assertEquals(1,2);
Assertions.assertEquals(1,1);
}
}
2. 断言结果为真/假
- assertTrue
- assertFalse
3. 断言结果为空/不空
- assertNull
- assertNotNull
public class assertTest {
@Test
public void test(){
String str1 = null;
String str2 = "hello";
Assertions.assertNull(str1);
Assertions.assertNull(str2);
Assertions.assertNotNull(str2);
}
}
3.测试用例的执行顺序
- 官方没有明确的规定,基本使用A~Z的顺序,但是在测试登录页面的时候,必须先测试登录页面的显示,字体等,然后才能测试登录是否正常,否则测试登录页面跳转以后,登陆页面元素没法测试
- 首先要使用注解 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) (该注解必须要用在类上)说明当前类下所有的用例需要使用 Order 注解来进行排序,然后通过 Order注解来指定测试用例的执行顺序,该注解的参数便是执行顺序
4.参数化
- 使用参数化注解之前需要先声明该方法为参数化@ParameterizedTest
- 使用了参数化注解的方法不能再使用@Test注解
- 通过注解提供数据来源
单参数的
- 使用方式: @ValueSource(数据类型方法={参数1,参数2…})
public class SingleTest {
@ParameterizedTest
@ValueSource(strings = {"lucy", "marry", "鹿晗"})
public void getString(String name) {
System.out.println(name);
}
@ParameterizedTest
@ValueSource(ints = {12,90,65})
public void getString(int age) {
System.out.println(age);
}
}
多参数的
- @CsvSource({“marry,20”,“lilei,50”,“Bob,90”})
- 一个引号就是一组数据
public class MuchParamTest {
@ParameterizedTest
@CsvSource({"marry,20","lucy ,23","鹿晗,34"})
public void muchTest(String name ,int age){
System.out.println("name : " + name + " age: " + age);
}
}
但是当我们的测试用例有几十上百的时候,再用这个方法来写测试用例就不合适了,那么就可以使用以下办法
- @CsvFileSource(files = “D:\下载\新建 XLSX 工作表.csv”)
- 注解的参数就是写测试用例的文件的绝对路径。
public class FileTest {
@ParameterizedTest
@CsvFileSource(files ="C:\\Users\\13475\\Desktop\\新建文本文档.csv" )
public void test(String name,int age){
System.out.println("name : " + name + " age: " + age);
}
}
动态参数
- @MethodSource
- 注解就是提供数据源的方法名
如果不指定方法名,会自动的找跟用例方法名同名的静态方法
5.测试套件
-
想要一次运行多个测试类,使用测试套件
-
先创建一个类,使用注解 @Suite 声明为测试套件类
- 指定类来运行用例 @SelectClasses({aaa.class,bbb.class}),想要运行的用例必须以@Test注解声明
- 指定包来运行用例 @SelectPackages(“com.auto0701”),指定包来运行时,该包下的测试类命名必须以Test/Tests结尾(T大写)