1.junit
1.1 junit是什么
JUnit是一个Java语言的单元测试框架。
虽然我们已经学习了selenium测试框架,但是有的时候测试用例很多,我们需要一个测试工具来管理这些测试用例,Junit就是一个很好的管理工具,简单来说Junit是一个针对Java单元测试的框架。Junit由Junit Platform _ Junit Jupiter + junit Vintage3部分组成。
1.2 Junit和Selenium的关系
Junit和Selenium是完全不同的两个东西!!!
在一个灯串上,如果说selenium编写的测试用例是一个小灯泡,那么junit就是把它们串起来的线。junit是用来管理selenium的测试用例的。
2.junit技术
2.0 前置工作
在pom.xml文件中添加依赖
引入selenium:
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.7.2</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>
参数化:
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version></dependency> <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.2</version></dependency>
测试套件:
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency>
2.1 junit常用注解
@Test
@Test表示当前的方法是一个测试用例
使用:
@Test
void + 方法名(){}
举例:
//表示当前的方法是一个测试用例@Testvoid Test01(){// 创建了一个options对象,用来给请求设置一些参数ChromeOptions options = new ChromeOptions();// 允许所有的请求options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");// 创建了一个驱动WebDriver webDriver = new ChromeDriver(options);//打开百度webDriver.get("https://www.baidu.com/");}
@BeforeAll 和 @AfterAll
这两个注解在整个类测试的时候会执行一次。
@BeforeAll表示在当前类所有测试用例执行之前运行
@AfterAll表示在当前类所有测试用例执行之后运行
并且这两个方法都有static修饰,都只执行一次
使用:
@BeforeAll
static void 方法名(){}
举例:
//当前类里面所有的测试用例执行之前执行这个方法@BeforeAllstatic void SetUp(){System.out.println("开始执行@BeforeAll修饰的方法");}
使用:
@AfterAll
static void 方法名(){}
举例:
//当前类里面所有的测试用例执行之后执行这个方法@AfterAllstatic void TearDown(){System.out.println("开始执行@AfterAll对应的方法");}
运行结果:
@BeforeEach 和 @AfterEach
这两个注解会在每一个测试用例执行的时候都执行一次。
- @BeforeEach表示在每个测试方法执行前运行
- @AfterEach表示在每个测试方法执行后运行
举例:
@BeforeEachvoid BeforeTest(){System.out.println("这是一个@BeforeEach注解");}@AfterEachvoid AfterTest(){System.out.println("这是一个@AfterEach注解");}
结果:
@Disabled
作用:忽略当前的测试用例
举例:
//忽略当前的测试用例@Disabled//表示当前的方法是一个测试用例@Testvoid Test01(){// 创建了一个options对象,用来给请求设置一些参数ChromeOptions options = new ChromeOptions();// 允许所有的请求options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");// 创建了一个驱动WebDriver webDriver = new ChromeDriver(options);//打开百度webDriver.get("https://www.baidu.com/");}
结果:并没有执行这个测试用例
2.2 junit测试用例执行顺序
有人觉得junit的测试顺序是从上到下的,是这样吗?
先来看一个示例:
@Testvoid Test06(){System.out.println("这是测试用例5");}@Testvoid Test05(){System.out.println("这是测试用例4");}@Testvoid Test04(){System.out.println("这是测试用例3");}@Testvoid Test02(){System.out.println("这是测试用例1");}@Testvoid Test03(){System.out.println("这是测试用例2");}
结果:
以上结果表明了它不是按照从上到下执行的测试用例。
指定顺序执行
使用@TestMethodOrder(MethodOrderer.OrderAnnotation.class)+ @Order(数字)
注解顺序执行测试用例。
举例:
//按照指定顺序执行测试用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {@Order(1)@Testvoid Test06(){System.out.println("这是测试用例5");}@Order(2)@Testvoid Test05(){System.out.println("这是测试用例4");}@Order(3)@Testvoid Test04(){System.out.println("这是测试用例3");}@Order(4)@Testvoid Test02(){System.out.println("这是测试用例1");}@Order(5)@Testvoid Test03(){System.out.println("这是测试用例2");}
}
结果:
是按照order里面的顺序执行的。
随机执行
使用@TestMethodOrder(MethodOrderer.Random.class)
随机执行测试用例。
举例:
//按照随机顺序执行测试用例
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {@Order(1)@Testvoid Test06(){System.out.println("这是测试用例5");}@Order(2)@Testvoid Test05(){System.out.println("这是测试用例4");}@Order(3)@Testvoid Test04(){System.out.println("这是测试用例3");}@Order(4)@Testvoid Test02(){System.out.println("这是测试用例1");}@Order(5)@Testvoid Test03(){System.out.println("这是测试用例2");}
}
2.3 参数化测试
测试方法一般需要传参数。
单参数
使用 @ParameterizedTest + @ValueSource()
配合传递单参数
@ParameterizedTest : 注册参数
!!!注意:这两个注解不能和@Test一起使用,并且只能传一种类型的参数
示例:
@ParameterizedTest //注册@ValueSource(strings = {"1","2","3"})void Test07(String str){System.out.println(str);}
结果:
多参数
上面只可以传入一种类型的参数,所以如果我们需要传入多种类型的参数,就可以使用csv 。
CSV
①直接传参数:使用@ParameterizedTest + @CsvSource()
配合
举例:
@ParameterizedTest@CsvSource({"1,2","3,4"})void Test08(String str,int num){System.out.println(str+" "+num);}
结果:
②传递文件:使用@ParameterizedTest+ @CsvFileSource(resources = "文件名.csv")
配合
!!!注意:文件必须是.csv类型
示例:
@ParameterizedTest@CsvFileSource(resources = "test01.csv")void Test09(int id,String name){System.out.println("id="+id+",name="+name);}
test01.csv文件内容:
1,温温
2,苏苏
3,怜怜
结果:
方法传参
使用@ParameterizedTest + @MethodSource("方法名")
传入一个方法
示例:
@ParameterizedTest //注册参数@MethodSource("Generator") //注册的参数是什么void Test10(String num,String name){System.out.println(num+" "+name);}
Generator方法代码:
public static Stream<Arguments> Generator() {return Stream.of(Arguments.arguments("1,温温","2,苏苏"));}
结果:
2.4 断言
在软件测试中,断言(Assertion)是一种用于检查程序或系统在执行某些操作或运行某些代码后是否符合预期行为的技术手段。在测试中,断言通常用于验证代码的正确性,确保代码在满足特定条件时会产生预期的结果。
示例:
@ParameterizedTest@ValueSource(ints = {10})void Test11(int num){//断言相等Assertions.assertEquals(num,10);//断言不相等Assertions.assertNotEquals(num,11);}
@ParameterizedTest@ValueSource(strings = {"1"})void Test11(int num){//断言为空Assertions.assertNull(num);//断言不为空Assertions.assertNotNull(num);}
2.5 测试套件
测试套件(test suite)有时也称为验证套件(validation suite),是许多测试用例的集合,测试用例可用来测试一程式是否正确工作,测试套件包括许多测试用例,一般也会有针对测试用例及其测试目的的详细说明,在进行测试时的系统组态资讯以及测试前需进行的步骤。
通过测试套件,将服务于同一个测试目的或同一运行环境下的一系列测试用例有机的组合起来。测试套件是按照测试计划所定义的各个阶段的测试目标决定的,即先有测试计划,后面才有测试套件。
例如:此时有三个类的测试用例都需要测试。
通过测试套件全部测试:
方法①:在括号中写入测试类
@Suite
@SelectClasses({JunitTest.class, JunitTest02.class})
public class RunSuite {
}
方法②:根据指定的包来运行多个测试用例
@Suite
@SelectPackages({"org.example.junit01","org.example.junit"})
public class RunSuit {
}