测开- Junit 单元测试框架

news2024/11/27 2:39:36

文章目录

  • 前言
  • 了解 Junit
  • 准备工作 - 在 pom.xml 文件中引入 Junit 相关依赖
  • 1、Junit注解
    • @Test
    • @BeforeEach、@BeforeAll
    • @AfterEach && @AfterAll
  • 2、断言
    • 1、Assertions - assertEquals 方法
    • 2、Assertions - assertNotEquals 方法
    • 3、Assertions - assertTrue && assertFalse方法
    • 4、Assertions - assertNull && assertNotNull
    • 小结
  • 3、用例的执行顺序 - 方法排序( @Order 注解)
  • 4、测试套件 - Suite
    • 第一种方法:@Suite && @SelectClasses
    • 第二种方法:@Suite && @SelectPackages
  • 5、参数化
    • 1、@Parameterizetest(参数化) && @ValueSource(参数来源)
    • 2、@Parameterizetest(参数化)&& @CsvSource(参数列表)
    • 3、@Parameterizetest(参数化)&& @CsvFileSource(指定文件路径)
  • 6、动态参数
    • @ParameterTest(参数化) && @MethodSource

前言

现在,我们有了 selenium 基础语法 之后,只能说我们会写自动化。
但不是说:我们就能写自动化测试 。

而本文的重点:通过学习 Junit 基础,再加上前面的 selenium 框架,来实现自动化测试。


了解 Junit

Junit 是一个开源的 Java 语言的单元测试框架
Junit 是 Java方向使用最广泛的单元测试框架。
使用 Java 的开发者都应当学习 Junit ,并且掌握单元测试的编写。
有了 Junit 之后,我们的自动化写起来就更漂亮了。

有的朋友可能就会有疑问:为什么有了 selenium 之后,还需要Junit?

selenium 和 Junit 都是可以通过 Maven 来导入进来的包。
两个工具包里面提供了 非常多的 API(方法 / 功能) 给我们使用。
让我们去实现 想要实现的自动化测试。

selenium 和 Junit 之间的关系,举个例子:
假如: 我们要让灯泡亮起来,selenium 就是灯泡,Junit 就是电源


准备工作 - 在 pom.xml 文件中引入 Junit 相关依赖

 <!-- selenium 先关依赖-->
    <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>
         <!-- Junit 先关依赖-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <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>

1、Junit注解

@Test

在这里插入图片描述
来接着看下面:
在这里插入图片描述
将其与我们之前写的 selenium 代码 比较一下,就能发现 Junit 的好处了。
在这里插入图片描述
甚至我们可以一次性执行多个测试单元。
在这里插入图片描述


@BeforeEach、@BeforeAll

表示被注解的方法应该在其它方法之前被执行。

@BeforeEach:表示被注解的方法,在每个方法执行之前都要执行一遍.在这里插入图片描述

@BeforeAll:表示被注解的方法,在所有方法执行之前。只要执行一遍.在这里插入图片描述


@AfterEach && @AfterAll

Before,那么就有After,不过分吧?

@AfterEach:在每个测试单元执行之后都要执行一遍
在这里插入图片描述

@AfterAll:在所有测试单元都执行完之后,在最后执行一次在这里插入图片描述


2、断言

写自动化测试,测试结果分为两种:成功 和 失败。

就像我们前面写的测试来说
在这里插入图片描述
看起来很美好。
但是!查询的结果可能跟预期不相符,而我们只是将获取的数据进行输出
至于结果和我们预期的结果是否一样,那就不得而知了。
更重要的是:当查询的结果和预期结果不一致时,它是不会报错的
像这样的测试用例就没有起到测试的作用,只是单纯的获取打印信息而已。
等我们有了断言之后,就能对查询到的结果做出判断(测试操作)。这时候它才真正算是一个 自动化测试
以前写的代码,只能算是 自动化,不算是测试


1、Assertions - assertEquals 方法

校验 实际数据 是否与 期望值 相同
在这里插入图片描述


2、Assertions - assertNotEquals 方法

校验 实际数据 是否与 期望值 不相同在这里插入图片描述


3、Assertions - assertTrue && assertFalse方法

assertTrue 方法 :条件为真通过测试,条件为假测试失败。
在这里插入图片描述
等号换成 equals 即可。在这里插入图片描述

assertFalse 方法 :条件为假通过测试,条件为真测试失败
在这里插入图片描述
在这里插入图片描述


4、Assertions - assertNull && assertNotNull

assertNull:如果条件为null,通过测试;反之,则不通过。
在这里插入图片描述

assertNotNull:如果条件不为null,测试通过;反之,则不通过。
在这里插入图片描述


小结

正是因为有了断言,我们的自动化才能带上 “测试” 两个字。
以前我们写的自动化代码【没有断言】对结果是没有标准的。
我们不知道什么样的结果才是正确的,是错误的。
有了断言,我们才知道什么样子的结果才是我们想要的结果


3、用例的执行顺序 - 方法排序( @Order 注解)

我们先来看两个例子在这里插入图片描述
在这里插入图片描述
通过上面的测试用例,我们知道 Junit 的执行顺序不是 “标准(从上往下)”的。

这里需要注意的是: Junit 的默认执行顺序是不确定的,而且官方文档也没有明确给出答案。
Junit官方地址:https://junit.org/junit5/
有兴趣的,可以去看看在这里插入图片描述
在这里插入图片描述
但是,我们仍可以使用 Junit里提供的方法【方法非常多】来 手动设置 用例的执行顺序。

1、方法的排序
2、标签的排序
3、的排序
。。。。。

这里我们着重学习 方法排序 —— 通过 @Order 注解来排序
在这里插入图片描述
现在看来是有序的,可能执行其它的用例就不是这样的了。
在这里插入图片描述
虽然说:Junit 是有 执行顺序的,但是容易翻车!
所以我们可以使用 @Order 注解来设置执行的顺序。
在此之前,我们需要引入一个注解 @TestMethodOrder
在这里插入图片描述
在这里插入图片描述
使用 @TestMethodOrder 注解 所提供的 @Order 注解 的目的就是:
为了保证测试用例执行的顺序,确保测试过程中按照人为预设的步骤执行得到预期的结果。【用例之间存在关联关系
在这里插入图片描述
下面我们再通过 @Order 注解 来制定顺序
在这里插入图片描述
虽然这个例子举的不太好,但是意思get的到,就OK。
在这里插入图片描述


4、测试套件 - Suite

在这里插入图片描述
目前,我们一次最多启动一个类中的 测试单元。
在这里插入图片描述
现在我们想把 junittest 包中的所有测试类都执行起来,我们该怎么做呢?
这就需要借助到 测试套件了。


第一种方法:@Suite && @SelectClasses

@Suite【表示被注解的类是套件(类)】 && @SelectClasses【指定需要执行测试的类文件】
在这里插入图片描述
上面只是选择额一个类,下面我们来选择多个类文件。
在这里插入图片描述
虽然我们可以一次执行多个类文件中的 测试单元。
但是,还是存在一个致命问题:
如果我们想一次性执行 几十个类文件中的测试单元,那就太麻烦了(低效)。


第二种方法:@Suite && @SelectPackages

既然选择类文件的方式太低效了,那不如我们直接选择包
在这里插入图片描述
我们可以看到有几个测试类没有被执行。

这是因为使用指定的包来添加套件的前提
1、所有类文件的命名都要以 Test、Tests 结尾。
2、所有的测试单元都要使用 @Test 注解


5、参数化

我们前面写的测试单元(方法)都是不带参数的。
下面我们来写个示例,通过这个我们来了解参数化是什么。
在这里插入图片描述
那么我们该如何去写呢?
使用 @Parameterizetest 注解,标注方法类型为“参数化”.
在注明方法类型为参数化,同时需要强调参数的来源


1、@Parameterizetest(参数化) && @ValueSource(参数来源)

这里需要特别注意的是 @ValueSource 的使用。
在这里插入图片描述
下面我就来使用它们。【使用时候,在类型名称后面加上 s
在这里插入图片描述
在这里插入图片描述
通过这两个注解,我们就能实现 参数化(批量测试)了。
我们可以发现 这两个测试方法是分开进行,而且都是只指定了一种数据类型【单参数】。
那么,如果我们想同时输出 name 和 i ,在一个方法里呢?【多参数】


2、@Parameterizetest(参数化)&& @CsvSource(参数列表)

@CsvSource(value = {“张三,1”,“李四,2”,“王五,3”…})
在这里插入图片描述
如何你觉得 逗号分割参数 不明显
我们还可以通过 @Csvsource 的 delimiterString 属性来指定。
在这里插入图片描述
但是!还存在一个问题:
在使用 逗号进行分割 的时候,如果其中一个双引号中的 参数里面也出现了一个逗号,那么此时运行就会报错。
在这里插入图片描述
解决方法:对于这样的参数,使用 单引号 单独 引起来,就可以了。
在这里插入图片描述
问题可不止一个哦~
试想一下:
如果参数个数一多,每个参数都像这么去,那不得麻烦死。
我们可以通过借助文件注入的方式来添加:@Csvsource(指定文件路径)


3、@Parameterizetest(参数化)&& @CsvFileSource(指定文件路径)

@CsvFileSource(resources = “当前项目下csv文件路径”)在这里插入图片描述
当然,csv文件并不是一定要在 项目底下,在本地其它位置也是可以的。
在这里插入图片描述
哦,对了,参数除了 String,其它的类型都必要传!
在这里插入图片描述


6、动态参数

前面我们看到的参数,其实都是静态参数是写死了的。
哪怕参数个数很多,也改变不了的事实。

接下来,我们就来了解一下 动态参数 是怎么实现的。


@ParameterTest(参数化) && @MethodSource

@MethodSource( 字符串)
字符串参数: 给测试单元(方法)传递的数据 的 方法名。
简单来说:就是通过 一个方法 来向 测试单元 传递测试数据在这里插入图片描述
另外,还有一种传参方式:@MethodSource注解不表明数据源,它会去寻找同名的数据源(静态方法)
在这里插入图片描述
我们再来看传递多种类型参数是怎么写的。
在这里插入图片描述

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

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

相关文章

一个关于React数据不可变的无聊问题

对于一个React的开发者来说不知道你有没有想过为什么React追求数据不可变这个范式&#xff1b; 一个月前我想过一个问题如果我在使用useState这个hooks的时候传入的是一个改变后的引用类型对象会发生什么&#xff1f; 例如&#xff1a; import {useState} from "react&…

css之@media网页适配

原因&#xff1a; 原本是想用 iview Grid 栅格,但以下响应并不符合我的需求 【我需要的分辨率是1920和1536】&#xff0c;所以需要手动修改 解决方案&#xff1a; html <Row> <i-col :xs"6" :sm"6" :md"6" :lg"8"><d…

IB经济试卷实用指南分享

明明每个经济理论都知道&#xff0c;然而在实际答题过程中就是用不出来&#xff1f; 看到答案后却是恍然大悟&#xff0c;就像对着数学答案&#xff0c;大体还能想明白“原来是这样的”&#xff0c;但考试的时候就是想不到用这个理论、这个模型&#xff1f; 出现这种现象&#…

左值和右值

左值和右值 按字面意思&#xff0c;通俗地说。以赋值符号 为界&#xff0c; 左边的就是左值&#xff0c; 右边就是右值。 更深一层&#xff0c;可以将 L-value 的 L, 理解成 Location&#xff0c;表示定位&#xff0c;地址。将 R-value 的 R 理解成 Read&#xff0c;表示读取…

[附源码]Python计算机毕业设计电影售票管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

什么是位移电流?位移电流密度计算公式详解

位移电流变化着的电场可以存在于真空、导体、电介质中&#xff0c;本质是变化着的电场&#xff0c;不会产生化学效应&#xff0c;也不会产生焦耳热。下面一起随着小编一起了解一下什么是位移电流以及位移电流密度计算公式。 什么是位移电流&#xff1f; 1861年&#xff0c;詹姆…

[附源码]Python计算机毕业设计SSM基于web的医院门诊管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于java+springboot+mybatis+vue+mysql的一起来约苗系统

项目介绍 在系统流程分析当中调查分析它是比较重要的环节&#xff0c;因为在这个系统当中它都涉及到每个环节的业务流程&#xff0c;所以从JavaSprignBootVueMYSQL一起来约苗系统的设计的整体设计上要保证各个信息的正确输入和输出以及对数据储存的完整&#xff0c;并结合实际…

ASEMI肖特基二极管MBR20100FCT图片,MBR20100FCT大小

编辑-Z ASEMI肖特基二极管MBR20100FCT参数&#xff1a; 型号&#xff1a;MBR20100FCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;100V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;70V 最大直流阻断电压&#xff08;VDC&#xff09;…

python+django车辆充电桩管理系统

启动一个新项目 执行下面的命令来创建一个新的 Django 项目&#xff1a; django-admin startproject myproject 命令行工具django-admin会在安装Django的时候一起自动安装好。 执行了上面的命令以后&#xff0c;系统会为Django项目生成基础文件夹结构。 现在&#xff0c;我…

【软件测试】测试人我懵了,产品验收时还有一堆bug?

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

屏幕录制怎么加上水印?这个方法,真的太实用啦

随着网络技术的飞速发展&#xff0c;短视频已经成为传播信息最快的方式之一。越来越多的人将自己喜欢的游戏直播视频和网络直播课程知识制作成短视频&#xff0c;并在各大媒体平台进行分享。然后&#xff0c;录制的视频可能会被其他人带到其他平台。屏幕录制怎么加上水印&#…

FLStudio21水果软件中文版本有哪些新增功能?

FL Studio 21即将推出 – 新功能和改进。如果您从事音乐制作&#xff0c;那么您不可能没有听说过 FL Studio&#xff0c;或者很可能已经使用过这个音乐程序。好了&#xff0c;新版本的 FL Studio 21 DAW 已经准备好向公众发布了。Image-line 正在为 2022 年的大型揭幕准备最终细…

iOS原生项目拥有Flutter热重载极速调试

1. Mac的App Store上下载安装InjectionIII. 2. 打开InjectionIII, Open Project, 选择你的项目目录. 3. 选择的项目会在Open Recent中出现, 保持File Watcher的选项勾选. 4. 在AppDelegate的DidFinishLaunchingWithOptions配置InjectionIII的路径 - (BOOL)application:(UIAp…

python+django勤工助学管理系统vue

目 录 第1章 绪论 1 1.1课题背景 1 1.2 背景意义 1 1.3 研究的内容 2 第2章 相关技术 3 第3章 系统分析 5 3.1可行性分析 5 3.2系统性能分析 6 3.3系统流程分析 6 3.3.1操作流程 6 3.3.2信息添加流程 7 3.3.3信息删除流程 8 第4章 系统设…

周志华 《机器学习初步》 绪论

周志华 《机器学习初步》 绪论 Datawhale2022年12月组队学习 ✌ 文章目录周志华 《机器学习初步》 绪论一.机器学习二.典型的机器学习过程三.计算学习理论PAC模型思考两个问题问题性质角度计算要求的角度四.基本术语五.归纳偏好六.NFL定理哪个算法更好&#xff1f;NFL定理的寓意…

Codeforces Round #837 (Div. 2) A-C

A. Hossam and Combinatorics A题意&#xff1a; 给你n个数&#xff0c;让你求有多少个数对 并且 满足等于数组中最大的绝对值之差。 思路&#xff1a;直接找最大值和最小值&#xff0c;如果最大值和最小值不是一个&#xff0c;那就是最大数的数量乘最小值的数量乘2&#x…

前端基础(一)_前端页面构成

一、前端页面构成 1.HTML(Hypertext Markup Language) Html–超文本标记语言&#xff0c; 结构层由HTML标记语言创建的&#xff0c;负责页面的语义。&#xff08;它包括一系列标签&#xff0c;主要分为块标签和行标签、行内块标签三类&#xff09; 2.CSS(Cascading style sh…

绿色中国馆设计

目 录 1工程概况 1 1.1建筑设计部分 1 1.1.1设计依据 1 1.1.2设计内容、建筑面积、标高 1 1.1.3建筑空间构成 1 1.1.4采光和通风 1 1.1.5防火及安全 2 1.1.6各部分工程构造 2 1.2 结构设计部分 3 1.2.1基本资料 3 1.2.2结构形式和基础形式 3 1.2.3结构尺寸及采用的材料 4 1.2.4…

[oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理

放入路径 回忆上次内容 上次总算可以把 sleep.py 直接执行了 sleep.py文件头部要声明好打开方式 #!/usr/bin/python3用的是 python3 解释 sleep.py 修改 sleep.py 文件 的执行权限 给当前用户增加 执行execute 权限 chmod ux sleep.py 运行./sleep.py成功 但我不想总带着当前路…