【测试开发】Junit 框架

news2024/12/23 17:14:06

目录

一. 认识 Junit

二. Junit 的常用注解

1. @Test

2. @Disabled

3. @BeforeAll

4. @AfterAll 

5. @BeforeEach

6. @AfterEach 

7. 执行测试

 三. 参数化

1. 引入依赖 

2. 单参数 

3. 多参数

3.1 通过CSV实现

3.2 通过方法实现 

4. 测试用例的执行顺序 

四. 断言

五. 测试套件 


一. 认识 Junit

Junit 是针对 Java 的一个单元测试框架,在上一篇文章中也介绍了 selenium ,它是自动化测试框架。

他们两者之间可以这样来认识:selenium是用来写自动化测试用例的技术,而Junit是用来管理已经编写好的测试用例的技术;

二. Junit 的常用注解

首先需要引入依赖:

 <!-- 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>
        </dependency>

1. @Test

@Test 注解用于方法上面,表示当前的方法是一个测试用例,通过@Test注释后的方法,不需要在main中,也可以直接运行。 

     @Test
     void Test01(){         // 此处要么不写,要么写 public,写别的就不被当成测试用例了
        System.out.println("这是 junit 里面的 test01");
    }

 2. @Disabled

 当使用 @Disabled 注释时,表示当前的测试用例不执行。

3. @BeforeAll

@BeforeAll 表示当前的测试用例在所有测试用例开始执行之前先执行。 

需要注意的是:@BeforeAll 注释的方法必须是静态的,只会执行一次。

联系到前面所学的自动化测试,我们通常可以将 创建驱动,打开网页的操作 放在此注解下。

4. @AfterAll 

@AfterAll 表示当前的测试用例在所有测试用例执行完之后再开始执行。

需要注意的是:@AfterAll 注释的方法必须是静态的,只会执行一次。

联系到前面所学的自动化测试,我们通常可以将 关闭浏览器 放在此注解下。

5. @BeforeEach

@BeforeEach 表示执行每一个测试用例之前,都会先执行一遍当前的方法。

6. @AfterEach 

@AfterEach 表示执行每一个测试用例之后,都会先执行一遍当前的方法。

7. 执行测试

根据上述的注解,可以观察以下代码的执行结果。 

public class JunitTest {
    
    @Test
     void Test01(){         // 此处要么不写,要么写 public,写别的就不被当成测试用例了
        System.out.println("这是 junit 里面的 test01");
    }

    @Disabled
        //类似于 @ignore 但是 @ignore 不属于junit,表示不执行
    void Test02(){
        System.out.println("不执行");
    }

    @BeforeAll              // 注意static修饰,在所有测试用例之前先执行
    static void Test03(){
        System.out.println("beforeAll");
    }

    @AfterAll               // 注意static修饰,在所有测试用例之后再执行
    static void Test04(){
        System.out.println("afterAll");
    }

    @BeforeEach
    void Test05(){
        System.out.println("执行 BeforeEach");
    }

    @AfterEach
    void Test06(){
        System.out.println("执行 AfterEach");
    }

    @Test
    void Test07(){         // 此处要么不写,要么写 public,写别的就不被当成测试用例了
        System.out.println("这是 junit 里面的 test07");
    }
}

 三. 参数化

当执行测试用例的时候,有时候是需要进行参数化的。

主要使用注解:@ParameterizedTest    表示参数注册,也表示测试用例

注意:@ParameterizedTest 和 @Test 不能同时使用

1. 引入依赖 

<!-- 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>

2. 单参数 

单参数,指的是传递的参数类型是单种形式的。

主要使用注解:@ValueSource( 参数类型 )

参数类型可以有多种形式:

    @ParameterizedTest               // 参数注册
    @ValueSource(ints = {1,2,3})    // 单参数:传递数据的类型是单种形式的
    void Test08(int num){
        System.out.println(num);    // 参数有三个,会执行三次
    }

 

3. 多参数

多参数,指的是传递的参数可以是多种类型的。 

3.1 通过CSV实现

首先可以使用 @CsvSource("参数") 可以将参数直接传入,可以传入多种类型的参数;

例如:@CsvSource(" 1,2,'你好' ");

    @ParameterizedTest
    @CsvSource({"1,2,'你好呀',''"})          // 此处可以将数据直接放入
    void Test01(int x,int y,String z,String q){
        System.out.println(x);          // 1
        System.out.println(y);          // 2
        System.out.println(z);          // 你好呀
        System.out.println(q);          // 空字符串
        System.out.println("============");
    }

也可以使用 @CsvFileSource(resource = "csv文件") 

这个方法一般会在resources路径下,创建一个 csv文件 ,将想要传入的参数写入 csv文件中即可 。每一次运行就对应 csv文件中的一行。

    @ParameterizedTest
    @CsvFileSource(resources = "test02.csv")
    void Test02(int num,String name){
        System.out.println(num + ":" + name);
    }

 

3.2 通过方法实现 

通过 @MethodSource("方法名") 注解来实现,要构造方法名对应的方法 ,在对应的方法中,返回相应类型的参数。        

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

public static Stream<Arguments> Generate() {
        return Stream.of(Arguments.arguments("1,张三","2,李四","3,王五"));
    }
    @ParameterizedTest
    @MethodSource("Generate")
    void Test03(String numName1,String numName2,String numName3){
        System.out.println(numName1+"  "+numName2+"  "+numName3);
    }

4. 测试用例的执行顺序 

当需要对测试用例进行顺序执行的时候,就需要到注解

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)

不需要顺序执行就默认为:

@TestMethodOrder(MethodOrderer.Random.class)

应该注意的是:无顺序,并不是默认从上到下执行,此处的执行顺序是根据 Junit 的运行机制来的。

这两个注解是用在类上的;

然后还需要再对应的方法上加上注解 @Order() 来进行想要的执行顺序规定


 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)       // 按顺序
 //@TestMethodOrder(MethodOrderer.Random.class)            // 无顺序( 不一定是从上到下,是根据junit的运行机制来的 )
public class JunitTest02 {
    @Order(2)
    @Test
    void Test01(){
        System.out.println("111");
    }
    @Order(1)
    @Test
    void Test02(){
        System.out.println("222");
    }
    @Order(4)
    @Test
    void Test03(){
        System.out.println("333");
    }
    @Order(3)
    @Test
    void Test04(){
        System.out.println("444");
    }
}

 当不需要顺序执行的时候,可以看出也并不是从上到下执行的,验证了上述的内容:

四. 断言

写自动化测试,结果要么是成功的,要么是失败的,不存在成功一半的情况。

那么就需要使用到断言:assert,断言预期结果真实结果是否一致。

主要用到的方法就是:

断言相等:Assertions.assertEquals(预期结果,实际值) -- 两者相等,测试通过

断言不相等:Assertions.assertNotEquals(预期结果,实际值) -- 两者不相等,测试通过

断言为空:Assertions.assertNull(参数) -- 参数为空,测试通过

断言不为空:Assertions.assertNotNull(参数) -- 参数不为空,测试通过

 以下代码都可以测试通过: 

public class JunitTest03 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test01(int num){
        System.out.println(num);
        Assertions.assertEquals(1,num);     // 等于 1 测试通过
        Assertions.assertNotEquals(2,num);      // 不等于 2 测试通过
        String str = "null";
        String str2 = null;
        Assertions.assertNull(str2);         // 值为空,则测试通过
        Assertions.assertNotNull(str);          // 值不为空,测试通过
    }
}

五. 测试套件 

测试套件,主要就是用于把想执行的测试用例执行起来。 

使用注解:@Suite作用于类上;

 需要引入依赖

<!--            测试套件-->
        <!-- 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. @SelectClasses({指定类}) 通过参数中指定对应的类,然后对类中的测试用例进行执行,此处又有后顺序;作用于类上

  2. @SelectPackages({"指定包"}) 通过参数中指定对应的包,然后对包中的测试用例进行执行,但是扫描的包不可以和当前的类在同一个包下面;作用于类上

 

 

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

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

相关文章

设计模式【结构型】-- 装饰者模式

装饰模式&#xff08;Decorator Pattern&#xff09; 定义 装饰者模式是一种结构型设计模式&#xff0c;它允许你动态地将新功能添加到对象中&#xff0c;通过将对象放入包含这些功能的特殊包装器对象中。这样一来&#xff0c;你可以在运行时通过组合不同的对象来扩展功能&…

用手机号注册亚马逊买家号需要注意什么问题

亚马逊平台的买家号可以用手机号注册也可以用邮箱进行注册&#xff0c;注册方法都是打开官网后点击注册&#xff0c;根据提示输入账号信息。当使用手机号注册亚马逊买家号时&#xff0c;有一些问题需要注意&#xff1a; 1、确保手机号的准确性&#xff1a;正确的手机号码非常重…

Android 系统的分区介绍

由于Android系统采用Linux架构&#xff0c;所以Android的系统分区可以类比同样采用Linux架构的操作系统&#xff08;如Windows&#xff09;。 Android系统分区分类 现在一般常见的Android分区方式共有三种&#xff0c;在不同的Android系统版本上会采用不同的分区方式。 1、传…

CentOS 7.8 Oracle 19C安装部署

CentOS 7.8 Oracle 19C安装部署 一、环境检查1、操作系统检查2、内存检查3、SWAP检查4、共享内存检查5、磁盘空间检查 二、YUM配置及RPM依赖包安装1、YUM源搭建2、 RPM依赖包安装 三、创建组、用户、目录1、创建组、用户2、创建目录 四、系统参数配置1、关闭防火墙2、配置域名解…

跟我一起从零开始学python(七)机器学习

前言 回顾之前讲了python语法编程 &#xff0c;必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;昨天和今天讲到了数据库编程篇MySQL&#xff0c;Redis今天第三篇MongoDB篇&#xff0c;前面没看的也不用往前翻&#xff0c;系列文已经整理好了&a…

【Axure高保真原型】美化滚动条模板

今天和大家分享美化滚动条的原型模板&#xff0c;包括美化动态面板滚动条、页面滚动条、内联框架滚动条&#xff0c;其中内联框架滚动条是通过美化对应调用的页面的滚动条而美化&#xff0c;并不是直接美化内联框架的滚动条。具体效果可以观看下方视频或者打开预览地址体验&…

个人微信开发API,微信机器人。

微信个人号二次开发&#xff0c;基于API开发可以有很多功能模块 各种知名SCRM系统、客服平台都是根据此API二次开发的。 在这里插入图片描述 好友管理&#xff1a; 添加好友、 删除好友、 修改备注、 创建标签、 获取好友列表、 检测僵尸粉 设置个人头像 同意添加好友 获取好…

【面试题38】linux下面chmod和chown使用详解

文章目录 一、前言二、什么是 chmod 命令&#xff1f;2.1 使用方法&#xff1a;2.2 数值表示法&#xff1a;2.3 符号表示法&#xff1a; 三、什么是 chown 命令&#xff1f;3.1 使用方法&#xff1a;3.2 更改所有者和用户组&#xff1a; 四、使用示例4.1 使用 chmod 命令修改权…

想要逼疯项目经理,真的太简单了

早上好&#xff0c;我是老原。 最近有个小友来找我吐槽&#xff0c;说太崩溃了&#xff0c;带个项目太不容易了…… 此情此景&#xff0c;我已经脑补了各种抱头痛哭流涕的画面&#xff0c;油然升起一股同情。 其实&#xff0c;项目经理&#xff0c;听起来是个经理&#xff0…

echarts条形图动态显示2

1、实现效果&#xff0c;条形图自动滚动&#xff0c;鼠标移入停止滚动&#xff0c;移出继续滚动 2、代码 声明的变量&#xff1a;图表&#xff0c;图表数据与定时器 myChartArea: , dataArea: {categoryData: [],valueData: [],fullData: [], }&#xff0c; timeOut: null,设…

【无公网IP端口映射】远程访问本地jupyter notebook服务

文章目录 前言1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook&#xff0c;它是一个交互式的数据科学和计算环境&#xff0c;支持多种编程语言&#xff0c;如…

Devchat让代码爽飞

Devchat让代码爽飞 安装python3安装vscode中安装devchat插件使用参考资料 devchat是一个免费的vscode插件&#xff0c;可以在vsocde中提示代码。 安装 devcha依赖于python3&#xff0c;首先需要再电脑中安装python3.然后在vscode中安装插件&#xff0c;然后利用python安装dev…

canal探索及应用

认识canal 译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方式主要是基于业务 trigger 获取增量变更。从 2010 年…

冷门研究冒险家同济陈涵晟:让科技帮助未来人类拓展艺术边界

原来他们是这样走过来的&#xff01; 【AI红人荟】——这里是TechBeat人工智能社区为优秀的AI工作者开设的人物专访栏目。从膜拜“红人”到成为“红人”&#xff0c;TechBeat与你一起&#xff0c;在AI进阶之路上&#xff0c;升级打怪、完美通关~ 本篇人物&#xff0c;是来自同…

消息中间件RabbitMQ详解

一、 消息中间件 简介 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型&#xff0c;它可以在分布式环境下扩展进程间的通信。 使用环境 消息中间件适用于需要可靠的数据传送…

超细整理,接口自动化测试-DDT参数化驱动实战,一招打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 ddt说明 一般进行…

MySQL数据库——索引练习

一、练习题目 1、建立一个utf8编码的数据库test1 2、建立商品表goods和栏目表category&#xff08;要求&#xff1a;按如下表结构创建表&#xff0c;并且存储引擎engine myisam 字符集charset utf8&#xff09; 3、删除 goods 表中的 goods_desc 字段及货号字段,并增加 click…

JMeter中如何实现接口之间的关联?

关联是Jmeter工具中非常重要的一个技术。因为在测试过程过有些数据是经常发生变化的&#xff0c;要获取并使用这些数据&#xff0c;就要使用关联。 比如&#xff1a;用户登录后&#xff0c;session信息都不同&#xff0c;有些操作要使用session&#xff0c;就需要将这个动态的…

【国产复旦微FMQL45教程】-Procise应用流程

本教程采用 FMQL7045 FPGA开发板来完成整个试验&#xff0c;板卡照片如下&#xff1a; 具有丰富的接口资源&#xff0c;系统框图如下&#xff1a; 本教程用于完成基于Vivado的FMQL45的LED实验&#xff0c;目标是能够将这款开发板PL端先跑起来。 2 Procise工程建立 &#xff0…

AI绘画在线生成!推荐这个国产Midjourney平替

AI技术越来越成熟&#xff0c;不仅能生成文本&#xff0c;还能绘画。AI绘画软件层出不穷&#xff0c;很多人接触的是Midjourney。我之前也用过Midjourney&#xff0c;确实在作品精确度、图像细节等方面很出色。但用Midjourney需要有良好的网络&#xff0c;而且必须得是会员。 因…