详解自动化之单元测试工具Junit

目录

1.注解

1.1 @Test

1.2 @BeforeEach

1.3 @BeforeAll

1.4 @AfterEach

1.5 @AfterAll

2. 用例的执行顺序

通过 @order() 注解来排序

3. 参数化

3.1 单参数

3.2 多参数

3.3 多参数(从第三方csv文件读取数据源)

3.4 动态参数@ParameterizedTest + @MethodSource()

4. 测试套件

4.1 指定类来运行实例@Suite + @SelectClasses

4.2 指定包名来运行包下所有测试用例

5. 断言 Assertions类

5.1 断言匹配/不匹配Assertions.assertEquals()

5.2 断言结果为真/假Assertions.assertTrue()

5.3 断言结果为空/非空Assertions.assertNull()


 

自动化就是 selenium 脚本来实现的,junit 是 java 的单元测试工具,只不过在实现自动化的时候需要借用一下 junit 库里面提供的一些注解

注:博主的版本为 Junit5,支持的 Java 版本最低要为 8

添加依赖:

<dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope>
</dependency>

1.注解

1.1 @Test

@Test 表示当前方法为测试方法,执行这个类的时候会自动执行这个注释下的所有方法

public class JunitTest {@Test//表示当前方法是测试方法,执行这个类时会自动执行这个类下的所有带 @Test 注解的用例void baseZhujie(){System.out.println("这是一个测试方法");}@Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
}

1.2 @BeforeEach

@BeforeEach 当前方法需要在每个用例执行之前都执行一遍

    @BeforeEach// 表示当前方法需要在每个用例执行之前都执行一遍
//    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.3 @BeforeAll

@BeforeAll 表示当前方法需要在所有用例执行之前执行一次

    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
//    @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.4 @AfterEach

@AfterEach 表示当前发给发需要在每个用例执行之后都执行一遍

    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍
//    @Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.5 @AfterAll

@AfterAll 表示当前用例需要在每个用例执行之后执行一遍

    @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}//    @BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
//    @AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍@AfterAll// 当前方法需要在所有用例执行之后执行一次
//    @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

注意:

@BeforeAll 和 @AfterAll 修饰的方法需要用 static 进行修饰才能正常运行

 

2. 用例的执行顺序

在先前我一直以为用例的执行顺序是按照排列顺序来执行的:

对比这两个实例中的用例的执行顺序,我又产生了是不是按照方法名的字母顺序来执行的呢?

但是后面我才了解到官方网站是并没有说明用例默认的执行顺序的!!

通过 @order() 注解来排序

  1. 要先使用注解说明当前类下所有的用例需要使用 order 注解来进行排序
  2. 然后通过 Order 来指定用例的具体执行顺序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)// 通过 order 来排序
public class JunitTest {@Order(1)@Testvoid editloginTest(){System.out.println("loginTest");}@Order(3)@Testvoid AindexTest(){System.out.println("indexTest");}@Order(2)@Testvoid editTest(){System.out.println("editTest");}
}

3. 参数化

目的:尽可能的用一个用例来模拟多个用户的行为

3.1 单参数

@ParameterzedTest + @ValueSource(数据类型方法 = {参数1,参数2,参数3,…})

    //声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@ValueSource(strings = {"lucky","mary","tom"})void methodPramsTest(String username){System.out.println("name:" + username );}

3.2 多参数

@parameterizedTest + @CsvSource({“”, “”, '", …}) 每个双引号就是一组测试用例

    //声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@CsvSource({"张三,123","李四,123","王五,123"})//多参数(从注解中手动编写数据源)void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}

3.3 多参数(从第三方csv文件读取数据源)

@ParameterizedTest + @CsvFileSource(files = “文件路径+名字”)

这里的这个 csv 文件,不要直接改后缀生成,要用系统自带的 Excel 工具,来打开和编辑 csv 文件

这里出现乱码的情况就是因为没有使用电脑系统自带的Excel来编辑

3.4 动态参数@ParameterizedTest + @MethodSource()

@ParameterizedTest + @MethodSource("方法名")

    @ParameterizedTest@MethodSource("paramSupport")void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}static Stream<Arguments> paramSupport() throws InterruptedException {//构造动态参数String[] arr = new String[5];for (int i = 0; i < arr.length; i++) {Thread.sleep(500);arr[i] = System.currentTimeMillis() + "";}return Stream.of(Arguments.arguments(arr[0],10),Arguments.arguments(arr[1],14),Arguments.arguments(arr[2],13),Arguments.arguments(arr[3],12),Arguments.arguments(arr[4],11));}

注意:当@MethodSource不指定数据源时,会自动寻找与用例方法名相同的静态方法

4. 测试套件

当我们需要测试多个类中的用例时,如果一个类一个类的去运行,那是非常耗时耗力的,

如果我们能够同时运行多个类就很好,所以可以使用测试套件来同时运行多个测试类

4.1 指定类来运行实例@Suite + @SelectClasses

//标识为测试套件类,而不是测试类
@Suite
@SelectClasses({aaa.class,bbb.class,ccc.class})//指定类
public class runSuite {}

注意:想要用例被运行,用例必须要被 @Test 修饰

4.2 指定包名来运行包下所有测试用例

//标识为测试套件类,而不是测试类
@Suite
@SelectPackages("com.junit1121")//指定包名运行包下所有用例
public class runSuite {}

但是我们的运行结果为:

在这里类 aaa,bbb,ccc  中的用例都没有正常运行

那是因为:        

如果使用包名来指定运行的范围,那么该包下来所有的测试类的命名需要以Test/Tests结尾(T必须要大写)

 

 

5. 断言 Assertions类

5.1 断言匹配/不匹配Assertions.assertEquals()

断言匹配:Assertions.assertEquals(期待得到对象,实际得到)

断言不匹配:Assertions.assertNotEquals(期待得到对象,实际得到)

    @Testvoid TestBefo(){ChromeDriver driver = new ChromeDriver();driver.get("https://www.baidu.com");String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");//百度一下// 假如这里获取到的值不是“百度一下”而是“搜狐一下”这就是一个bugSystem.out.println(test);// 断言// 断言匹配/不匹配Assertions.assertEquals("搜狐一下",test);driver.quit();}

5.2 断言结果为真/假Assertions.assertTrue()

断言结果为真:Assertions.assertTrue()

断言结果为假:Assertions.assertFalse()

    @Testvoid ddd(){// 断言结果为真/假
//        Assertions.assertTrue(1==1);Assertions.assertFalse(1==0);}

5.3 断言结果为空/非空Assertions.assertNull()

断言结果为空:Assertions.assertNull()

断言结果为非空:Assertions.assertNotNull()

@Test
void ggg() {String aaa = null;Assertions.assertNull(aaa);//通过
}
@Test
void hhh() {Assertions.assertNotNull("你好");//通过
}

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

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

相关文章

机器学习第12天:聚类

文章目录 机器学习专栏 无监督学习介绍 聚类 K-Means 使用方法 实例演示 代码解析 绘制决策边界 本章总结 机器学习专栏 机器学习_Nowl的博客-CSDN博客 无监督学习介绍 某位著名计算机科学家有句话&#xff1a;“如果智能是蛋糕&#xff0c;无监督学习将是蛋糕本体&a…

vue3-组合式API

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-组合式API 目录 组合式API 1.1 什么是组合式API 1.2 为什么使用它 1.2.1 更好的逻辑复用#…

“云浮云福保”暖心回归! 保障升级价格不变,医保个账可为全家缴费!

11月22日&#xff0c;2024年“云浮云福保”项目启动会在广东省云浮市迎宾馆成功举办。记者在会上获悉&#xff0c;“云浮云福保”是在云浮市医疗保障局、云浮市金融工作局、国家金融监督管理总局云浮监管分局指导下&#xff0c;的指导下&#xff0c;由中国人民财产保险股份有限…

高斯Filter 和 Bilateral Filter

参考链接&#xff1a; Python | Bilateral Filtering - GeeksforGeeks 高斯Filter&#xff1a; 高斯模糊后的图像中的每个像素的强度是由它周围的像素的加权平均得到的&#xff0c;这个权重就是高斯函数的值&#xff0c;它取决于像素之间的距离。具体来说&#xff1a; 通常会导…

PostMan接口测试教程

1、下载和安装 Postman: 前往 Postman 官网 &#xff08;https://www.postman.com&#xff09;&#xff0c;下载适用于你的操作系统的 Postman 客户端。 执行下载后的安装程序&#xff0c;并按照安装向导的指引完成安装过程。 2、创建一个新的集合&#xff1a; 打开 Postma…

引爆关注,聚焦上海新闻媒体邀请

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 上海拥有众多的新闻媒体机构&#xff0c;包括报纸、电视、广播和网络媒体等。这些媒体在报道国内外新闻、传播信息等方面发挥着重要作用。 其中&#xff0c;上海电视台是上海最大的电视…

邦永PM2项目管理系统 SQL注入漏洞复现

0x01 产品简介 邦永PM2项目管理系统科学地将项目管理思想和方法和谐、统一&#xff0c;使得长期以来困扰项目管理工作者的工期、进度、投资和成本情况无法整体动态管理的问题得到了全面而彻底的解决。 0x02 漏洞概述 邦永科技PM2项目管理平台Global_UserLogin.aspx接口处未对用…

解决ESP32内部RAM内存不足的问题

一&#xff0c;为什么需要外部RAM ESP32有520kB的内部RAM空间可以使用&#xff0c;这对于一般的情况是够用的&#xff0c;但是如果设备需要涉及音频或者显示图像等处理时&#xff0c;需要更大的内存空间来处理这些数据。ESP32支持扩展外部RAM&#xff0c;其实乐鑫已经在其ESP32…

接口自动化中cookies的处理技术

一&#xff0c;理论知识 为什么有cookie和session&#xff1f; 因为http协议是一种无状态的协议&#xff0c;即每次服务端接受到客户端的请求时都时一个全新的请求&#xff0c;服务器并不知道客户端的请求记录&#xff0c;session和cookie主要目的就是弥补http的无状态特性 …

G1垃圾收集器

G1收集器(-XX:UseG1GC) 前置文章&#xff1a;JVM垃圾收集器 G1 (Garbage-First)是一款面向服务器的垃圾收集器&#xff0c;主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时&#xff0c;还具备高吞吐量性能特征。 G1将Java堆划分为多个大小相等…

【LeetCode刷题】-- 29.两数相除

29.两数相除 思路&#xff1a; class Solution {public int divide(int dividend, int divisor) {//考察被除数为最小值的情况if(dividend Integer.MIN_VALUE){//被除数为最小值&#xff0c;除数是1&#xff0c;返回最小值if(divisor 1){return Integer.MIN_VALUE;}//除数是-…

口碑好的猫罐头有哪些?宠物店受欢迎的5款猫罐头推荐!

快到双十二啦&#xff01;铲屎官们是时候给家里猫主子囤猫罐头了。许多铲屎官看大促的各种品牌宣传&#xff0c;看到眼花缭乱&#xff0c;不知道选哪些猫罐头好&#xff0c;胡乱选又怕踩坑。 口碑好的猫罐头有哪些&#xff1f;作为一个经营宠物店7年的老板&#xff0c;活动期间…

二分查找——经典题目合集

文章目录 &#x1f99c;69. x 的平方根&#x1f33c;题目&#x1f33b;算法原理&#x1f337;代码实现 &#x1f433;35. 搜索插入位置&#x1f33c;题目&#x1f33b;算法原理&#x1f337;代码实现 &#x1f9ad;852. 山脉数组的峰顶索引&#x1f33c;题目&#x1f33b;算法原…

python-opencv划痕检测-续

python-opencv划痕检测-续 这次划痕检测&#xff0c;是上一次划痕检测的续集。 处理的图像如下&#xff1a; 这次划痕检测&#xff0c;我们经过如下几步: 第一步&#xff1a;读取灰度图像 第二步&#xff1a;进行均值滤波 第三步&#xff1a;进行图像差分 第四步&#xff1…

java创建指定分辨率的图片或修改图片的分辨率(DPI)

因为java默认的图片像素分辨率DPI72&#xff0c;分辨率有点低。所以研究了一下如何创建指定DPI的方案。 DPI&#xff1a; 指的是每英尺的像素点(dots per inch) JPEG图片 JPEG图片的元数据定义参看oracle官网。 https://docs.oracle.com/javase/8/docs/api/javax/imageio/me…

VulnHub DC-9

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

2011-2022年地级市互联网普及率数据

2011-2022年地级市互联网普及率数据 1、时间&#xff1a;2011-2022年 2、指标&#xff1a;行政区划代码、年份、地区、互联网宽带接入用户_千户、常住人口数_千人、户籍人口数_千人、每百人互联网宽带用户_常住人口口径、每百人互联网宽带用户_户籍人口口径 3、来源&#xf…

c语言编程(模考2)

简答题1 从键盘输入10个数&#xff0c;统计非正数的个数&#xff0c;并且计算非正数的和 #include<stdio.h> int main() {int i,n0,sum0;int a[10];printf("请输入10个数&#xff1a;");for(i0;i<10;i){scanf("%d",&a[i]);}for(i0;i<10…

【C++】类型转换

文章目录 C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_cast RTTI常见面试题 C语言中的类型转换 在C语言中&#xff0c;如果 赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值…

12英寸双轴半自动划片机:颠覆传统划切工艺的五大优势

随着科技的飞速发展&#xff0c;半导体行业对精密划切设备的需求日益增长。在这篇文章中&#xff0c;我们将深入探讨12英寸双轴半自动划片机的优势&#xff0c;这种划片机在半导体制造过程中扮演着至关重要的角色。以下是这种划片机的五大优势。 一、高精度划切 12英寸双轴半自…