【软件测试开发】Junit5单元测试框架

news2024/9/25 11:11:06

目录

  • 1. 注解
    • @Test 注解
    • @BeforeEach @BeforeAll
    • @AfterEach @AfterAll
  • 2. 断言 assert
    • assertequals
    • assertTrue assertFalse
    • assertNull assertNotNull
  • 3. 用例执行顺序
    • 方法排序,通过 @Order 注解来排序
  • 4. 测试套件 Suite
  • 5. 参数化单参数
    • strings
    • ints
  • 6. 参数化多参数
    • @CsvSource
    • @CsvFileSource
  • 7. 动态参数
    • 动态参数单参数
    • 动态参数多参数

● 实现自动化测试需要 selenium基本语法+Junit单元测试框架才能完成自动化测试
Junit是一个开源的Java语言的单元测试框架,Junit是Java方向使用最广泛的单元测试框架,使用Java开发者都应当学习Junit并且掌握单元测试的编写

selenium和Junit:假如要实现一个灯泡,selenium就是灯泡,Junit就是电源

首先需要在pom文件中引入Junit依赖:

    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher -->
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite-api -->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</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 能够表示一个方法/用例
在不引入注解的情况下执行测试方法需要在Java main方法中去执行,使用注解之后只需要在要执行的测试方法上面加上 @Test 注解即可直接进行测试方法的执行:

public class JunitAutoTest {
   private final ChromeDriver chromeDriver=new ChromeDriver();
   public void start(){
       chromeDriver.get("https://www.baidu.com/");
   }
   @Test
    public void zhujieTest() throws InterruptedException {
       start();
       chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("junit");
       chromeDriver.findElement(By.cssSelector("#su")).click();
       Thread.sleep(3000);
       end();
    }
    public void end(){
       chromeDriver.quit();
    }
}

不需要再次创建一个runtest类来执行,大大加快了测试执行;

@BeforeEach @BeforeAll

@BeforeEach :表示被注解的方法应该在其他方法执行之前都执行一遍

public class JunitAutoTest {

    @BeforeEach
    public void aaa(){
        System.out.println("pre");
    }

    @Test
    public void bbb(){
        System.out.println("bbb");
    }

    @Test
    public void ccc(){
        System.out.println("ccc");
    }
    
}

在 aaa 方法上加了 @BeforeEach 注解表示在执行 bbb,ccc方法之前都会各自执行一次aaa方法,打印 pre:
在这里插入图片描述
@BeforeAll :表示在其他方法执行之前只需要执行一遍
● 使用 @BeforeAll 注解的方法必须定义为static静态方法

public class JunitAutoTest {

    @BeforeAll // 必须定义为static方法,否则报错
    public static void aaa(){
        System.out.println("pre");
    }

    @Test
    public void bbb(){
        System.out.println("bbb");
    }

    @Test
    public void ccc(){
        System.out.println("ccc");
    }

}

在执行 bbb ccc 方法之前先执行一遍 aaa 方法,只打印一次 pre:
在这里插入图片描述

@AfterEach @AfterAll

用法和之前的 @BeforeEach 和 @BeforeAll 类似,表示注解的方法应该在其他方法执行之后执行:
@AfterEach:表示被注解的方法应该在其他方法执行之后都执行一遍:

public class JunitAutoTest {

    @AfterEach
    public  void aaa(){
        System.out.println("pre");
    }

    @Test
    public void bbb(){
        System.out.println("bbb");
    }

    @Test
    public void ccc(){
        System.out.println("ccc");
    }

}

在这里插入图片描述
@AfterAll:表示在其他方法执行之后只需要执行一遍
● 使用 @AfterAll 注解的方法必须定义为static静态方法

public class JunitAutoTest {

    @AfterAll
    public  static void aaa(){
        System.out.println("pre");
    }

    @Test
    public void bbb(){
        System.out.println("bbb");
    }

    @Test
    public void ccc(){
        System.out.println("ccc");
    }

}

在这里插入图片描述

2. 断言 assert

写自动化测试,结果分为成功或者失败的,怎么评判结果是成功还是失败,就需要用到 assert 断言操作

assertequals

● assertequals(expect,actual)

public class AssertTest {
    private final ChromeDriver chromeDriver=new ChromeDriver();

    /**
     * 测试百度首页元素是否正确
     */
    @Test
    void equalsTest(){
        chromeDriver.get("https://www.baidu.com/");
        String value = chromeDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        Assertions.assertEquals("百度一下",value);

    }
}

断言成功:
在这里插入图片描述
断言失败:
在这里插入图片描述
同理还可以判断不相等:assertNotEquals

    @Test
    void equalsTest(){
        chromeDriver.get("https://www.baidu.com/");
        String value = chromeDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        Assertions.assertNotEquals("百s度一下",value);
        chromeDriver.quit();

    }

此时不相等,断言成功:
在这里插入图片描述

assertTrue assertFalse

assertTrue assertFalse 参数是表达式,也就是Boolean类型的

  @Test
    void assertTrueTest(){
        chromeDriver.get("https://www.baidu.com/");
        String value = chromeDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        Assertions.assertTrue(value.equals("百度一下")); // true 执行通过
        chromeDriver.quit();

    }

assertFalse 同理

assertNull assertNotNull

   @Test
    void assertNull(){
        String a=null;
        Assertions.assertNull(a);
    }

a是null,执行通过

 @Test
    void assertNull(){
        String a=null;
        Assertions.assertNotNull(a);
    }

a是null,执行不通过
在这里插入图片描述

3. 用例执行顺序

Junit默认执行顺序是不确定的,官方文档没有明确给出
官方文档地址:https://junit.org/junit5/
但是我们仍然可以使用Junit里提供的方法来手动设置用例的执行顺序
文档中给出的排序方法非常多,诸如方法的排序,标签的排序。。。。

方法排序,通过 @Order 注解来排序

当多个测试用例之间没有解耦,存在前后关联关系,就需要手动指定用例的执行顺序,否则就无法控制用例的执行先后顺序出现错误

@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 标注当前类使用方法来进行排序
public class RunOrderTest {
    @Test
    @Order(1) // 明确标注具体执行顺序
    void print(){
        System.out.println("aaa");
    }
    @Test
    @Order(2)

    void show(){
        System.out.println("bbb");
    }
    @Test
    @Order(3)

    void dayin(){
        System.out.println("ccc");
    }
    @Test
    @Order(4)

    void shuchu(){
        System.out.println("ddd");
    }
}

所以在编写测试用例时候尽量保持测试用例的独立性,如果存在关联关系记得手动指定用例的执行顺序
● @TestMethodOrder(MethodOrderer.OrderAnnotation.class) +
@Order(顺序)

4. 测试套件 Suite

平时执行一次单元测试只能执行一个类,要是想一次性执行多个类中的测试用例方法,就需要用到测试套件

  1. 指定类,添加到套件中并执行
    在这里插入图片描述
    打包执行成功:
    在这里插入图片描述
  2. 选择指定的包,添加到套件中执行
    ● 使用指定的包来添加套件的前提,所有的文件都需要以Test,tests命名(包含),同时我们的用例都必须要加上 @Test 注解
    在这里插入图片描述
    在这里插入图片描述
    包里面的类命名要带上 test 才能够被识别到
    打包执行成功:
    在这里插入图片描述

5. 参数化单参数

参数化用到的注解: @Parameterizetest 标注方法类型为参数化
强调参数的来源:
需要添加参数的来源:
@ValueSource(类型={参数1,参数2,…}) (类型:ints,String,floats ,… 使用原生类型)
valuesource中支持的类型:
在这里插入图片描述
参数化举列:

strings

public class ParameterizdTest {
    @ParameterizedTest // 不需要添加 @test 注解,否则方法会多执行一遍
    @ValueSource(strings = {"昕上","萌萌","旺财","咪咪"})
    void myTest(String name){
        System.out.println(name);
    }
}

在这里插入图片描述

ints

  @ParameterizedTest
    @ValueSource(ints = {10,20,30,40})
    void printAge(int age){
        System.out.println(age);
    }

在这里插入图片描述

6. 参数化多参数

@CsvSource

用到的核心注解: @CsvSource(value={“心上,20”,“萌萌,10”,“旺财,70”,“咪咪,99”})
默认的分隔符是逗号“,”

 @ParameterizedTest
    @CsvSource(value = {"心上,20","萌萌,10","旺财,70","咪咪,99"})
    void printNameAndAge(String name,int age){
        System.out.println("name:"+name+","+"age:"+age);
    }

如果觉得逗号不好看,也可以自定义分隔符,通过 delimiterString = “xx” 进行设置:

  @ParameterizedTest
    @CsvSource(value = {"心上-20","萌萌-10","旺财-70","咪咪-99"},delimiterString = "-")
    void printNameAndAge(String name,int age){
        System.out.println("name:"+name+","+"age:"+age);
    }

在这里插入图片描述
如果遇到赋值的值包含了分隔符的特殊情况,需要使用单引号 ‘’ 来进行转义,否则会报错:
在这里插入图片描述
加上单引号:

 @ParameterizedTest
    @CsvSource(value = {"'心,上',20","萌萌,10","旺财,70","咪咪,99"})
    void printNameAndAge(String name,int age){
        System.out.println("name:"+name+","+"age:"+age);
    }

在这里插入图片描述
正确赋值,执行通过

@CsvFileSource

如果参数非常的多,在代码中编写不太好看,就可以借助文件注入的方法来添加;
@CsvFileSource(指定文件路径)

    @ParameterizedTest
    @CsvFileSource(resources = "/my.csv")
    void csvFileSource(String name,int age){
        System.out.println("name:"+name+","+"age:"+age);
    }

指定文件路径为当前项目下resources文件夹中的.csv文件:
在这里插入图片描述
读取成功,成功赋值:
在这里插入图片描述
也可以读取本地目录下的任意csv文件:
在这里插入图片描述

  @ParameterizedTest
    @CsvFileSource(files = "D:\\code\\file.csv")
    void csvFileSource2(String name,int age){
        System.out.println("name:"+name+","+"age:"+age);
    }

读取成功:
在这里插入图片描述
在这里插入图片描述
同时也可以赋null值,也就是对应的位置不填写值即可:

   @ParameterizedTest
    @CsvSource(value = {",20","萌萌,10","旺财,70","咪咪,99"})
    void printNameAndAge(String name,int age){
        System.out.println("name:"+name+","+"age:"+age);
    }

在这里插入图片描述
数字类型的参数必须有值,否则导致用例执行失败

7. 动态参数

动态参数单参数

核心注解:@MethodSource(“”)
参数为数据来源的方法名

   // 动态参数
    @ParameterizedTest // 参数化注解
    @MethodSource("getName") // 提供参数数据的方法,双引号内填写具体方法名
    void dongtaiParamet(String name){
        System.out.println(name);
    }
    // 提供数据的方法,返回值可以是stream流
    static Stream<String> getName(){
        return Stream.of("心上","萌萌","旺财");
    }

需要注意提供参数数据的方法返回值可以是 stream流,stream流里面设置填写返回值:
在这里插入图片描述
● 同时需要设置返回数据的方法是静态方法,static
获取成功:
在这里插入图片描述
同样,也可以不进行具体获取参数值方法名称设置,只需要获取参数值的方法名称和测试方法名称保持一致即可识别:
在这里插入图片描述
获取成功:
在这里插入图片描述

动态参数多参数

返回多参数使用 Arguments.arguments(参数1,参数2) …

  @ParameterizedTest
    @MethodSource
    void dongtaiParamsTest(String name,int age){
        System.out.println("name:"+name+","+"age:"+age);
    }
    // 返回多参数使用 Arguments.arguments(参数1,参数2) ...
    static Stream<Arguments> dongtaiParamsTest() {
        return Stream.of(Arguments.arguments("心上",10),Arguments.arguments("萌萌",20));
    }

参数获取成功
在这里插入图片描述

  • Junit5 over ~

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

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

相关文章

File类

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 ✈️推荐一款模拟面试&#xff0c;刷题神器…

2. SpringMVC 请求与响应

文章目录1. 请求映射路径2. 请求参数2.1 get 请求发送普通参数2.2 post 请求发送普通参数2.3 五种类型的参数传递2.4.1 普通参数2.4.2 POJO 数据类型2.4.3 嵌套 POJO 类型参数2.4.4 数组类型参数2.4.5 集合类型参数3. json 数据传输参数&#xff08;重点&#xff09;3.1 传输 j…

C语言(C预编译指令)

目录 1.undef 2.条件编译#ifdef,#else和#endif 3.#ifndef 4.#if和#elif 5.预定义宏 6.#line和#error 7.#pragma 1.undef #undef指令用于取消已定义的#define指令 #define LIMIT 400 #undef LIMIT 如果想使用一个名称但又不确定之前是否已经用过&#xff0c;为了安全起…

Python中的进程线程

文章目录前言多进程与多线程基本概念多进程multiprocessing 类对象进程池subprocess模块进程间通信多线程threading实现线程操作线程共享所有变量线程锁参考资料前言 又花了点时间学习了一下Python中的多线程与多进程的知识点&#xff0c;梳理一下供复习参考 多进程与多线程 …

JUC并发编程与源码分析

一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…

离线数据仓库

1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 &#xff08;1&#xff09;保持数据原貌不做任何修改&#xff0c;起到备份数据的作用。 &#xff08;2&#xff09;数据采用压缩&#xff0c;减少磁盘存储空间&#xff08;例如&#xff1a;压缩采用LZO&…

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时&#xff0c;服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中&#xff0c;有说到过&#xff0c;事务发起者在发现分支事务执行异常之后&#xff0c;会提交全局事务回滚的请求到netty服务端&#xff0c;这里是发…

Python 解决dilb和face_recognition第三方包安装失败

目录 dilb和face_recognition第三方包安装失败 亲测有效的解决方法&#xff1a;whl安装方式 dilb和face_recognition第三方包安装失败 场景复现&#xff1a;因为需要用到dlibface_recognition&#xff0c;基于OpenCV做一些人脸识别的项目&#xff0c;在Pycharm中进行pip清华…

图解LeetCode——剑指 Offer 24. 反转链表

一、题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 二、示例 示例: 【输入】 1->2->3->4->5->NULL 【输出】 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 三、…

Linux | Linux卸载和安装MySQL(Ubuntu版)

最近又来到了Linux学习了&#xff0c;原因是要接触云服务器相关知识&#xff0c; 所以博主整理了一些关于Linux的知识&#xff0c; 欢迎各位朋友点赞收藏&#xff0c;天天开心丫&#xff0c;快乐写代码&#xff01; Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…

Angular4 中 ckeditor5 插件的使用

Angular4 中 ckeditor5 插件的使用 0 环境、新建项目 环境&#xff1a; Windows10Angular/cli1.4.10&#xff08;安装 Angular 的过程略过&#xff0c;Angular4 版本比较古老&#xff0c;这也导致项目安装插件及其他操作比较麻烦&#xff09; 1. ckeditor5 官方用法 基础用…

邂逅TypeScript基础语法

文章目录p26认识TypeScriptTypeScript的编译环境ts初体验ts环境搭建变量的定义p27number类型booleanArrayObjectSymbolanyunknownvoidnevertuple联合ts中文文档学习-非官方网站 p26 认识TypeScript TypeScript的编译环境 ts初体验 ts环境搭建 第二种方式 webpack.config…

论文阅读_图像生成文本_CLIP

name_en: Learning Transferable Visual Models From Natural Language Supervision name_ch: 从自然语言监督中学习可迁移的视觉模型 paper_addr: http://arxiv.org/abs/2103.00020 doi: 10.48550/arXiv.2103.00020 date_read: 2023-02-09 date_publish: 2021-02-26 tags: [‘…

【1138. 字母板上的路径】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为 board ["abcde", "fghij", "klmno", "pq…

文本比对工具【UltraCompare附安装包】Mac和Windows下载使用

UltraCompare 强大的文件&#xff0c;文件夹&#xff0c;PDF, Word和Excel比较。文件夹同步&#xff0c;二进制/十六进制比较。下载一个免费的全功能试用版&#xff0c;看看为什么。适用于Windows、Mac和Linux。 文章目录软件功能1、文本比较2、快速二进制比较3、智慧二进制比较…

Python快速上手系列--类--详解篇

本章是自动化测试的真正开始&#xff0c;因为在后续的过程中&#xff0c;你会接触到unittest框架&#xff0c;pytest框架&#xff0c;而不仅仅只是写一个函数selenium脚本这么简单了。1、创建类1.1、了解类我们首先了解一下&#xff0c;为什么要使用类&#xff0c;类可以拿来干…

2023同等学力申请硕士计算机综合国考

同等学力国考报名要开始了 2023年2月15日&#xff0c;中国教育考试网和“全国同等学力人员申请硕士学位管理工作信息平台”&#xff08;https://tdxl.chsi.com.cn&#xff0c;联系服务电话&#xff1a;010-67410388&#xff09;公布报名工作通知。考生须按照通知要求进行注册或…

Win11下Linux子系统迁移方法及报错解决

Win11 将Linux子系统从C盘迁移到其他盘Win11下Linux子系统迁移方法及报错解决1、下载LxRunOffline2、ERROR&#xff1a;directory is not empty 报错解决参考链接Win11下Linux子系统迁移方法及报错解决 C盘满了&#xff0c;Ubuntu子系统占了100多G怎么办&#xff1f;直接将子系…

相机出图画面一半清晰,一半模糊的原因是什么?

1、问题背景&#xff1a;在做项目的过程中&#xff0c;有遇到过几次&#xff0c;出图后画面是一半清晰&#xff0c;一半模糊的现象&#xff0c;再重新对焦也是一样。但换了个镜头后就好了&#xff0c;这应该是镜头的质量问题&#xff0c;但导致镜头出现这种问题的具体原因是什么…

【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity游戏制作 ⭐mango的基础动作动画的添加⭐ 文章目录⭐mango的基础动作动画的添加⭐&#x1f…