“用于数百个客户端版本的Monolith”报告的摘要(HL2018,Badoo,Vladimir Yants)

延续HL2018的一系列摘要。 Badoo的家伙(弗拉基米尔· 扬茨 (Vladimir Yants)的狂热者和尼古拉·克拉普尼(Nikolai Krapivny))帮助我检查了这份简编 ,为此,我非常感谢。 我希望这对报告信息的质量有积极的影响。

图片

开发过程的特点:


开发人员的责任并不会随着后端的发布而结束。 在平台上实施之前,他负责。

图片

有手动测试,但是客户端在发布时尚未准备就绪,并且发布(具有不可预测的延迟)。 我们通常不知道客户何时开始实施它。 有时(不经常)功能会在很长一段时间后开始执行。 因此,用手进行测试很困难,并非一帆风顺。 因此,需要自动测试。

测验


单元测试


用phpunit写。

测试一个小单元。 他们不去数据库或服务(它们不应该与任何东西交互)。

传统仍然存在并使测试过程变得复杂。

他们开发了softMocks库-它的所有钩子都包含/ require,并将其替换为已更改的库。

您可以结束任何方法:静态,私有,最终。
该库是开放源代码。

问题:软弹放松,并允许您编写未经测试的代码(并用测试覆盖它)。

接受规则:

  • 新代码应该易于测试phpunit
  • SoftMocks-极端情况(旧代码/长/昂贵/复杂)

我们来看这些规则的代码审查。

测试质量


变异测试


  • 拿代码
  • 进行代码覆盖
  • 我们解析代码并应用变异(change + =>-; true => false,等等)
  • 对于每个突变,我们运行一组测试。
  • 如果测试失败,则大约。 如果不是这样,它们将不够有效。 我们了解,更改/添加测试。

有现成的解决方案(Humbug,Infection),但它们不适合(与softmocks不兼容,代码覆盖率很困难)。 因此,他们写了自己的书。

突变测试尚不能用于手动测试。 可从控制台手动运行。 现在我们正在CI管道中实现它,我们正在构建过程。 结果将在Habr上。

整合测试


结合测试多个组件的运行; 我们通过基础和/或服务检查工作。

数据库测试的标准方法(DBUnit):

  1. 提升测试数据库
  2. 填满
  3. 运行测试
  4. 我们清理数据库

问题:

  • 必须支持数据表和数据集(数据库内容的相关性)
  • 准备数据库需要时间
  • 并行启动使测试不稳定并导致死锁

解决方案:DBMocks库(自己的解决方案)

工作原理:

  • 在setUp测试中使用SoftMocks拦截的DB驱动程序方法
  • 从请求parsim db +表
  • Tmpfs创建具有相同架构的临时表
  • 所有查询仅进入临时表
  • 在TearDown上,它们被删除。

该库很小,但尚未在开源中开放。

结果:

  • 测试不能破坏原始表中的数据
  • 测试彼此隔离(可以并行运行)
  • 测试查询与MySQL版本的兼容性

API测试


  • 模拟客户会话
  • 能够发送后端请求
  • 后端的响应几乎就像真实的客户一样

通常,此类测试需要授权用户。 它必须在测试之前创建,然后在测试之后删除。 这会带来其他风险(复制,后台任务)。

解决方案:我们汇集了一组测试用户。 了解了如何清洁它们。

图片

测试用户与真实用户处于同一环境中,因为devel!= Prod。 必须隔离测试用户和实时用户。

为了隔离,已为该用户添加了is_test_user标志。 并且这些用户也被排除在分析和a / b测试结果之外。

可以通过将测试用户“送到南极洲”来使其更便宜,该地区没有人可以看到他们(企鹅除外)。

质量检查API


用于在api测试中准备环境的工具,本质上是后端中的后门,用于快速更改用户/环境设置。

  • 有据可查的api方法
  • 快速轻松地管理数据。
  • 开发人员写后端
  • 只能应用于测试用户。

允许用户更改不可变数据(例如,注册日期)。

需要保护:

  • 在网络级别(仅可从办公室网络获得)
  • 每个请求都会传递一个秘密,并检查其有效性
  • 方法仅适用于测试用户。

HackerOne上有一个BugsBounty程序。 他们为发现的漏洞付费。 发现使用质量检查API的一种方法。

远程模拟


Moki用于远程后端。

在软模拟的基础上工作。 测试要求后端为模拟会话初始化。 收到请求后,后端将检查会话的mox列表,并使用SoftMocks应用它们。

测试示例:

图片

API测试太方便了。 编写它们而不是单位是很诱人的。 但是API测试要慢得多。

通过了一套规则:

  • API测试的目的是测试协议和集成
  • 有效检查复杂流程
  • 小变异性无法测试。
  • 在代码审查中,我们也测试了测试。

UI测试


backend命令不写。

稳定后,Ui测试将覆盖该功能。
硒用于网络。 对于移动葫芦。

试运行


100,000个单元测试。 6,000个集成,14,000个api测试。
在1个流中,时间为40分钟/ 90分钟/ 10小时。

Made Cloud-运行测试的云。

图片

测试在线程之间的分布:

  • 您可以平等地使用(严重的是,所有测试都是不同的,结果时间部分不相等)
  • 运行多个线程并一次输入一个phpunit测试(初始化开销。长!)

解决方案:

  • 收集有关运行时的统计信息。
  • 测试的布局,以便块运行不超过30秒

api测试的问题是时间长,资源很多,并且不允许其他人执行。

为了解决此问题,我们将云分为两部分:

  1. 仅运行快速测试。
  2. 运行两种类型的测试。

结果是加速了以下时间:

  • 单位-1分钟
  • 整合-5分钟
  • API-15分钟。

代码覆盖率运行


要执行哪些测试? 将显示代码覆盖率。

  1. 我们得到分支差异
  2. 创建已修改文件的列表
  3. 获取这些文件的测试列表。
  4. 我们仅通过这些测试来运行套件。

主分支每天晚上覆盖一次。 结果(差异)将添加到数据库中。

优点:

  • 我们运行更少的测试:更少的硬件负载和更快的测试反馈
  • 您可以运行补丁测试。 这使您可以快速推出此修复程序。 在补丁程序中,速度是最重要的。

缺点:

  • 后端每天发布2次。 午餐后,报道的意义不大(但是当您开始节拍时,我们始终会驾驶全套)。
  • Api测试涵盖了广泛的范围。 对于他们来说,这种方法并不能提供太多的节省。

如果开发人员需要立即查看代码覆盖率,即可以在控制台中启动并立即获得针对特定文件/组件的覆盖范围的新指标的工具。
这被认为是棘手的:在coverege master上获取数据,添加所有修改后的测试,结果是一个已经考虑了覆盖率的小型套件。

总结


  • 需要所有测试水平
  • 数量!=质量。 做代码审查和变异测试
  • 将测试用户与真实用户隔离开。
  • 后端中的后端简化并加快了编写测试的速度
  • 收集测试统计信息。

参考文献


Source: https://habr.com/ru/post/zh-CN429776/


All Articles