作者:~小明学编程
文章专栏:测试开发
格言:热爱编程的,终将被编程所厚爱。
目录
注解
@Test注释
@BeforeEach
@BeforeAll
@ AfterEach
@AfterAll
断言
assertEquals / assertNotEquals
assertTrue / assertFalse
测试的执行顺序
测试套件Suite
添加类
添加包
参数化
单参数
多参数
动态参数
注解
首先给大家补充一下我们本章要使用的一些依赖。
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-reporting</artifactId><version>1.8.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
@Test注释
一般情况下我们想要调用一个方法的时候需要通过main()方法,但是加上我们的@Test注解之后就可以直接的使用该方法了。
这里可以看到我们加上注解之后多了run()的接口。
@Test
void test1() {
System.out.println("aaa");
}
@Test
void test2() {
System.out.println("bbb");
}
@Test
void test3() {
System.out.println("ccc");
}
左边表示我们的测试顺利通过了。
@BeforeEach
@BeforeEach 注释意味着我们的每一个Test注释的方法执行之前都会先调用一次这个方法。
@BeforeEach
void test1() {
System.out.println("aaa");
}
@Test
void test2() {
System.out.println("bbb");
}
@Test
void test3() {
System.out.println("ccc");
}
@BeforeAll
该注释意味着我们所有的方法执行之前会先执行一遍该注释所修饰的方法。
@BeforeAll
static void test1() {
System.out.println("aaa");
}
@Test
void test2() {
System.out.println("bbb");
}
@Test
void test3() {
System.out.println("ccc");
}
@ AfterEach
@ AfterEach所修饰的方法会在每个@Test这样的方法修饰之后再去执行该注解修饰的方法。
@BeforeEach
void test1() {
System.out.println("aaa");
}
@Test
void test2() {
System.out.println("bbb");
}
@Test
void test3() {
System.out.println("ccc");
}
@AfterEach
void test4() {
System.out.println("ddd");
}
@AfterAll
在所有的测试方法之后来调用来方法,只执行一次。
@BeforeEach
void test1() {
System.out.println("aaa");
}
@Test
void test2() {
System.out.println("bbb");
}
@Test
void test3() {
System.out.println("ccc");
}
@AfterAll
static void test4() {
System.out.println("ddd");
}
断言
assertEquals / assertNotEquals
通过这两个方法我们可以比较我们要测试的目标和我们所预期的是否一致。
@Test
void assertTest() {
driver.get("https://www.baidu.com");
String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");
Assertions.assertEquals("百度一下",test);
}
@Test
void assertTest() {
driver.get("https://www.baidu.com");
String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");
Assertions.assertNotEquals("百度一下",test);
}
assertTrue / assertFalse
这两个方法用于判断我们里面的布尔值的真假,assertTrue表示当我们里面的值为真的时候测试验证成功,assertFalse则表示当里面的值为false的时候测试验证成功。
@Test
void assertTest() {
driver.get("https://www.baidu.com");
String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");
Assertions.assertNotEquals("百度一下",test);
}
测试的执行顺序
@Test
void test1() {
System.out.println("aaa");
}
@Test
void test222() {
System.out.println("bbb");
}
@Test
void test3() {
System.out.println("ccc");
}
@Test
void test4() {
System.out.println("ddd");
}
我们看上面这一段的代码,其执行结果如下:
并没有按照从上到下的执行顺序来执行代码当我们想要约定其执行的顺序的时候就需要用到
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) 来对方法进行一个排序。
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class TestAuto {
@Test
@Order(1)
void test1() {
System.out.println("aaa");
}
@Test
@Order(2)
void test222() {
System.out.println("bbb");
}
@Test
@Order(3)
void test3() {
System.out.println("ccc");
}
@Test
@Order(4)
void test4() {
System.out.println("ddd");
}
}
测试套件Suite
测试套件就是让我们一次性可以执行多个类或者多个包避免我们一个一个类来点击测试,或者把所有的测试都写到一个类中。
添加类
@Suite
@SelectClasses({TestAuto.class})
public class TestAuto2 {
}
添加包
@Suite
//@SelectClasses({TestAuto.class})
@SelectPackages("com.auto_1_20")
public class runSuite {
}
添加包的时候我们要注意一些细节,我们包里面想要测试的类必须以Test或者tests来结尾并且要加上@Test,并且我们当前的的测试类的类名不能以Test结尾。
参数化
我们前面介绍的方法都是没有参数的,那么如果我们的测试的方法里面如果有参数的话应该怎么怎么办呢,这个时候我们需要对参数进行处理。
单参数
对方法使用 @ParameterizedTest 注解就可以了,要配合 @ValueSource 来找到数据源
@ParameterizedTest
@ValueSource(strings = {"zhangsan","lisi","wangwu"})
void test(String name) {
System.out.println("name"+name);
}
多参数
通过 @CsvSource(value = ) 注解来实现,默认分隔符是 逗号。
@ParameterizedTest
@CsvSource(value = {"zhangsan,20","lisi,30","wangwu,40"})
void test1(String name,int age) {
System.out.println("name"+name+" age"+age);
}
当我们的数据过多的时候我们可以借助文件来处理。
@ParameterizedTest
@CsvFileSource(resources = "/my.csv")
void test1(String name,int age) {
System.out.println("name"+name+" age"+age);
}
动态参数
通过 @MethodSource() 注解来提供参数,也就是我们方法所想要的参数由另外一个方法来提供。
@ParameterizedTest
@MethodSource("test2")
void test1(String x) {
System.out.println(x);
}
//定义提供数据的方法,可以是 Stream 流
static Stream<String> test2() {
return Stream.of("张三","李四","王五");
}