一、简介
Junit框架是一个开源的Java语言单元测试框架,Java方向使用最广泛的单元测试框架,使用Java开发者都应该学习Junit并能掌握单元测试的编写。
对于Junit和Selenium的关系:通俗点来说Selenium如果比喻为灯泡,那么Junit就是电源。
二、常见使用方法
注解
在Junit框架中使用注解可以实现单元测试。
@Test
在方法前加上@Test注解就不用编写main方法,是直接可以运行该方法的。
@Test public void test01(){ System.out.println("简单测试"); }
@BeforeEach
在方法前加上BeforeEach表示在每执行一个测试方法之前,都要执行该方法一次。
@Test public void test01(){ System.out.println("简单测试"); } @Test public void test02(){ System.out.println("简单测试2"); } @BeforeEach public void test00(){ System.out.println("测试"); }
@BeforeAll
在方法前加上BeforeEach表示在每执行测试之前都会执行该测试方法,但只执行一次,该方法必须用static修饰。
@org.junit.jupiter.api.Test public void test01(){ System.out.println("简单测试"); } @org.junit.jupiter.api.Test public void test02(){ System.out.println("简单测试2"); } @BeforeAll public static void test00(){ System.out.println("测试"); }
@AfterEach:表示在每执行一个测试方法之前,都要执行该方法一次。
@AfterAll:表示在执行测试之后执行该方法一次,也要求是静态方法。
这两种注解与@BeforeEach和@BeforeAll用法相似,便不再进行演示。
断言
assertEquals和assertNotEquals
assertEquals:比较要测试的是否与预期的一致。
assertNotEquals:比较要测试的是否与预期的不一致。
ChromeDriver driver = new ChromeDriver(); @org.junit.jupiter.api.Test public void assertTest(){ driver.get("https://www.baidu.com"); String str = driver.findElement(By.xpath("//*[@id=\"su\"]")).getAttribute("value"); Assertions.assertEquals("百度一下",str); }
assertTrue和assertFalse
参数为布尔表达式用于判断真假。
assertTrue:参数中布尔表达式为真时,测试通过。
assertFalse:参数中布尔表达式为假时,测试通过。
@org.junit.jupiter.api.Test public void assertTest(){ driver.get("https://www.baidu.com"); String str = driver.findElement(By.xpath("//*[@id=\"su\"]")).getAttribute("value"); Assertions.assertTrue("百度一下".equals(str)); }
assertNull 和assertNotNull
assertNull 和assertNotNull这两个方法来判断参数是否为空。
@org.junit.jupiter.api.Test public void assertTest(){ driver.get("https://www.baidu.com"); String str = driver.findElement(By.xpath("//*[@id=\"su\"]")).getAttribute("value"); Assertions.assertNotNull(str); driver.quit(); }
测试用例的执行顺序
Junit的默认的执行顺序是不确定的,官方的用例并没有明确指出,如果测试之间有关联,这就需要使用Junit提供的方法来手动设置测试用例的执行顺序,在类前加上TestMethodOrder注解,标注当前类使用方法进行排序,在类中的方法前使用order注解注明顺序。
但是在编写测试用例时尽量保持其独立性。
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class Test { @org.junit.jupiter.api.Test @Order(1) public void test1(){ System.out.println("测试1"); } @org.junit.jupiter.api.Test @Order(2) public void test2(){ System.out.println("测试2"); } @org.junit.jupiter.api.Test @Order(3) public void test3(){ System.out.println("测试3"); } }
测试套件
测试套件Suite,可以将指定文件添加到套件执行。可以使用@SelectClasses()注解,以及@SelectPackages()注解。
@Suite @SelectClasses(Test.class) public class AutoTest { }
参数化
在测试方法中可以添加参数进行测试,使用@Parameterizedtest来标注方法类型为参数化,并且不需要再添加@Test注解,否则就会再多执行一次。
单参数
使用@ValueSource(类型={参数1,参数2……},在指明类型时需要使用原生类型,在基本数据类型之后加上s,例如:ints、floats。
@ParameterizedTest @ValueSource(ints = {1,23,0,9}) public void test1(int a){ System.out.println(a); }
多参数
使用@CSVSource(Value={"小明,98","张三,100",……}
多参数之间默认使用,如果修改需要使用delimeterString指定分隔字符。
@ParameterizedTest @CsvSource(value = {"小明-100","刘洋-99"},delimiterString = "-") public void test2(String name,int score){ System.out.println("姓名:"+name+" 成绩:"+score); }
当参数过多的话就可以使用文件进行处理,使用CSVFileSource注解
@ParameterizedTest @CsvFileSource (files = "D:\\test.txt") public void test2(String name,int score){ System.out.println("姓名:"+name+" 成绩:"+score); }
动态参数
单参数
使用@MethodSource()进行注解,参数为数据来源的方法名,如果不指定参数,就默认找跟用例同名的静态方法。
@ParameterizedTest @MethodSource("dataSource") public void test0(String str){ System.out.println(str); } public static Set<String> dataSource(){ Set<String> set = new HashSet<>(); set.add("小明,90"); set.add("张强,98"); set.add("王志,100"); return set; }
多参数
@ParameterizedTest @MethodSource("dataSource") public void test0(String name,int score){ System.out.println(name+":"+score); } public static Stream<Arguments> dataSource(){ return Stream.of(Arguments.arguments("jim",90),Arguments.arguments("lucy",99)); }