11. Junit

我们主要学习的是 Junit5.

1. selenium 和 Junit 之间的关系

selenium 和 Junit 之间的关系 就像 Java 和 JavaScript 之间的关系,也就是没有关系

为什么学习了 selenium 还要学习 Junit 呢?

举个例子,如果 Selenium 编写的自动化测试用例是灯,Junit 则是控制灯如何让去亮等。

通过 Junit 来管理测试用例。

2. 常用的注解

2.1 添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>TestCode</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</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><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency></dependencies><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

2.2 @Test

public class JunitTest {@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}
}

    @Testvoid test02(){System.out.println("这是第二个测试用例");}

2.3 @BeforeAll @AfterAll

 @BeforeAll// 当前所有的测试用例执行之前执行这个方法static void setUp(){System.out.println("开始执行 @BeforeAll 修饰的方法");}@AfterAll// 当前所有的测试用例执行之后执行这个方法static void tearDown(){System.out.println("开始执行 @AfterAll 修饰的方法");}

2.4 @BeforeEach @AfterEach

@BeforeEach// 当前每个测试用例执行之前执行这个方法void boforeTest(){System.out.println("开始执行 @BeforeEach 修饰的方法");}@AfterEach// 当前每个测试用例执行之后执行这个方法void afterTest(){System.out.println("开始执行 @AfterEach 修饰的方法");}

2.5 @Disabled

@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Testvoid test02(){System.out.println("这是第二个测试用例");}

3. Junit 测试用例的执行顺序

是从上到下执行测试用例吗?

我们先来看以下的测试用例的执行情况:

public class JunitTest {@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Testvoid test02(){System.out.println("这是第2个测试用例");}@Testvoid test03(){System.out.println("这是第3个测试用例");}@Testvoid test04(){System.out.println("这是第4个测试用例");}
}

可以看到确实是从上往下执行的,那么此时我们改变一下测试用例的顺序:

public class JunitTest {@Testvoid test04(){System.out.println("这是第4个测试用例");}@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Testvoid test02(){System.out.println("这是第2个测试用例");}@Testvoid test03(){System.out.println("这是第3个测试用例");}
}

可以看到依旧是从上往下执行的。

那么,我们如何根据指定的顺序来执行测试用例呢?

// 根据指定的顺序来执行测试用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {@Order(4)@Testvoid test04(){System.out.println("这是第4个测试用例");}@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Order(2)@Testvoid test02(){System.out.println("这是第2个测试用例");}@Order(3)@Testvoid test03(){System.out.println("这是第3个测试用例");}
}

可以看到,我们是通过注解 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 设定为根据指定的顺序来执行测试用例,通过 @Order 来指定具体的测试用例执行的顺序,没有被 @Order修饰的测试用例默认最后执行 。

接下来,我们来了解一下通过随机的顺序来执行测试用例:

// 根据随机的顺序来执行测试用例
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {@Order(4)@Testvoid test04(){System.out.println("这是第4个测试用例");}@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Order(2)@Testvoid test02(){System.out.println("这是第2个测试用例");}@Order(3)@Testvoid test03(){System.out.println("这是第3个测试用例");}
}

 可以看到每次执行的测试用例顺序不同。

4. 参数化

参数化中有单参数、多参数、CSV、方法。

4.1 单参数

注意,以下两个注解不能同时用来修饰一个方法

    @ParameterizedTest@ValueSource(strings = {"1","2","3"})void test05(String str){System.out.println(str);}

4.2 多参数

4.2.1 CSV
@ParameterizedTest@CsvSource({"1,2","3,4"})void test06(String str,int num){System.out.println(str + " " + num);}

接下来,在 resources 中新建文件:

编写代码:

    @ParameterizedTest@CsvFileSource(resources = "test01.csv")void test07(int id,String name){System.out.println("id" + id + ",name" + name);}

4.2.2 方法

编写方法:

public static Stream<Arguments> Generator(){return Stream.of(Arguments.arguments("1,小张","2,小李"));}

代码: 

// 注册参数@ParameterizedTest// 注册的参数@MethodSource("Generator")void test08(String num,String name){System.out.println(num + " " + name);}

5. 断言

断言相等和断言不相等:

    @ParameterizedTest@ValueSource(ints = {10})void test09(int num){// 断言相等Assertions.assertEquals(num,10);// 断言不相等Assertions.assertNotEquals(num,11);}

 可以看到运行正确,此时我们修改代码:

    @ParameterizedTest@ValueSource(ints = {10})void test09(int num){// 断言相等Assertions.assertEquals(num,10);// 断言不相等Assertions.assertNotEquals(num,10);}

可以看到此时报错,因为我们断言是不相等的,而实际是相等的。 

断言为空和断言不为空:

    @ParameterizedTest@ValueSource(strings = "1")void test10(String num){// 断言相等Assertions.assertEquals(num,"1");// 断言不相等Assertions.assertNotEquals(num,"11");// 断言为空Assertions.assertNull(num);}

    @ParameterizedTest@ValueSource(strings = "1")void test10(String num){// 断言相等Assertions.assertEquals(num,"1");// 断言不相等Assertions.assertNotEquals(num,"11");// 断言为空
//        Assertions.assertNull(num);// 断言不为空Assertions.assertNotNull(num);}

 

6. 测试套件

测试套件:通过一段代码直接将所有的测试用例跑起来。

@Suite
@SelectClasses({JunitTest.class,JunitTest02.class})
public class RunSuite {}

通过添加以上两个注解就可以将所有需要测试的类运行起来。

执行指定的包:

@Suite
// 按照指定的类执行
//@SelectClasses({JunitTest.class, JunitTest02.class})
// 按照指定的包执行
@SelectPackages({"Junitlearn","Junitlearn02"})
public class RunSuite {}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/94796.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Android 四大组件] --- Activity

1 Activity是什么 ​​Activity​​是一个Android的应用组件&#xff0c;它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口&#xff0c;窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。 一个应用通常是由多个彼此松散联系的Activity组成&…

查询优化器内核剖析之查询的执行与计划的缓存 Hint 提示

本篇议题如下: 查询的执行与计划的缓存 Hint 提示 首先看到第一个议题 查询的执行与计划的缓存 一旦查询被优化之后&#xff0c;存储引擎就使用选中的执行计划将结果返回&#xff0c;而被使用的这个执行 计划就会被保存在内存中一个被称之为“计划缓存”的地方&#xff0c;从…

C++八股记录

C内存管理 C中&#xff0c;内存分成5个区。 栈&#xff1a;函数内局部变量&#xff1b;自动管理&#xff0c;效率高&#xff0c;但空间较小&#xff1b; 堆&#xff1a;new分配的内存块&#xff1b;手动管理&#xff0c;效率低&#xff0c;但空间大&#xff1b; 自由存储区&…

Qt应用开发(基础篇)——颜色选择器 QColorDialog

一、前言 QColorDialog类继承于QDialog&#xff0c;是一个设计用来选择颜色的对话框部件。 对话框窗口 QDialog QColorDialog颜色选择器一般用来让用户选择颜色&#xff0c;比如画图工具中选择画笔的颜色、刷子的颜色等。你可以使用静态函数QColorDialog::getColor()直接显示对…

指针(一)------指针概念+指针类型+野指针+指针运算+二级指针

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C语言 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 指针&#xff08;一&#xff09; 指针是什么指针…

【阅读笔记】Graph of Thoughts: Solving Elaborate Problems with Large Language Models

Graph of Thoughts: Solving Elaborate Problems with Large Language Models Website & code: https://github.com/spcl/graph-of-thoughts 作者介绍了Graph of Thought (GoT)&#xff1a;一个具备提高LLM提示能力&#xff0c;超越了思维链或思维树 (ToT) 等范式提供的能…

ES6中的箭头函数(arrow function)与普通函数的不同之处

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 语法简洁⭐ 没有自己的this⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、…

Streamlit 讲解专栏(十一):数据可视化-图表绘制详解(中)

文章目录 1 前言2 绘制交互式散点图3 定制图表主题4 增强数据可视化的交互性与注释步骤1步骤二 5 结语 1 前言 在上一篇博文《 Streamlit 讲解专栏&#xff08;十&#xff09;&#xff1a;数据可视化-图表绘制详解&#xff08;上&#xff09;》中&#xff0c;我们学习了一些关…

wxWidgets从空项目开始Hello World

前文回顾 接上篇&#xff0c;已经是在CodeBlocks20.03配置了wxWidgets3.0.5&#xff0c;并且能够通过项目创建导航创建一个新的工程&#xff0c;并且成功运行。 那么上一个是通过CodeBlocks的模板创建的&#xff0c;一进去就已经是2个头文件2个cpp文件&#xff0c;总是感觉缺…

线上问诊:数仓开发(二)

系列文章目录 线上问诊&#xff1a;业务数据采集 线上问诊&#xff1a;数仓数据同步 线上问诊&#xff1a;数仓开发(一) 线上问诊&#xff1a;数仓开发(二) 文章目录 系列文章目录前言一、DWS1.最近1日汇总表1.交易域医院患者性别年龄段粒度问诊最近1日汇总表2.交易域医院患者…

mojo初体验

目录标题 mojo初体验试用地址变量定义参数可变性和所有权Structures后续 mojo初体验 试用地址 https://www.modular.com/get-started 与python基础语法很相似。 变量定义 let定义不可变变量var定义可变变量 参数可变性和所有权 下面是一个基本的函数&#xff1a; fn add…

得物一面,场景题问得有点多!

题目来源&#xff1a;https://www.nowcoder.com/discuss/525371909735792640 前文 本期是【捞捞面经】系列文章的第 1 期&#xff0c;持续更新中…。 《捞捞面经》系列正式开始连载啦&#xff0c;据说看了这个系列的朋友都拿到了大厂offer~ 欢迎星标订阅&#xff0c;持续更新…