单元测试使用记录

什么是单元测试

简单来说就是对一个类中的方法进行测试,对输出的结果检查判断是否符合预期结果

但是在多年的工作中,从来没有哪个项目中真正系统的用到了单元测试,因此对它还是很陌生的,也就造成更加不会在项目中区使用它。

如何使用

以前不使用单元单元测试,是因为觉得没有必要:既然单元测试是对方法输入不同参数,然后对输出进行判断。那么方法本身也必定已经对不同参数进行过判断和不同处理,才会有不同的输出,那么在单元测试代码中再进行一次参数判断,不是重复劳动吗,这么做有什么意义呢?

经过学习后才明白,之所以有上面的错误理解,是弄错了单元测试代码的编写时机和方式。

首先,单元测试代码是在被测试类和方法建立之前就要先建立的。之后,根据单元测试代码去建立被测试类,一步步编写被测试方法。方法中每实现一个测试,就运行对应的测试方法验证,直到所有的测试方法都被验证通过,方法就完成了。这就是所谓的:测试驱动开发

其次,单元测试中,对与一个方法的测试并不是放在一个测试方法中的,每个测试方法只对一组参数的返回结果进行断言。
比如,当被测试方法中有5条执行路径时,就有5个对应的测试方法。测试方法的名称根据要断言的路径不同命名,这就是所谓的:单元测试可以作为代码文档使用

理解了上面的概念后,就等于掌握了单元测试的核心思想。

接口测试、功能测试、验收测试

使用单元测试时,我们一般会使用相应的框架。框架中除了单元测试外,一般还包含接口测试、功能测试、验收测试等功能。这些测试的使用思想和单元测试是一致的,只不过是测试对象有所不同。

接口测试,是使用框架中组件,模拟浏览器行为,请求接口的url地址,对返回结果进行断言

功能测试,是使用框架中组件,模拟浏览器行为,对某个前端页面进行点击,并对跳转和返回结果进行断言。

验收测试,是调用真实的浏览器内核,对某个前端页面进行点击,并对跳转和返回结果进行断言。

目前来说功能测试和验收测试对后端程序员不再适用。
因为现在应用基本都是前后端分离,后端只需要做好接口测试即可

codeception 在yii2中的基本使用

目录结构和生成

yii2框架安装后,vender下已经包含了codeception包,并且在项目根目录中也已经生成了单元测试目录和相关配置文件。tests目录是单元测试的相关文件,codeception.yml文件是单元测试的配置文件。

如果是在其他项目或框架中没有自带codeception组件,则需要通过composer安装。
安装后,在vender的bin目录下会出现codeception的命令行文件,如下
在这里插入图片描述
需要在环境变量中把该文件所属的目录添加上,方便之后在命令行全局使用codecept命令,
之后我们在命令行定位到想要放置单元测试文件的目录,执行如下命令,就会单元测试的文件和目

codecept bootstrap

在这里插入图片描述
默认情况下,只会生成单元测试、功能测试、验收测试的套件;接口测试套件需要我们单独执行命令生成,如下

codecept generate:suite api

在这里插入图片描述

基本命令使用

通过命令行执行单元测试时,首先要定位到codeception.yml文件所属目录。因为codecepti命令会默认调用当前目录下的codeception.yml

执行所有测试

codecept run

执行所有单元测试

Codecept run unit

执行指定测试文件

Codecept run tests/unit/TestOrder.php

基本配置选项

在这里插入图片描述
当使用了框架时,bootstrap 指定就指定框架的起始文件。以Yii2为了,_bootstrap.php文件就是加载框架的核心组件和自动加载文件等,如下
在这里插入图片描述

Moudel中的相关配置,可以根据开启的模块,去查看具体的配置项
在这里插入图片描述
我们可以在该目录下看到支持的所有模块,打开文件后就可以在注释中看到该模块的相关配置项

多模块测试

当我们的项目较大时,我们可能需要把单元测试分模块放置,目录结构如下
在这里插入图片描述

当我们想执行某个模块下的单元测试时,可以比较方便的实现。
当时当我们想在project目录下,执行所有module下的单元测试时该如何实现呢?

我们只需要在project目录下的codeception.yml文件中添加include配置项,如下
在这里插入图片描述
配置完成后,再project目录下,执行:codecept run unit
就会自动查找并执行三个module下的单元测试

常用单元测试断言

常规断言

assertEquals($expected, $actual[, $message ]) 检查两个变量是否相等。

assertNotEquals($expected, $actual[, $message]) 检查两个变量是否不相等。

assertTrue($condition[, $message = ‘’]) 检查条件是否为 true。

assertFalse($condition[, $message = ‘’]) 检查条件是否为 false。

assertEmpty($actual[, $message = ‘’]) 检查变量是否为空。

assertNotEmpty($actual[, $message = ‘’]) 检查变量是否非空。

assertNull($actual[, $message = ‘’]) 检查变量是否为 null。

assertNotNull($actual[, $message = ‘’]) 检查变量是否不为 null。

assertGreaterThan($expected, $actual[, $message = ‘’]) 检查实际值是否大于预期值。

assertGreaterThanOrEqual($expected, $actual[, $message = ‘’]) 检查实际值是否大于或等于预期值。

assertLessThan($expected, $actual[, $message = ‘’]) 检查实际值是否小于预期值。

assertLessThanOrEqual($expected, $actual[, $message = ‘’]) 检查实际值是否小于或等于预期值。

类型和结构的断言

assertInstanceOf($expected, $actual[, $message = ‘’]) 检查对象是否是某个类的实例

assertNotInstanceOf($expected, $actual[, $message = ‘’]) 检查对象是否不是某个类的实例

assertArrayHasKey($key, $array[, $message = ‘’]) 检查数组是否有指定的键。

assertArrayNotHasKey($key, $array[, $message = ‘’]) 检查数组是否没有指定的键。

assertContains($needle, $haystack[, $message = ‘’]) 检查数组或字符串中是否含有某个值。

assertNotContains($needle, $haystack[, $message = ‘’]) 检查数组或字符串中是否不含有某个值。

assertCount($expectedCount, $haystack[, $message = ‘’]) 检查数组或 Countable 对象中元素的个数。

assertNotCount($expectedCount, $haystack[, $message = ‘’]) 检查数组或 Countable 对象中元素的个数是否不符合预期。

文件和目录的断言

assertFileExists($filename[, $message = ‘’]) 检查文件或目录是否存在。

assertFileNotExists($filename[, $message = ‘’]) 检查文件或目录是否不存在。

assertFileEquals($expected, $actual[, $message = ‘’]) 检查两个文件的内容是否相等。

assertFileNotEquals($expected, $actual[, $message = ‘’]) 检查两个文件的内容是否不相等。
异常的断言

expectException($exception) 预期代码会抛出某个异常。

expectExceptionMessage($message) 预期抛出的异常会包含某个特定的消息。

expectExceptionCode($code) 预期抛出的异常会含有特定的代码

常用接口测试方法

发送 HTTP 请求

sendGET($url, $params = []) 发送一个 GET 请求到指定的 URL,并可以附加查询参数。

sendPOST($url, $params = [], $files = []) 发送一个 POST 请求到指定的 URL,可以附加表单数据和文件。

sendPUT($url, $params = [], $files = []) 发送一个 PUT 请求到指定的 URL,可以附加表单数据和文件。

sendDELETE($url, $params = [], $files = []) 发送一个 DELETE 请求到指定的 URL,可以附加表单数据和文件。

sendPATCH($url, $params = [], $files = []) 发送一个 PATCH 请求到指定的 URL,可以附加表单数据和文件。

sendOPTIONS($url, $params = [], $files = []) 发送一个 OPTIONS 请求到指定的 URL,可以附加表单数据和文件。

sendHEAD($url, $params = [], $files = []) 发送一个 HEAD 请求到指定的 URL,可以附加表单数据和文件。

验证响应

seeResponseCodeIs($code) 验证最后一个响应的 HTTP 状态码是否为指定的 $code。

seeResponseIsJson() 验证最后一个响应是否是有效的 JSON 格式。

seeResponseContainsJson($json = []) 检查最后一个响应中是否包含特定的 JSON 结构。

seeResponseEquals($response) 检查最后一个响应内容是否完全等于指定的字符串。

seeResponseContains($text) 检查最后一个响应内容是否包含指定的文本。

dontSeeResponseContains($text) 检查最后一个响应内容是否不包含指定的文本。

seeResponseJsonMatchesXpath($xpath) 使用 XPath 查询检查最后一个 JSON 响应。

seeResponseJsonMatchesJsonPath($jsonPath) 使用 JSONPath 查询检查最后一个 JSON 响应。

seeResponseMatchesJsonType($type, $jsonPath = null) 检查最后一个响应是否匹配指定的 JSON 类型。

设置和验证 Header

haveHttpHeader($name, $value) 设置请求的 HTTP 头部。

seeHttpHeader($name, $value) 检查响应的 HTTP 头部是否存在并且等于特定的值。

dontSeeHttpHeader($name) 检查响应的 HTTP 头部是否不存在。

seeHttpHeaderOnce($name) 检查响应的 HTTP 头部是否只出现一次。

seeHttpHeaderContains($name, $value) 检查响应的 HTTP 头部是否包含特定的值。

验证 Cookies

seeCookie($name) 检查 Cookie 是否存在。

dontSeeCookie($name) 检查 Cookie 是否不存在。

seeCookieEquals($name, $value) 检查 Cookie 的值是否等于指定的值。

seeCookieMatches($pattern, $name) 检查 Cookie 的值是否符合指定的正则表达式。

数据库操作

seeInDatabase($table, $criteria = []) 检查数据库中的表是否包含匹配指定条件的记录。

dontSeeInDatabase($table, $criteria = []) 检查数据库中的表是否不包含匹配指定条件的记录。

grabFromDatabase($table, $column, $criteria = []) 从数据库中抓取记录,并返回指定列的值。

授权操作

amBearerAuthenticated($token) 在请求中添加一个 Bearer 认证头部。

amHttpAuthenticated($username, $password) 在请求中添加基本 HTTP 认证的头部。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

麒麟操作系统服务架构保姆级教程(三)ssh远程连接

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 作为一名成熟运维架构师,我们需要管理的服务器会达到几十台,上百台,上千台,甚至是上万台服务器,而且咱们的服务器还不一定都在一个机房&am…

2024年图像处理、多媒体技术与机器学习

重要信息 官网:www.ipmml.org 时间:2024年12月27-29日 地点:中国-大理 简介 2024年图像处理、多媒体技术与机器学习(CIPMT 2024)将于2024年12月27-29日于中国大理召开。将围绕图像处理与多媒体技术、机器学习等在…

用Python在Excel工作表中创建、修改及删除表格区域

在数据分析和自动化处理的工作中,Excel作为一种强大的工具被广泛应用,而通过Python来操作Excel工作表中的表格,可以极大提高工作效率。表格(Table)是Excel中的一种重要结构,它是一个特殊的单元格区域&#…

【AI】✈️问答页面搭建-内网穿透公网可访问!

目录 👋前言 👀一、后端改动 🌱二、内网穿透 💞️三、前端改动 🍹四、测试 📫五、章末 👋前言 小伙伴们大家好,上次本地搭建了一个简单的 ai 页面,实现流式输出问答…

GM_T 0039《密码模块安全检测要求》题目

单项选择题 根据GM/T 0039《密码模块安全检测要求》,送检单位的密码模块应包括()密码主管角色。 A.一个 B.两个 C.至少一个 D.至少两个 正确答案:C 多项选择题 根据GM/T 0039《密码模块安全检测要求》,关于非入侵式安全,以下属于安全三级密码模块要求的是()。 …

使用生存分析进行游戏时间测量

标题:Playtime Measurement with Survival Analysis 作者:Markus Viljanen, Antti Airola, Jukka Heikkonen, Tapio Pahikkala 译者:游戏数据科学 1 游戏中的游戏时间 1.1 为什么游戏时间很重要 游戏分析在理解玩家行为方面变得越来越重…

Linux快速入门-兼期末快速复习使用

Linux快速入门-兼期末快速复习使用 一小时快速入门linux快速一:Linux操作系统概述1. Linux概述1.1 定义与特点1.2 起源与发展1.3 Linux结构1.4 版本类别1.5 应用和发展方向 2. 安装与启动2.1 Windows下VMware安装Linux2.2 安装Ubuntu 快速二:linux的桌面…

制造研发企业与IPD管理体系

芯片/半导体/制造研发型企业,大都知道华为使用过的IPD管理体系,但大家用到什么程度,那就是参差不齐了。 因为IPD管理体系它只是一个管理理念,是一个方法论。它需要有相应的组织架构来承载,它有很复杂的流程需要有IT系统…

帝国CMS自动生成标题图片并写进数据库

帝国CMS背景可自定义,可单独背景也可以随机背景,此插件根帝国cms官方论坛帖子改的,增加了生成图片后写入数据库,笔者的古诗词网 www.gushichi.com 也是这样设置的。 效果图 将下面的代码插入到/e/class/userfun.php中增加如下函数 单独背景代码 //自动…

数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者

人工智能(AI)已经吸引了数据科学家、技术领导者以及任何使用数据进行商业决策者的兴趣。绝大多数企业都希望利用人工智能技术来增强洞察力和生产力,而对于这些企业而言,数据集的质量差成为了最主要的障碍。 数据源需要进行清洗且明…

java小知识点:比较器

java中自主排序主要根据一个Comparator类来实现。 他内部实现用的是Timsort策略。大概思想是说将整个集合分成几个小段,每个小段分别排序,然后再拼在一起。 主要用法是传入两个数(也可以不是Integer或int类型,这里只是把他们都统称…

【嵌入式开发笔记】OpenOCD到嵌入式调试

最近在把玩一块Risc-V的开发板,使用开发板调试时,需要用到专门的下载器和OpenOCD进行调试。 为了连接这个板子,费了九牛二虎之力。 这里简单记录一下自己的折腾经过吧。 0x00 环境准备 0x0001 调试背景 系统:Virtual Box Ub…

安装MongoDB,环境配置

官网下载地址:MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…

15.初识接口1 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。它要求所…

2.学习TypeScript 编译选项配置

自动编译 我们可以使用 tsc ...../.ts -w 命令进行ts文件的自动编译 执行后 编译会持续侦听 自动编译 这种方式只能侦听一个文件 对做项目肯定是不现实的,为了解决这个问题,我们需要添加一个tsconfig.json文件,写入一个基础对象 再有tsconfi…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requ…

VS Code Copilot 与 Cursor 对比

选手简介 VS Code Copilot:算是“老牌”编程助手了,虽然Copilot在别的编辑器上也有扩展,不过体验最好的还是VS Code,毕竟都是微软家的所以功能集成更好一些;主要提供的是Complete和Chat能力,也就是代码补全…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负,然后下正上负。当二极管接到反向电压,二极管存在寄生电容,电压不能立刻突变,当输入频率变高时&#…

unipp中使用阿里图标,以及闭坑指南

-----------------------------------------------------点赞收藏才是更新的动力------------------------------------------------- unipp中使用阿里图标 官网下载图标在项目中引入使用注意事项 官网下载图标 进入阿里图标网站 将需要下载的图标添加到购物车中 2. 直接下载…

QtCreator配置github copilot实现AI辅助编程

文章目录 1、概述2、配置环境3、演示 1、概述 新时代的浪潮早就已经来临,上不了船的人终将被抛弃,合理使用AI辅助开发、提升效率是大趋势,注意也不要过于依赖。 2024年12月18日,GitHub 官方宣布了一个激动人心的重大消息&#xf…