【软件测试】Junit5

news2024/10/5 20:19:25
  • Selenium自动化测试框架
  • Junit单元测试框架
  • 拿着一个技术写自动化测试用例 (Selenium3)
  • 拿着一个技术管理已经编写好的测试用例 (Junit5)

Junit相关技术

Junit是针对java的一个单元测试框架。

注解

@Test

表示当前的这个方法是一个测试用例

添加依赖:

image-20230911224627403

不需要main方法就能执行,点击类上的运行就是运行所有方法。点击单个方法,就是运行单个方法。

单个方法有错误就会报错。

public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }

    @Test
    void test3(){
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top11-left > a:nth-child(6)"));
    }
}

@Disabled

忽略测试用例。

public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }

    @Disabled
    void test3(){
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top11-left > a:nth-child(6)"));
    }
}

@BeforeAll @AfterAll BeforeEach AfterEach

  • BeforeAll 在所有的测试用例运行之前跑对应的方法
  • AfterAIl 在所有的测试用例运行之后跑对应的方法
  • BeforeEach在每一个测试用例执行之前跑对应的方法
  • AfterEach在每一个测试用例执行之前跑对应的方法
public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }
	// 在所有测试用例运行之前进行运行,相当于运行class的时候进行运行的,属于类方法。
    @BeforeAll
    static void SetUp(){
        System.out.println("这是我们BeforeAll里面的语句");
    }

    @AfterAll
    static void TearDown(){
        System.out.println("这是我们AfterAll里面的语句");
    }
}

输出结果

这是我们BeforeAll里面的语句
这是JunitTest里面的test01
这是JunitTest里面的test02
这是我们AfterAll里面的语句

  • 如果做UI自动化,通常情况下,创建驱动,打开网页,放到BeforeAII里面
  • 关闭浏览器放到AfterAll
public class JunitTest {
    @Test
    void test1(){
        System.out.println("这是JunitTest里面的test01");
    }

    @Test
    void test2(){
        System.out.println("这是JunitTest里面的test02");
    }

    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }
}

执行结果:

这是BeforeEach里面的语句
这是JunitTest里面的test01
这是AfterEach里面的语句
这是BeforeEach里面的语句
这是JunitTest里面的test02
这是AfterEach里面的语句

  • 如果有5个测试用例,BeforeEach跑几次,BeforeAIl跑几次? 5次,1次
  • 如果有5个测试用例,AfterEach跑几次,AfterAIl跑几次? 5次,1次

参数化

@Test注解不能用在参数化中,参数化必须使用Parameter注解,使用Parameter注解之前必须引入依赖

添加Parameter依赖:

image-20230911234835524

@ParameterizedTest和@Test不能一起用。

单参数

public class JunitTest {
    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }

    @ParameterizedTest
    @ValueSource(ints = {1,2,3})//类型的限制~
    void test4(int num){
        System.out.println(num);
    }
    
    @ParameterizedTest
    @ValueSource(strings = {"1","2","3"})
    void test5(String  num){
        System.out.println(num);
    }
}

CSV获取参数

传递一行数据,其中用,分割:

public class JunitTest {
    @ParameterizedTest
    @CsvSource({"1,2,3"})
    void test5(String x,String y,String z){
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
    }
}

传递空字符串:

public class JunitTest {
    @ParameterizedTest
    @CsvSource({"1,2,3,''"})
    void test5(String x,String y,String z,String q){
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(q +"csv");
    }
}

从CSV文件中获取参数:

在resources目录下进行创还能CSV文件。

image-20230912000359389

在csv中写入:

张三,李四,王五
张三2,李四2,王五2
张三3,李四3,王五3

必须是csv文件。文件内部必须以,进行分割。

public class JunitTest {
    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }

    @ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
     void test5(String name){
        System.out.println(name);
    }
}

执行几次取决于csv中有几行。

在CSV文件中写入:

1,张三
2,李四
3,王五

public class JunitTest {
    @ParameterizedTest
    @CsvFileSource(resources = "test2.csv")
    void test5(String id,String name){
        System.out.println("学号: " + id +",姓名: " + name);
    }
}

方法获取参数

public class JunitTest {
    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }

    public static Stream<Arguments> Generator(){
        return Stream.of(Arguments.arguments(1,"张三"),
                Arguments.arguments(2,"李四"),
                Arguments.arguments(3,"王五"));
    }
    @ParameterizedTest
    @MethodSource("Generator")
     void test6(int num ,String name){
        System.out.println(num + " : "+ name);
    }
}

测试方法的执行顺序

public class JunitTest {
    @Test
    void Test1(){
        System.out.println("这是Test1测试用例");
    }
    @Test
    void Test2(){
        System.out.println("这是Test2测试用例");
    }
    @Test
    void A(){
        System.out.println("这是TestA测试用例");
    }
    @Test
    void B(){
        System.out.println("这是TestB测试用例");
    }
}

上面的代码调整位置,无法控制执行顺序。执行顺序是默认的,固定不变动的。

TestMethodOrder指定执行顺序

通过TestMethodOrder注解控制执行顺序:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test1(){
        System.out.println("这是Test1测试用例");
    }
    @Order(2)
    @Test
    void Test2(){
        System.out.println("这是Test2测试用例");
    }
    @Order(3)
    @Test
    void A(){
        System.out.println("这是TestA测试用例");
    }
    @Order(4)
    @Test
    void B(){
        System.out.println("这是TestB测试用例");
    }
}

TestMethodOrder随机顺序

随机运行方式:

@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test1(){
        System.out.println("这是Test1测试用例");
    }
    @Order(2)
    @Test
    void Test2(){
        System.out.println("这是Test2测试用例");
    }
    @Order(3)
    @Test
    void A(){
        System.out.println("这是TestA测试用例");
    }
    @Order(4)
    @Test
    void B(){
        System.out.println("这是TestB测试用例");
    }
}

每次的执行顺序不同。

断言

断言相等

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1,2,3})
    void test5(int  num){
        System.out.println(num);
        Assertions.assertEquals(1,num);//断言相等
    }
}

断言不相等

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1,2,3})
    void test5(int  num){
        System.out.println(num);
        Assertions.assertNotEquals(2,num);//断言不相等
    }
}

断言为null

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void test1(int  num){
        System.out.println(num);
        String str = null;
        Assertions.assertNull(str);
    }
    @ParameterizedTest
    @ValueSource(ints = {2})
    void test2(int  num){
        System.out.println(num);
        String str = "null";
        Assertions.assertNull(str);
    }
}

断言不为null

public class JunitTest2 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void test1(int  num){
        System.out.println(num);
        String str = null;
        Assertions.assertNotNull(str);
    }
    @ParameterizedTest
    @ValueSource(ints = {2})
    void test2(int  num){
        System.out.println(num);
        String str = "null";
        Assertions.assertNotNull(str);
    }
}

测试套件

测试套件需要引入的依赖们:

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency><!-- 注解的依赖 -->
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency><!-- 参数化的依赖 -->
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.9.1</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>

执行类中的代码

java代码的编写:

@Suite
//依次执行JunitTest和JunitTest1和JunitTest2
@SelectClasses({JunitTest.class, JunitTest1.class,JunitTest2.class})
public class RunSuit {

}

执行包中的代码

创建两个包,包中写上自动化的方法

package Package1;
import org.junit.jupiter.api.Test;

public class TestDemo1 {
    @Test
    void test1(){
        System.out.println("Package TestDemo1 test1");
    }
}
package Package2;
import org.junit.jupiter.api.Test;

public class TestDemo2 {
    @Test
    void test2(){
        System.out.println("Package TestDemo2 test2");
    }
}

使用SelectPackages注解来执行包中的代码:

@Suite
@SelectPackages(value = {"Package1","Package2"})
public class RunSuit {

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决react使用redux toolkits时出现的数组对象长度始终为0的怪异问题

有个react项目在添加购物车后&#xff0c;立马白屏&#xff0c;看一下console报错properties of undefined(reading length) 那意思是说数组没有长度&#xff0c;然后定位Header.tsx的182行&#xff0c;果然是数组长度报错 回到具体代码中&#xff1a;发现shoppingCartItems实…

大模型存在“反转诅咒”现象,无法处理反向问题;Langchain课程资源

&#x1f989; AI新闻 &#x1f680; 大模型存在“反转诅咒”现象&#xff0c;无法处理反向问题 摘要&#xff1a;最新研究发现&#xff0c;大语言模型存在“反转诅咒”现象&#xff0c;即明知道“A 是 B”&#xff0c;却答不出“B 是 A”。研究人员进行了两项实验&#xff0…

【RocketMQ专题】快速实战及集群架构原理详解

目录 课程内容一、MQ简介基本介绍*作用&#xff08;解决什么问题&#xff09; 二、RocketMQ产品特点2.1 RocketMQ介绍2.2 RocketMQ特点2.3 RocketMQ的运行架构2.4 消息模型 三、RocketMQ快速实战3.1 快速搭建RocketMQ服务3.2 快速实现消息收发3.3 搭建Maven客户端项目3.4 搭建R…

Linear Feedback Shift Register

线性反馈移位寄存器&#xff08;Linear Feedback Shift Register&#xff0c;简称LFSR&#xff09;是一种数字电路设计和密码学中常用的寄存器类型。它是一种简单而高效的方式&#xff0c;用于生成伪随机的二进制序列&#xff0c;并在数据混淆、错误检测和加密等领域中有应用。…

怎么用蜂邮EDM和Outlook批量发送邮件带附件

蜂邮EDM和Outlook批量发送邮件带附件的流程&#xff1f;有哪些邮件批量发送邮件附件的方法&#xff1f; 在现代社会中&#xff0c;电子邮件是一种广泛应用的沟通工具&#xff0c;而批量发送邮件带附件则是许多商业和个人用户的常见需求。本文将介绍如何使用蜂邮EDM和Outlook这…

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiLSTM鹈鹕算…

吉力宝:智能科技鞋品牌步力宝引领传统产业创新思维

在现代经济环境下&#xff0c;市场经济下产品的竞争非常的激烈&#xff0c;如果没有营销&#xff0c;产品很可能不被大众认可&#xff0c;酒香也怕巷子深&#xff0c;许多传统产业不得不面临前所未有的挑战。而为了冲出这个“巷子”&#xff0c;许多企业需要采用创新思维&#…

单片机外设-串口(UART)详情

目录 学习UART要先认识一些基础知识 一&#xff1a;什么是串行、并行通信&#xff1f; &#xff08;1&#xff09;串行通信 串行通信概念&#xff1a; 串行通信的特点&#xff1a; &#xff08;2&#xff09;并行通信 并行通信概念&#xff1a; 并行通信特点&#xff1…

FairMOT 论文学习

1. 解决了什么问题&#xff1f; 现有的多目标跟踪方案将目标检测和 reID 任务放在一个网络里面优化学习&#xff0c;计算效率高。目标检测首先在每一帧中检测出兴趣目标&#xff0c;要么将其与现有的轨迹关联起来&#xff0c;要么创建一个新的轨迹。这两个任务会相互竞争&…

ElasticSearch - 基于 JavaRestClient 操作索引库和文档

目录 一、RestClient操作索引库 1.1、RestClient是什么&#xff1f; 1.2、JavaRestClient 实现创建、删除索引库 1.2.1、前言 1.2.1、初始化 JavaRestClient 1.2.2、创建索引库 1.2.3、判断索引库是否存在 1.2.4、删除索引库 1.3、JavaRestClient 实现文档的 CRUD 1.3…

简单理解三极管导通条件(从电压角度考虑)

1、本文仅描述三极管如何使用&#xff0c;不对三极管的原理做讲解。 2、本文内容如有错误&#xff0c;欢迎交流指正。 3、本文仅作为本人学习笔记&#xff0c;部分内容来源于网络、书籍&#xff0c;如涉及侵权&#xff0c;请联系删除。 三极管的分类&#xff1a;NPN型、PNP型。…

2023中国国际缝制设备展,正运动助力智能缝纫设备“更快更准”更智能!

■展会名称&#xff1a; 2023中国国际缝制设备展览会 ■展会日期 2023年9月25日-28日 ■展馆地点 上海新国际博览中心E6馆 ■展位号 E6-N09 正运动技术&#xff0c;作为国内领先的运动控制企业&#xff0c;将于9月25日参展2023中国国际缝制设备展。展会将在上海新国际博…

【校招VIP】专业课考点之进程同步

考点介绍&#xff1a; 进程同步是指在多个进程之间进行协调&#xff0c;以确保它们在访问共享资源时能够正确、有序地执行。其中最常见的同步机制是互斥锁和信号量 专业课考点之进程同步-相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点试题 1.从执行状态挂…

商品秒杀系统思路

1、使用CAS乐观锁解决秒杀超卖问题。 一开始使用库存&#xff0c;但是发现库存&#xff0c;结果发现没卖完。然后就通过CAS判断库存大于0。 2、又发现问题&#xff0c;一个用户可以下好几单&#xff0c;所以想到用商品id和用户id做个唯一索引&#xff0c;解决了&#xff0c;但…

【剑指Offer】76.删除链表中重复的结点

题目 在一个排序的链表中&#xff0c;存在重复的结点&#xff0c;请删除该链表中重复的结点&#xff0c;重复的结点不保留&#xff0c;返回链表头指针。 例如&#xff0c;链表 1->2->3->3->4->4->5 处理后为 1->2->5 数据范围&#xff1a;链表长度满…

二、浏览器--事件循环(也叫事件环,也叫event loop)--任务队列(等待执行的任务(存放的定时器,http,事件等进程))--渲染三者的关系

引用B站视频&#xff0c;搜索标题&#xff1a;【事件循环】【前端】事件原理讲解&#xff0c;超级硬核&#xff0c;忍不住转载 本视频总结&#xff1a; 超级复杂的JS底层。事件循环和事件队列的关系。宏任务、微任务和raf回调这3个事件队列的关系。任务队列和执行栈的关系。d…

LeetCode 第113 双周赛补题

使数组成为递增数组的最少右移次数3 class Solution { public:int minimumRightShifts(vector<int>& nums) {int n nums.size();int j -1;for (int i 0;i < nums.size()-1;i ) {if (nums[i1] < nums[i]) {j i1;break;}}int k j1;if (j -1) return 0;for…

Vue 05 MVVM模型

MVVM模型 M&#xff1a;模型(Model) &#xff1a;data中的数据V&#xff1a;视图(View) &#xff1a;模板代码VM&#xff1a;视图模型(ViewModel)&#xff1a;Vue实例 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>理…

accesskey_tools AWS红队利用工具:强大的云安全评估和渗透测试工具

一、简介 accesskey_tools是一款专为云环境渗透设计的红队利用工具。本文将介绍accesskey_tools的功能和用途&#xff0c;并探索其在安全评估和渗透测试中的价值和实际应用。 二、工具下载 【点击下载工具】 三、安装依赖 cd aws/aliyun/tencentcloud #进入相应的云服务平…

MySQL数据库描述以及安装使用

一&#xff1a;数据库介绍 数据库 数据库就是用来存储数据的一种特殊文件。 数据库类别 数据库主要分为两种&#xff1a; 关系型数据库RDBMS 非关系型数据库 关系型数据库的主要产品&#xff1a; oracle&#xff1a;在以前的大型项目中使用,银行,电信等项目 mysql&#xff1a;…