一、简介
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));
}