【测试开发】Junit 框架

目录

一. 认识 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中,也可以直接运行。 

     @Testvoid 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 {@Testvoid 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");}@BeforeEachvoid Test05(){System.out.println("执行 BeforeEach");}@AfterEachvoid Test06(){System.out.println("执行 AfterEach");}@Testvoid 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);          // 1System.out.println(y);          // 2System.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)@Testvoid Test01(){System.out.println("111");}@Order(1)@Testvoid Test02(){System.out.println("222");}@Order(4)@Testvoid Test03(){System.out.println("333");}@Order(3)@Testvoid 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.hqwc.cn/news/20812.html

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

相关文章

系统架构设计师-项目管理

目录 一、盈亏平衡分析 二、进度管理 1、WBS工作分解结构 2、进度管理流程 &#xff08;1&#xff09;活动定义 &#xff08;2&#xff09;活动排序 &#xff08;3&#xff09;活动资源估算&#xff1a; &#xff08;4&#xff09;活动历时估算&#xff1a; &#xff08;5&…

ASP.NET版本泄露【原理扫描】

如果想屏蔽 Server&#xff0c;X-AspNet-Version&#xff0c;X-AspNetMvc-Version 和 X-Powered-By&#xff0c;需要增加&#xff1a; <httpProtocol><customerHeaders><remove name"Server" /><remove name"X-AspNet-Version" />…

volatile原理剖析和实例讲解

一、是什么 volatile是Java的一个关键字&#xff0c;是Java提供的一种轻量级的同步机制&#xff0c; 二、能做什么 保证了不同线程对这个变量进行操作时的可见性&#xff0c;有序性。 三、可见性 可见性主要是指一个线程修改了共享变量的值&#xff0c;另一个线程可以看见…

PLC远程控制模块的通讯方式有哪些?工业网关ZP4000的功能与特点

在工业场景中&#xff0c;我们PLC通常采用有线的方式进行数据通讯&#xff0c;这种通讯方式距离受到局限&#xff0c;随着科技进步发展&#xff0c;人们更依赖于远程控制&#xff0c;以无线通讯的方式能够以更低成本的方式实现PLC远程控制管理。 在不同区域的PLC场景中&#x…

Django_POST请求的CSRF验证

目录 正常验证CSRF form表单 ajax的POST请求 关闭CSRF验证 源码等资料获取方法 django的POST接口发起请求默认清空下需要进行CSRF验证 正常验证CSRF form表单 如果form表单直接在标签之间添加{{ csrf_token }}就可以完成验证 ajax的POST请求 ajax的post需要在请求的he…

【监控系统】Prometheus监控组件Node-Exporter配置实战

这一节&#xff0c;我们来配置一下Node-Exporter&#xff0c;那么我们先来了解一下什么是Prometheus的Exporter&#xff1f; 任何向Prometheus提供监控样本数据的程序都可以被称为一个Exporter&#xff0c;它是一种用于将不同数据源的指标提供给Prometheus进行收集和监控的工具…

ITIL 4—监控和事态管理实践

1 关于本文 本文为监控和事态管理实践提供了实用指南。它分为五个主要部分&#xff0c;内容包括&#xff1a; 有关实践的一般信息监控和事态管理的流程和活动及其在服务价值链中的角色监控和事态管理中涉及的组织和人员支持监控和事态管理的信息和技术合作伙伴和供应商对监控…

Linux进度条小程序

文章目录 &#x1fa85;1. 回车换行♥1.1 回车♥1.2 换行 &#x1fa86;2. 缓冲区现象&#x1f9f8;3. 进度条实现♟3.1 逻辑♟3.2 进度条样式♟3.3 代码实现 &#x1f0cf;4. 场景使用 &#x1fa85;1. 回车换行 在学习C语言的时候&#xff0c;我们输出的时候&#xff0c;通常…

【Redis】高可用之二:哨兵(sentinel)

本文是Redis系列第5篇&#xff0c;前4篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xff…

python OA流程图xml文件画图 graphviz的使用

下面的公文发文的流程图&#xff0c;虽然流程环节有坐标信息&#xff0c;但graphviz设置pos参数效果也不是太好 问题在于如何为流程环节设置绝对坐标 D:\Study\myproject\Python_auto_office\flow_report\utils\draw_image.py 通过xml流程文件绘制流程图 import graphviz …

使用OpenCV在图像上绘制质心

这段代码中已经实现了在图像上绘制质心的功能。质心,也称为重心,是物体质量分布的几何中心,可以通过物体质量和位置的加权平均来求得。 在这个程序中,图像的质心(重心)是通过计算像素强度(可以被看作是“质量”)的加权平均位置得到的。图像上每一个像素都有一个位置(…

谈谈VPN是什么、类型、使用场景、工作原理

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解VPN是什么、以及它的类型、使用场景、工作原理。 目录 一、VPN是什么&#xff1f; 二、VPN的类型 1、站点对站点VPN 2、…