Junit 是一个开源的Java语言的单元测试框架。如果说要实现一个灯泡,那么selenium 就是灯泡,而Juniit就是电源。
引入相关依赖:
<dependencies> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <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-commons</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> </dependencies>
一、注解
1. @Test
表示一个方法/用例。使用Test注解后,就不需要在另外创建类来启动用例了。
@Test
public void Test1() {
//创建driver驱动对象
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
ChromeDriver driver = new ChromeDriver(options);
driver.get("https://baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
driver.quit();
}
当有多个方法时,可以显示出来哪个通过了哪个没有通过。
@Test
public void Test1() {
//创建driver驱动对象
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
ChromeDriver driver = new ChromeDriver(options);
driver.get("https://baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
driver.quit();
}
@Test
public void Test2() {
//创建driver驱动对象
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
ChromeDriver driver = new ChromeDriver(options);
driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
}
2. @BeforeEach 和 @BeforeAll
表示被注解的方法应该在其他方法之前。
@BeforeEach:表示被注解的反复在其他方法之前都要执行一遍;
@BeforeAll:表示被注解的方法在其他方法之前只用执行一遍。(该方法必须加上@Test,同时必须是一个静态方法static)
@Test
void Test01() {
System.out.println("01");
}
@Test
void Test02() {
System.out.println("02");
}
@BeforeEach
void Test03() {
System.out.println("03");
}
@Test
void Test01() {
System.out.println("01");
}
@Test
void Test02() {
System.out.println("02");
}
@BeforeAll
@Test
static void Test03() {
System.out.println("03");
}
3. @AfterEach 和 @AfterAll
表示被注解的方法应该在其他方法之后。
@AfterEach:其他的方法执行后,都要执行一遍
@AfterAll:其他所有的方法执行之后只需要执行一遍。(必须是静态方法static)
二、断言
1. Assertions类
1.1 assertEquals 和 assertNotEquals
asserEquals( expect, actual ):校验期望值和实际值是否匹配。
assertNotEquals( expect, sctual ):校验期望值和实际值是否不匹配。
@Test
void test1() {
//创建driver驱动对象
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
ChromeDriver driver = new ChromeDriver(options);
driver.get("https://baidu.com");
String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");
Assertions.assertEquals("百度一下",text);
driver.quit();
}
1.2 assertTrue 和 assertFalse
assertTure( 表达式 ):表达式为真则通过。
assertFalse( 表达式 ):表达式为假则通过。
@Test
void test2() {
Assertions.assertTrue(1 == 1);
}
1.3 assertNull 和 assertNotNull
asserNull(a):a为空则通过。
assertNotNull(a): a不为空则通过。
三、用例执行顺序
Junit默认的执行顺序是不确定的,但是我们可以使用Junit里提供的方法去规定用例的执行顺序。
注意:
因为用例之间是存在关联关系的,因此就需要手动的指定用例的顺序。但是在编写测试用例的时候,要保持用例的独立性,避免关联关系的出现。
1. 方法的排序 —— @Order
通过注解
@TestMethodOrder(MethodOrder.OrderAnnotation.class):表示通过方法排序
@Order(i):传入每个方法的顺序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Test03 {
@Test
@Order(1)
void yi() {
System.out.println("111");
}
@Test
@Order(2)
void er() {
System.out.println("222");
}
@Test
@Order(3)
void san() {
System.out.println("333");
}
}
四、测试套件Suit
一个包下有很多个类的用例,要将所有的用例都执行起来就要用到测试套件@Suite。
1. 指定类,添加到套件中并执行
@Suite
//选择指定文件来添加到套件中执行
@SelectClasses({Test03.class, AsserTest.class})
public class RunAllSuite {
}
2. 指定包,添加到套件中并执行
前提:所有的文件都要以Test、tests命名,并且用例都要加上@Test。
@Suite
//选择指定的包添加到套件中执行
@SeleceClasses("test1")
public class RunAllSuite {
}
五、参数化
@Parameterizedtest 标注方法类型为参数化,同时要搭配参数的来源。不需要再添加@Test注解。否则会再执行一遍。
1. 单参数
@ValueSource( 类型={参数1,参数2,参数3......} )
这里的类型是指原生类型:ints、floats、strings...
@ParameterizedTest
@ValueSource(strings = {"丫丫","糯糯","小狗"})
void test01(String name) {
System.out.println(name);
}
2. 多参数
2.1 参数为数据
@CsvSource( value = { "丫丫,2" , "糯糯,1" ......} )
默认参数里面使用逗号分隔,也可以使用 delimiterString = “” 来进行设置。
若参数中包含都要,就使用单引号作为转义字符。
@ParameterizedTest
@CsvSource(value = {"丫丫,2","糯糯,1"})
void test02(String name,int i) {
System.out.println("名字:" + name + " 年龄:" + i);
}
2.2 参数为文件
当要输入的参数过多,在代码中不美观,就可以使用第三方来进行添加。借助文件注入的方式来添加。
@CsvFileSource( resources = " csv文件 " )
指定的文件路径为当前项目下,resources文件中的 csv文件。
如果要使用本地任意文件夹下的文件:
@CsvFileSource( files = " 文件路径 " )
@ParameterizedTest
@CsvFileSource(resources = "/my.csv")
void test03(String name,int i) {
System.out.println("名字:" + name + " 年龄:" + i);
}
3. 动态参数
3.1 单参数
@MethodSources(" ") 参数为数据来源的方法。
注意:参数中的方法必须是静态方法。
@MethodSources
如果参数中为空,就自动找与其同名的静态方法。
@ParameterizedTest
@MethodSource("MethoDemo")
void test04(String s) {
System.out.println(s);
}
//返回值是一个Stream流
static Stream<String> MethoDemo() {
return Stream.of("yyy","sss");
}
3.2 多参数
使用 Arguments类型。
@ParameterizedTest
@MethodSource
void test05(String name,int i) {
System.out.println("名字:" + name + " 年龄:" + i);
}
static Stream<Arguments> test05() {
return Stream.of(Arguments.arguments("yaya",22),
Arguments.arguments("nuonuo",2));
}
版权归原作者 AJIUZ 所有, 如有侵权,请联系我们删除。