关于项目中的单元测试

简介: 关于项目中的单元测试

本文将使用phpunit组件和easyswoole后端代码进行说明

什么是单元测试

什么是单元测试?

单元测试是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等

在php api中,可以认为是对一个接口的整个功能进行测试.

例如:

正常登陆接口,将是长这样:

/**
 * @Api(name="login",path="/Api/Admin/Auth/login")
 * @ApiDescription("管理员登录")
 * @Param(name="adminAccount",required="",description="密码")
 * @Param(name="adminPassword",required="",description="账号")
 * @ApiRequestExample("curl http://127.0.0.1:9501/Api/Admin/Auth/login?account=123456&password=e10adc3949ba59abbe56e057f20f883e")
 * @ApiSuccess({"code":200,"result":{"adminId":1,"adminName":"zyx","adminAccount":"123456","addTime":0,"lastLoginTime":1596530015,"lastLoginIp":"192.168.0.122","adminSession":"b2187eb9f20fb327"},"msg":"登陆信息"})
 * @author xdd
 * Time: 16:03
 */
function login($adminAccount, $adminPassword)
{
    $admin = AdminUser::create()->where(\['adminAccount' => $adminAccount, 'adminPassword' => AdminUser::hashPassword($adminPassword)\])->get();
    if (!$admin){
        $this->writeJson(Status::CODE\_BAD\_REQUEST,null,"账号或密码错误");
        return;
    }
    $time = time();
    $session = Random::character(32);
    $admin->update(\[
        'lastLoginTime' => $time,
        'lastLoginIp'   => $this->clientRealIP(),
        'adminSession'       => $session
    \]);
    $this->response()->setCookie(self::ADMIN\_TOKEN\_NAME, $session, time() + 86400 * 7, '/');
    $this->writeJson(Status::CODE_OK, $admin, "登陆信息");
}

主要功能如下:

验证账号密码,写入session token,返回登陆信息.

那我们的单元测试则为:

$userData = \[
    'adminAccount'  => 'zxc',
    'adminPassword' => '123456'
\];
$response = $this->request('login', $userData,'Auth');//请求Auth控制器的login方法
$this->assertTrue(!!$response->result->adminSession);//断言一定会返回adminSession

单元测试编写完成

单元测试和一般测试的区别

看到上面,你可能会出现这样的想法:"这样测试跟我直接使用postman请求有区别吗?"

答案是,有也没有

单元测试本身就是在模拟调用某个接口,判断此接口返回数据是否符合预期,但是,单元测试可一次写完,批量调用,而postman还需要人工判断接口请求的数据返回是否正确

例如,当你全站有上千个接口,通过单元测试,可直接点击运行,直接测试上千个,而人工postman请求,需要自己判断上千个接口.

我只测试我自己新加的接口不行吗?为什么还得测试原来已经测试通过的?

如果你新加的接口不小心改动了其他接口相关的表,或者相关的公用方法,你测试新加的接口可以通过,但是旧的接口将会出现问题,影响整个系统的健壮性

所以,单元测试,可以测试到整个系统是否都在符合预期的情况下运行

数据mock

数据mock是指模拟数据,例如我们在单元测试中需要去请求第三方支付,或者需要借助第三方完成一些功能,或者需要在数据库修改数据,如果我们单元测试直接请求第三方是不太现实的,我们可以通过数据模拟的方式,去略过第三方操作,直接当第三方操作成功给我们已经返回了数据.

这个在php接口的单元测试中比较少见,因为php的代码都是直接操作数据库,没有使用serviceinterface层进行注入新的mock层进行模拟数据

完善的单元测试

本人认为,完善的单元测试需要有以下功能:

1:测试正常执行的返回是否符合预期,例如登陆接口,正常登陆接口将会是登陆成功,返回token

2:测试接口判断异常时候系统的错误返回是否符合预期,例如如果输错了账号密码,系统将会返回 "账号密码错误"

3:使用数据mock,尽量不要请求第三方服务,尽量不要修改数据库

4:如果需要使用数据库,在执行单元测试前,需要增加单元测试需要的数据,在执行单元测试后,尽量删除原有的测试数据,例如测试登陆,需要先新增一个测试用户,然后测试完成之后删除

5:测试数据边界,例如在修改年龄接口中,如果填入 -1,-100,2^64,-2^64,填中文,填特殊字符串 ,接口是否会出现预期之外的问题

6:测试每一个逻辑点,例如 申请添加好友接口,正常接口会判断好友是否存在,是否已经是其好友,是否已经存在此申请,是否已经被拉黑,我们需要生成不同的测试数据,测试到每一个逻辑点,断言是否符合预期

当然,越完善的单元测试,需要更多的精力,为了节约成本,可以只考虑1,5,6 点

实战单元测试

本人项目采用 php-curl组件进行发起http请求,测试已开启服务的接口.大致流程如下:

image.png

具体单元测试源码学习,可参考https://github.com/tioncico/newProject/tree/master/UnitTest

目录
相关文章
|
3月前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
3月前
|
测试技术 UED 开发者
性能测试报告-用于项目的性能验证、性能调优、发现性能缺陷等应用场景
性能测试报告用于评估系统性能、稳定性和安全性,涵盖测试环境、方法、指标分析及缺陷优化建议,是保障软件质量与用户体验的关键文档。
|
5月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
243 0
|
5月前
|
人工智能 数据可视化 测试技术
UAT测试排程工具深度解析:让验收测试不再失控,项目稳稳上线
在系统交付节奏加快的背景下,“测试节奏混乱”已成为项目延期的主因之一。UAT测试排程工具应运而生,帮助团队结构化拆解任务、清晰分配责任、实时掌控进度,打通需求、测试、开发三方协作闭环,提升测试效率与质量。本文还盘点了2025年热门UAT工具,助力团队选型落地,告别靠表格和群聊推进测试的低效方式,实现有节奏、有章法的测试管理。
|
10月前
|
人工智能 自然语言处理 测试技术
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
Potpie.ai 是一个基于 AI 技术的开源平台,能够为代码库创建定制化的工程代理,自动化代码分析、测试和开发任务。
838 19
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
|
10月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1246 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
10月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
524 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
211 61
|
11月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
348 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
429 6

热门文章

最新文章