JUnit是一个开源的java语言单元测试框架,在UI自动化测试中可以利用JUnit配合Selenium完成自动化测试,自动化代码和自动化测试有区别,区别在于自动化代码只是一个操作,要想达到自动化测试的效果,我们需要对测试结果进行判断,因此就要通过Junit来实现。
引入依赖
xml
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<!-- 参数化-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.2</version>
<scope>compile</scope>
</dependency>
注解
@Test:注解的方法被视为一个用例
@BeforeAll :在所有测试执行之前执行一次,被注解的方法必须是静态的
@BeforeEach:在每个测试方法执行之前执行
@AfterAll :在所有测试方法执行之后执行一次,被注解的方法必须是静态的
@AfterEach:在每个测试方法执行之后执行
@Order:指定用例执行顺序
@DisplayName:为测试类或测试方法提供自定义名称
@ParameterizedTest:允许将参数传递给测试方法进行一次或多次执行
执行顺序:@BeforeAll>@BeforeEach>@Test>@AfterEach>@AfterAll
示例
java
public class JunitTestDemo {
@Test
public void test(){
System.out.println("这是第一条用例");
}
@Test
public void test2(){
System.out.println("这是第二条用例");
}
@BeforeAll
public static void test3(){
System.out.println("优先级最高");
}
@BeforeEach
public void test4(){
System.out.println("每条用例执行前执行");
}
@AfterEach
public void test5(){
System.out.println("每条用例执行后执行");
}
@AfterAll
public static void test6(){
System.out.println("最后执行");
}
}
执行结果
断言
通常用于自动化测试中的结果校验,确保测试结果与预期相符,AssertActions类的assertEquals和assertTrue方法:
assertEquals(excepted,actual):excepted和actual一致,则表示成功
assertTrue(boolean condition):判断一个条件是否为true,true表示成功,false则抛异常AssertionError
java
@Test
public void test7(){
System.out.println("用例01");
Assertions.assertEquals(1,1);
}
@Test
public void test8(){
System.out.println("用例02");
Assertions.assertTrue(0>1);
}
@Test
public void test9(){
System.out.println("用例03");
Assertions.assertTrue(true);
}
@Order:用例执行顺序
在方法上加注解@Order,需先在方法所在类上加@TestMethodOrder(MethodOrderer.OrderAnnotation.class)注解,表示当前类使用方法来进行排序
java
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTestDemo {
@Test
@Order(2)
public void test01(){
System.out.println("用例01");
Assertions.assertTrue(true);
}
@Test
@Order(3)
public void test02(){
System.out.println("用例02");
Assertions.assertTrue(true);
}
@Test
@Order(1)
public void test03(){
System.out.println("用例03");
Assertions.assertTrue(true);
}
}
@DisplayName:显示名称
java
@Test
@DisplayName("这是第一条用例")
public void test10(){
System.out.println("用例名01");
}
@Test
@DisplayName("这是第二条用例")
public void test11(){
System.out.println("用例名02");
}

**@Timeout:**超时测试
默认单位秒,可以指定单位
@Timeout(1) 秒
@Timeout(value = 1,unit = TimeUnit.MILLISECONDS) 毫秒
@Timeout(value = 1,unit = TimeUnit.SECONDS) 秒
@Timeout(value = 1,unit = TimeUnit.MINUTES) 分
@Timeout(value = 1,unit = TimeUnit.HOURS) 时
@Timeout(value = 1,unit = TimeUnit.DAYS) 天
如果一个用例执行的时间超过指定时间,则标记为失败
java
@Test
@DisplayName("这是第二条用例")
@Timeout(1)
public void test11() throws InterruptedException {
Thread.sleep(3000);
System.out.println("用例名02");
}
参数化
@ValueSource:单参数
- 参数化用例的时候使用的注解由@Test换成@ParameterizedTest(注:这两个注解不能同时使用,同时使用会多执行一次)
- 单参数化注解:@ValueSource
单参数化注解支持以下类型的参数数据的参数化
short/byte/int/long/float/double/char/boolean/java.lang.String/java.lang.Class
参数名 | 参数类型 |
---|---|
shorts | short |
bytes | bytes |
ints | int |
longs | long |
floats | float |
doubles | double |
chars | char |
booleans | boolean |
strings | java.lang.String |
classes | java.lang.Class |
java
@ParameterizedTest
@ValueSource(ints= {1,2})
public void test(int age){
System.out.println(age);
}
@CsvSource:多参数,通过delimiterString指定分隔符实现参数化,如下例子中指定参数与参数之间用 "-"分隔
java
@ParameterizedTest
@CsvSource(value = {"tom-10","jerry-11"},delimiterString = "-")
public void test2(String name,int age){
System.out.println("姓名:"+name+"\t年龄:"+age);
}
@CsvFileSource:多参数文件参数化注解,在项目的test/resource中新增测试数据csv文件,numLinesToSkip可以指定从第n行开始读取
java
@ParameterizedTest
@CsvFileSource(resources = "/account.csv",numLinesToSkip = 1)
public void test3(String name,String pwd,String num){
System.out.println(name+","+pwd+","+num);
}
@MethodSource
- 通过@MethodSource注解引用方法作为参数化的数据源信息
- 用@MethodSource注解的参数必须是静态的工厂方法,除非测试类被注解为@TestInstance(Lifecycle.PER_CLASS)
- 静态工厂方法的返回值需要和测试方法的参数对应
- 如果在@MethodSource注解中未指明方法名,会自动调用与测试方法同名的静态方法
java
/**
* 单个参数
* @param str
*/
@ParameterizedTest
@MethodSource("dataParams")
public void test(String str){
System.out.println(str);
}
static Stream<String> dataParams(){
return Stream.of("tom","jerry");
}
/**
* 多个参数
* @param name
* @param age
*/
@ParameterizedTest
@MethodSource("multiParams")
public void test2(String name,int age){
System.out.println(name+","+age);
}
public static Stream<Arguments> multiParams(){
return Stream.of(
Arguments.arguments("tom",10),
Arguments.arguments("jerry",11)
);
}