单元测试使用记录

news2024/12/24 13:15:36

什么是单元测试

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

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

如何使用

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

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

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

其次,单元测试中,对与一个方法的测试并不是放在一个测试方法中的,每个测试方法只对一组参数的返回结果进行断言。
比如,当被测试方法中有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 认证的头部。

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

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

相关文章

bridge between Lua world and the .NET

一、新建项目&#xff1a;luademo 安装包&#xff1a;<PackageReference Include"NLua" Version"1.7.3" /> using NLua; using System;namespace luademo {internal class Program{static void Main(string[] args){Lua state new Lua();for (int …

路径规划之启发式算法之二十三:免疫算法(Immune Algorithm,IA)

免疫算法(Immune Algorithm,IA)是基于人工免疫系统的理论,受生物免疫系统的启发而推出的一种新型的智能搜索算法。通过模拟生物免疫系统的工作原理来解决优化问题。 一、定义与原理 免疫算法是以人工免疫系统的理论为基础,实现了类似于生物免疫系统的抗原识别、细胞分化、…

2.5.1 文件管理基本概念

文章目录 文件文件系统文件分类 文件 文件&#xff1a;具有符号名&#xff0c;逻辑上有完整意义的一组相关信息的集合。 文件包含文件体、文件说明两部分。文件体存储文件的真实内容&#xff0c;文件说明存放操作系统管理文件所用的信息。 文件说明包含文件名、内部标识、类型、…

C#调用WebService的方法

一、前言 在日常工作中&#xff0c;如果涉及到与第三方进行接口对接&#xff0c;有的会使用WebService的方式&#xff0c;这篇文章主要讲解在.NET Framework中如何调用WebService。 1.创建WebService &#xff08;1&#xff09;新建项目——模板选择ASP.NET Web 应用程序 &a…

(免费源码)基于springboot的电影院订票系统设计与实现 计算机毕业设计 P10089

项目说明 本号所发布的项目均由我部署运行验证&#xff0c;可保证项目系统正常运行&#xff0c;以及提供完整源码。 如需要远程部署/定制/讲解系统&#xff0c;可以联系我。定制项目未经同意不会上传&#xff01; 项目源码获取方式放在文章末尾处 注&#xff1a;项目仅供学…

python 定时任务管理封装

主逻辑代码 # -*- coding: utf-8 -*- # import apscheduler import pandas as pd from datetime import datetime # 导入调度器&#xff0c;此处使用BackgroundScheduler阻塞调度器 from apscheduler.schedulers.background import BackgroundScheduler # 导入触发器&#xf…

国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案

随着科技高速发展&#xff0c;视频信号经过数字压缩&#xff0c;通过互联网宽带或者移动4G网络传递&#xff0c;可实现远程视频监控功能。将这一功能运用于施工现场安全管理&#xff0c;势必会大大提高管理效率&#xff0c;提升监管层次。而这些&#xff0c;通过Liveweb监控系统…

C++----------函数的调用机制

栈帧的创建与销毁 栈帧创建过程 当一个函数被调用时&#xff0c;系统会在程序的栈空间中为该函数创建一个栈帧。首先&#xff0c;会将函数的返回地址&#xff08;即调用该函数的下一条指令的地址&#xff09;压入栈中&#xff0c;这确保函数执行完后能回到正确的位置继续执行后…

【Leetcode】855. 考场就座

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 在考场里&#xff0c;有 n n n 个座位排成一行&#xff0c;编号为 0 0 0 到 n − 1 n - 1 n−1。 当学生进入考场后&#xff0c;他必须坐在离最近的人最远的座位上。如果有多个…

Unity引擎学习总结------动画控件

左侧窗格可以在参数视图和图层视图之间切换。参数视图允许您创建、查看和编辑动画控制器参数。这些是您定义的变量&#xff0c;用作状态机的输入。要添加参数&#xff0c;请单击加号图标并从弹出菜单中选择参数类型。要删除参数&#xff0c;请在列表中选择该参数并按删除键&…

UE4_用户控件_1_滑块控制图像颜色的变化

祝愿大美兰陵越来越好&#xff0c;祝愿祖国繁荣昌盛&#xff0c;祝愿人民幸福安康&#xff01; 一、样式展示&#xff1a; 效果&#xff0c;当角色靠近物体&#xff08;只有一个胶囊碰撞体&#xff09;时显示用户控件&#xff0c;调整控件中的滑块值&#xff0c;可以改变UE4lo…

网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取

一、概述 记录时间 [2024-12-18] 前置文章&#xff1a;网络编程 01&#xff1a;计算机网络概述&#xff0c;网络的作用&#xff0c;网络通信的要素&#xff0c;以及网络通信协议与分层模型 本文讲述网络编程相关知识——IP 地址&#xff0c;包括 IP 地址的作用、分类&#xff…

【pycharm】远程服务器之后如何打开终端

【pycharm】远程服务器之后如何打开终端 在pycharm中&#xff0c;我们通过远程连接服务器&#xff0c;此时如果我们需要在终端运行的话&#xff0c;并不能直接在本地终端运行&#xff0c;而是需要连接到服务器终端才能运行命令 设置如下&#xff1a; 输入服务器的ip、端口、…

C#+OpenCv深度学习开发(常用模型汇总)

在使用 OpenCvSharp 结合深度学习进行机器视觉开发时&#xff0c;有许多现成的模型可以使用。以下是一些常用的深度学习模型&#xff0c;适用于不同的机器视觉任务&#xff0c;包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…

dolphinscheduler服务注册中心源码解析(三)RPC提供者服务整合注册中心注册服务实现源码

RPC提供者服务整合注册中心注册服务实现源码 1.概述2.源码解读思路3.实现2.1.应用服务的RPC服务接口定义2.1.1.MasterServer应用中提供的RPC接口服务2.1.2.WorkerServer应用中提供的RPC接口服务2.2.应用服务的RPC服务接口实现2.2.1.MasterServer应用中提供的RPC接口服务实现类2…

重生之我在异世界学编程之C语言:数据在内存中的存储篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 引言正文一、数据类型介绍1.内置类型2.自定义…

线程的概念及基本应用

目录 线程的概念 Java中多线程应用 继承Thread类 实现Runnable接口 实现Callable接口 线程的生命周期 线程的基本操作及原理 Thread.join的使用及原理 Thread.sleep的作用 问题 Thread.sleep的工作流程 wait和notify的使用 wait notify 例子 生产者消费者模式 Th…

联通软研院:基于OceanBase落地检索增强生成 (RAG) 的应用实践

本文作者&#xff1a;邱永刚&#xff0c;联通软件研究院OceanBase研发负责人&#xff0c;主要负责中国联通自研关系型数据库分布式CUDB研发、支撑、运维工作。 近年来&#xff0c;生成式人工智能技术取得了飞速进步&#xff0c;很多大模型在自然语言处理及对话系统领域的运用吸…

【更新】LLM Interview

课程链接&#xff1a;BV1o217YeELo 文章目录 LLM基础相关1. LLMs概述2. 大语言模型尺寸3. LLMs的优势与劣势4. 常见的大模型分类5. 目前主流的LLMs开源模型体系有哪些&#xff08;Prefix Decoder&#xff0c;Causal Decoder&#xff0c;Encoder-Decoder的区别是什么&#xff09…

模型 课题分离

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例&#xff1a;李晓的故事 李晓&#xff0c;一位28岁的软件工程师&#xff0c;在北京打拼。他面临着工作、家庭和感情的多重…