关于项目中的单元测试

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

本文将使用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

目录
相关文章
|
1天前
|
人工智能 自然语言处理 测试技术
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
Potpie.ai 是一个基于 AI 技术的开源平台,能够为代码库创建定制化的工程代理,自动化代码分析、测试和开发任务。
63 19
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
24 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
1月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
36 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
118 61
|
3月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
67 6
|
3月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
47 1
|
3月前
|
网络协议 关系型数据库 应用服务中间件
【项目场景】请求数据时测试环境比生产环境多花了1秒是怎么回事?
这是一位粉丝(谢同学)给V哥的留言,描述了他在优化系统查询时遇到的问题:测试环境优化达标,但生产环境响应时间多出1秒。通过抓包分析,发现MySQL请求和响应之间存在500毫秒的延迟,怀疑是网络传输开销。V哥给出了以下优化建议:
|
4月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
405 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
4月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
97 2
|
4月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
128 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法

热门文章

最新文章