目录
1.注解
1.1 @Test
1.2 @BeforeEach
1.3 @BeforeAll
1.4 @AfterEach
1.5 @AfterAll
2. 用例的执行顺序
通过 @order() 注解来排序
3. 参数化
3.1 单参数
3.2 多参数
3.3 多参数(从第三方csv文件读取数据源)
3.4 动态参数@ParameterizedTest + @MethodSource()
4. 测试套件
4.1 指定类来运行实例@Suite + @SelectClasses
4.2 指定包名来运行包下所有测试用例
5. 断言 Assertions类
5.1 断言匹配/不匹配Assertions.assertEquals()
5.2 断言结果为真/假Assertions.assertTrue()
5.3 断言结果为空/非空Assertions.assertNull()
自动化就是 selenium 脚本来实现的,junit 是 java 的单元测试工具,只不过在实现自动化的时候需要借用一下 junit 库里面提供的一些注解
注:博主的版本为 Junit5,支持的 Java 版本最低要为 8
添加依赖:
<dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope>
</dependency>
1.注解
1.1 @Test
@Test 表示当前方法为测试方法,执行这个类的时候会自动执行这个注释下的所有方法
public class JunitTest {@Test//表示当前方法是测试方法,执行这个类时会自动执行这个类下的所有带 @Test 注解的用例void baseZhujie(){System.out.println("这是一个测试方法");}@Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
}
1.2 @BeforeEach
@BeforeEach 当前方法需要在每个用例执行之前都执行一遍
@BeforeEach// 表示当前方法需要在每个用例执行之前都执行一遍
// @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
1.3 @BeforeAll
@BeforeAll 表示当前方法需要在所有用例执行之前执行一次
@Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
// @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
1.4 @AfterEach
@AfterEach 表示当前发给发需要在每个用例执行之后都执行一遍
@Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍
// @Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
1.5 @AfterAll
@AfterAll 表示当前用例需要在每个用例执行之后执行一遍
@Testvoid baseZhujie(){System.out.println("这是一个测试方法");}// @BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
// @AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍@AfterAll// 当前方法需要在所有用例执行之后执行一次
// @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
注意:
@BeforeAll 和 @AfterAll 修饰的方法需要用 static 进行修饰才能正常运行
2. 用例的执行顺序
在先前我一直以为用例的执行顺序是按照排列顺序来执行的:
对比这两个实例中的用例的执行顺序,我又产生了是不是按照方法名的字母顺序来执行的呢?
但是后面我才了解到官方网站是并没有说明用例默认的执行顺序的!!
通过 @order() 注解来排序
- 要先使用注解说明当前类下所有的用例需要使用 order 注解来进行排序
- 然后通过 Order 来指定用例的具体执行顺序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)// 通过 order 来排序
public class JunitTest {@Order(1)@Testvoid editloginTest(){System.out.println("loginTest");}@Order(3)@Testvoid AindexTest(){System.out.println("indexTest");}@Order(2)@Testvoid editTest(){System.out.println("editTest");}
}
3. 参数化
目的:尽可能的用一个用例来模拟多个用户的行为
3.1 单参数
@ParameterzedTest + @ValueSource(数据类型方法 = {参数1,参数2,参数3,…})
//声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@ValueSource(strings = {"lucky","mary","tom"})void methodPramsTest(String username){System.out.println("name:" + username );}
3.2 多参数
@parameterizedTest + @CsvSource({“”, “”, '", …}) 每个双引号就是一组测试用例
//声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@CsvSource({"张三,123","李四,123","王五,123"})//多参数(从注解中手动编写数据源)void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}
3.3 多参数(从第三方csv文件读取数据源)
@ParameterizedTest + @CsvFileSource(files = “文件路径+名字”)
这里的这个 csv 文件,不要直接改后缀生成,要用系统自带的 Excel 工具,来打开和编辑 csv 文件
这里出现乱码的情况就是因为没有使用电脑系统自带的Excel来编辑
3.4 动态参数@ParameterizedTest + @MethodSource()
@ParameterizedTest + @MethodSource("方法名")
@ParameterizedTest@MethodSource("paramSupport")void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}static Stream<Arguments> paramSupport() throws InterruptedException {//构造动态参数String[] arr = new String[5];for (int i = 0; i < arr.length; i++) {Thread.sleep(500);arr[i] = System.currentTimeMillis() + "";}return Stream.of(Arguments.arguments(arr[0],10),Arguments.arguments(arr[1],14),Arguments.arguments(arr[2],13),Arguments.arguments(arr[3],12),Arguments.arguments(arr[4],11));}
注意:当@MethodSource不指定数据源时,会自动寻找与用例方法名相同的静态方法
4. 测试套件
当我们需要测试多个类中的用例时,如果一个类一个类的去运行,那是非常耗时耗力的,
如果我们能够同时运行多个类就很好,所以可以使用测试套件来同时运行多个测试类
4.1 指定类来运行实例@Suite + @SelectClasses
//标识为测试套件类,而不是测试类
@Suite
@SelectClasses({aaa.class,bbb.class,ccc.class})//指定类
public class runSuite {}
注意:想要用例被运行,用例必须要被 @Test 修饰
4.2 指定包名来运行包下所有测试用例
//标识为测试套件类,而不是测试类
@Suite
@SelectPackages("com.junit1121")//指定包名运行包下所有用例
public class runSuite {}
但是我们的运行结果为:
在这里类 aaa,bbb,ccc 中的用例都没有正常运行
那是因为:
如果使用包名来指定运行的范围,那么该包下来所有的测试类的命名需要以Test/Tests结尾(T必须要大写)
5. 断言 Assertions类
5.1 断言匹配/不匹配Assertions.assertEquals()
断言匹配:Assertions.assertEquals(期待得到对象,实际得到)
断言不匹配:Assertions.assertNotEquals(期待得到对象,实际得到)
@Testvoid TestBefo(){ChromeDriver driver = new ChromeDriver();driver.get("https://www.baidu.com");String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");//百度一下// 假如这里获取到的值不是“百度一下”而是“搜狐一下”这就是一个bugSystem.out.println(test);// 断言// 断言匹配/不匹配Assertions.assertEquals("搜狐一下",test);driver.quit();}
5.2 断言结果为真/假Assertions.assertTrue()
断言结果为真:Assertions.assertTrue()
断言结果为假:Assertions.assertFalse()
@Testvoid ddd(){// 断言结果为真/假
// Assertions.assertTrue(1==1);Assertions.assertFalse(1==0);}
5.3 断言结果为空/非空Assertions.assertNull()
断言结果为空:Assertions.assertNull()
断言结果为非空:Assertions.assertNotNull()
@Test
void ggg() {String aaa = null;Assertions.assertNull(aaa);//通过
}
@Test
void hhh() {Assertions.assertNotNull("你好");//通过
}