Testing 规范

未匹配的标注

渐进式测试

100% 的测试覆盖率,需要花费在测试代码上的工时,丝毫不亚于业务代码的开发时间。

如开发 Deadline 不允许,做不到 100% 测试覆盖率,应该考虑对程序入口进行测试。这种方式的时间利用比最高。

Laravel 项目中程序入口,一般有以下四种:

  • Web —— 程序的网页模块;
  • API —— 程序的 API 模块;
  • Admin —— 管理员后台页面;
  • Job —— 队列任务;
  • Command —— 自定义的 Artisan 命令行。

对这些入口进行 100% 的测试覆盖,可以很大范围内测试到项目代码。

测试速度

编写测试时,必须永远把执行速度放在首位。

单元测试

所有的单元测试,都必须放置于 tests/Unit 目录下。且必须使用子目录存储,绝不直接放置于此目录下。

集成测试

所有的集成测试,都必须放置于 tests/Feature 目录下。且必须使用子目录存储,绝不直接放置于此目录下。

常见的子目录按照入口,应该划分如下:

├── API
├── Web
├── Admin
├── Command
└── Job

Fixture 数据

测试中使用到样例数据,必须放置于 tests/Fixtures 目录中。且必须使用子目录存储,绝不直接放置于此目录下。

运行多个环境

测试代码必须在开发同事的机器上能运行,测试必须在 Beta 环境下能运行。

并发测试

所有的测试,都 必须 支持并发测试,这样可以极大节省 CI 中测试运行的时间,提高整个工作流的速度。

每次提交代码前,使用以下命令跑一下不报错即可:

php artisan test -p

支持并发测试:

composer require brianium/paratest

用例测试而不是代码测试

写 Feature Test 的时候,必须使用用例测试(User Story),而不是代码测试。

❌代码测试的例子:

// tests/Feature/API/V1/UserAddressControllerTest.php

class UserAddressControllerTest extends APITest
{
    public function test_controller_index_method()
    {
    }

    public function test_controller_create_method()
    {
    }
}

✅ 用例测试:

// tests/Feature/API/V1/UserAddressControllerTest.php

class UserAddressControllerTest extends APITest
{
    public function test_user_can_view_user_address_index()
    {
    }

    public function test_guest_can_not_create_user_address()
    {
    }

    public function test_user_can_create_user_address()
    {
    }
}

绝不测试第三方服务

程序中经常会使用第三方服务,例如发送邮件使用 SendCloud 的 API 、或发送短信 API。

将这些服务 API 调用封装到 Service 层,编写测试代码时,对其进行 Mock 。

建议:检测测试代码是否使用第三方服务,最好的方法就是把 Wifi 关掉,然后跑一遍测试。如果有错误发生,证明调用了第三方 API。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~