单元测试和开发


几年前我在 LA DevOps meetup。幻灯片是here.

我应该从一些背景开始,解释我为什么要做这个演讲。即使是初级开发人员也熟悉单元测试(以及集成和端到端)。这绝对是一个广泛而激烈辩论的话题。从TDD到测试质量,再到覆盖率的重要性,再到优先考虑集成而不是单元测试,等等。这些都是有趣的主题,但它们是针对不同的职位的。

不幸的是,在许多DevOps/syseng/ops团队中,单元测试通常是一个陌生的概念。在我看来,系统工程或DevOps(我讨厌用这个词作为工作描述,尽管我认为我输掉了这场战斗)是,在现代组织中,他们基本上是由软件工程师组成的软件开发团队。碰巧他们的专业领域是系统/可观察性/可伸缩性等,而他们的产品往往是实现这一切的工具、粘合剂或平台。

但是,如果您的工作主要是编写软件,并且您采取的是基础设施即代码的方法,那么测试绝对是强制性的。我这次演讲的目的是快速介绍测试,并列出一些对这个世界上的人们可用的选择。幻灯片中有很多细节,我不打算在这里重复,但有一些可能有用的东西:

  • moto - 模仿boto和许多AWS服务的极好的库。拥有python脚本和工具在op和boto库中相当常见。除了测试之外,我还经常用它来测试unittest还有其他人。
  • bats,roundup,和shunit2详细说明:bash脚本也可以使用一些爱和测试。

对于配置管理和工具,也有大量的测试框架可用。我的团队倾向于选择Ansible,所以我对它更加熟悉,但这些工作中有很多是全面的。棘手的部分是决定在哪里划清界限,以及哪些东西可以进行合理的测试。通常需要测试的几个一般情况是:

  • 复杂的条件句--有时这些是不可避免的。这些通常伴随着正在评估的有些复杂的数据结构。你要确保你检查了你的逻辑。
  • 模板引擎中的逻辑(Ansible中的JJIA2)-一些非常复杂的东西,通常有代码的味道,但每条规则都有例外。
  • 变量继承-在Ansible中,您可以在24个位置定义变量,并且precedence有时是不清楚的。当在多个地方设置相同的变量时,您需要测试优先级是否正确。

更具体地说,使用Ansible,您可以组合使用以下各项:

作为参考示例,这是我的几个团队过去使用过的工作流。这是一个很好的例子,但是其他配置管理系统也会相当类似。典型的角色文件夹/文件结构如下所示:

r-role_name
  .bumpversion.cfg
  molecule.yml
  playbook.yml
  defaults/
    main.yml
  files/
    goss/
      test.yml
  handlers/
    main.yml
  tasks/
    main.yml
  templates/
    main.yml
  tests/
    test.yml
  vars/
    main.yml


大部分目录结构与您将看到的目录结构相同ansible-galaxy init. “睡觉”是:

  • bumpversion-用于构建系统的自动版本控制角色。
  • 分子.yml-HasMolecule configuration在那里。这是我们指定停靠容器、测试序列和用于测试的工具等内容的地方。
  • files/Goss/test.yml-这将有一组针对特定角色的测试。它通常包括以下几种组合these tests如果使用GOSS和/或其他自定义测试代码。

当工程师提交对角色的更改时,构建系统将触发“构建”,执行为其定义的测试,如果测试通过,则递增版本。特别是在处理处理许多场景的复杂角色的情况下,这会非常有帮助。可能有人正在做一个小的修改,总体影响可能还不清楚。假设测试写得很好,并且覆盖了主要用例,这将帮助工程师及早发现错误。

没有一个组织是完美的,并且拥有100%的测试覆盖率来覆盖每个角落的情况。但是采用一些结构/流程,设定理想的目标会有很长的路要走,特别是对于规模较大的团队。不能接受的是完全忽略测试,或者说测试做不到。