🌟需要知道:
问题1:Selenium与Junit之间的关系?
就像雷锋和雷峰塔的关系,就是没关系。
问题2:为什么学习了Selenium之后还要学习Junit?
Junit是针对java的一个单元测试框架,实际中通常是通过一个自动化测试框架搭配对应的一个单元测试框架来对测试用例进行管理。如果Selenium编写的自动化测试用例是灯,Junit就是控制灯怎么去亮,灯亮的颜色是什么颜色,灯亮的顺序是什么等。
🌟Junit学习
需要在Pom.xml文件中引入依赖:写在dependencies下面:
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> <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>
🌈1、常用的注解
之前的代码实现方式:在main函数中调用。现在可不可以不需要直接调用test01(),这就可以使用注解实现。
案例1:@Test的使用:
(1)不需要main方法调用;
(2)表示注解的:@Test,@BeforeAll,@AfterAll,@BeforeEach,@AfterEach
(3)@Test是一个注解,表示当前的方法是一个测试用例;
(4)注意:返回值必须是void,是规定的;
(5)要执行两个测试用例,点class前面的那个箭头;如果点的是Test01前面的箭头,表示只执行这一个测试用例;
(6)Test01,Test02都是自定义的名字。
public class a01_JunitTest { @Test void Test01(){ WebDriver webDriver = new ChromeDriver(); webDriver.get("https://www.baidu.com/"); } @Test void Test02(){ System.out.println("这是第二个测试用例"); } }
指向结果:先打开百度,再打印Test02中的语句。
案例2:@BeforeAll与@AfterAll:执行一次
(1)当前类里面所有的测试用例执行之前都会执行这个方法@BeforeAll;
(2)当前类里面所有的测试用例执行结束之后都会执行这个方法**@AfterAll。**
public class a02_BeforeAll { //1、当前类里面所有的测试用例执行之前都会执行这个方法 @BeforeAll static void setUp(){ System.out.println("开始执行@BeforeAll修饰的方法"); } @Test void Test(){ WebDriver webDriver = new ChromeDriver(); webDriver.get("https://www.baidu.com/"); } //2、当前类里面所有的测试用例执行结束之后都会执行这个方法 @AfterAll static void TearDown(){ System.out.println("开始执行@AfterAll对应的方法"); } }
执行结果:
案例3:@BeforeEach与@AfterEach
**当前类里面有两个测试用例: **
(1)AfterAll和BeforeAll会执行一次;不论有几个测试用例,都只执行一次;
(2)AfterEach和BeforeEach会分别执行两次;有几个测试用例执行几次。
1、在执行每个方法之前都会执行一下BeforeEach方法;
2、在每个方法执行之后都会执行AfterEach方法。
public class a03_BeforeEach { //1、在执行每个方法之前都会执行一下BeforeEach方法 @BeforeEach void BeforeEachTest(){ System.out.println("执行BeforeEach"); } @Test void Test01(){ WebDriver webDriver = new ChromeDriver(); webDriver.get("https://www.baidu.com/"); } @Test void Test02(){ WebDriver webDriver = new ChromeDriver(); webDriver.get("https://www.csdn.net/"); } //2、在每个方法执行之后都会执行AfterEach方法 @AfterEach void AfterEachTest(){ System.out.println("执行AfterEach"); } }
案例4:@Disabled
(1)有两个测试用例,只执行Test02,不执行Test01 ;
(2)在要忽略执行的方法前面写@Disabled。
public class a04_Disable { @Disabled @Test void Test01(){ WebDriver webDriver = new ChromeDriver(); webDriver.get("https://www.baidu.com/"); } @Test void Test02(){ WebDriver webDriver = new ChromeDriver(); webDriver.get("https://www.csdn.net/"); } }
执行结果:
🌈2、测试用例的执行顺序
情况1:执行顺序12345
情况2:将Testt05放在最前面,执行顺序12345
** 方式1:按照执行顺序执行(搭配Order使用)**
(1)在类前面加上注解@TestMethodOrder(MethodOrderer.OrderAnnotation.class);
(2)指定执行规则:在每个测试用例前面加上注解: @Order(顺序)。
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class a05_Test { @Order(1) @Test void Test05(){ System.out.println("这是测试用例5"); } @Order(5) @Test void Test01(){ System.out.println("这是测试用例1"); } @Order(4) @Test void Test02(){ System.out.println("这是测试用例2"); } @Order(3) @Test void Test03(){ System.out.println("这是测试用例3"); } @Order(2) @Test void Test04(){ System.out.println("这是测试用例4"); } }
方式2:按照随机方式执行:(不常用)
在类前面加上@TestMethodOrder(MethodOrderer.Random.class)
@TestMethodOrder(MethodOrderer.Random.class) public class a05_Test { @Test void Test05(){ System.out.println("这是测试用例5"); } @Test void Test01(){ System.out.println("这是测试用例1"); } @Test void Test02(){ System.out.println("这是测试用例2"); } @Test void Test03(){ System.out.println("这是测试用例3"); } @Test void Test04(){ System.out.println("这是测试用例4"); } }
执行结果是随机的:
🌈3、参数化
错误演示:
1、单参数
(1)@ParameterizedTest进行参数的注册;
(2)单参数的形式:在前面写:@ValueSource:点进去源码观察可以是各种类型传递。
代码演示:
2、多参数
可以看出单参数的特点:如果要传递String,那么所有的参数都是String类型。但是如果我现在想要第一个参数是String,第二个参数是Int,那么就要使用多参数的形式了。
(1)csv参数传递
方式1:@CsvSource
** 当数据非常多的时候,我们一般采用第二种方式:**
方式2:通过新建csv文件传递
如果要传递的csv文件中的内容:姓名为空的话,直接写为‘ ’即可。
(2)在有些情况下,有些参数可能需要某些对应的方法来对参数进行处理,因此就有第二种方法,通过方法将参数处理,再传入测试用例中。简单使用如下:
🌈4、断言
在java中判断通过if-else来判断,这里我们通过断言来实现。
🌈5、测试套件
要解决的问题:现在有a01,a02,a03...a10一共10个class文件都要执行,正常操作是如果要执行a10,点击a10,执行a9,点击a9...以此类推。但是这样很麻烦,因此通过测试套件,一次性将所有的代码都执行。
** 写法1:通过指定相应的class来执行**
用法:
执行结果:
写法2:通过指定包来执行
用法:
执行结果:先执行包1中的a01,a02,然后执行包2中的a01。
版权归原作者 IUIUStar 所有, 如有侵权,请联系我们删除。