您什么时候有足够的自动测试来对您的持续集成流程充满信心?


10

与测试的持续集成对于确保始终检查“可运输”代码很有用。

但是,要保持一套全面的测试确实很困难,而且常常感觉该版本无论如何都会出错。

您必须对CI管道测试充满信心的进行多少次测试?您是否使用某种指标来确定何时有足够的测试?

Answers:


16

一般来说

您什么时候有足够的自动测试来对您的持续集成流程充满信心?

如果您考虑要自信的话,答案可能会很清楚。最终,它映射了1-1。每项测试都会使您对所测试的一件事充满信心:

  • 单元测试使您确信类(或模块)可以完成其测试。
  • 集成测试使您确信几个单元可以按照测试的方式协同工作。
  • 端到端测试使您充满信心,整个应用程序都可以按照测试中描述的方式执行特定操作。

从您提出问题的方式来看,您现在可能正在从大角度思考商业问题,例如:

我想确信我的应用程序可以做X

因此,您编写了一个尝试执行X并检查它是否正确执行的端到端测试。

更具体

这都是非常自指的,但这是因为这就是问题所在。根本没有更多。

例如,假设您编写了一个用于创建烹饪食谱的应用程序。一个功能是,如果您添加不同数量的几种不同类型的奶酪,它会为您提供正确的温度和时间,以便它们都融化。

因此,您可以为自己编写一个单元测试CheeseMeltCalculator,在其中进行100g豪达奶酪和200g Emmental奶酪的测试,然后检查温度和时间是否正确。这意味着您现在可以放心,该产品CheeseMeltCalculator适用于100克荷兰扁豆和200克奶酪。现在,如果您用300克荷兰扁豆而不是200克重复此测试,则可以确信它可以正确地用于不同的值。您可以添加Gouda的和的测试0,以确保代码不会因奇怪的输入而跳闸(或按预期正确跳闸)。-1int.MaxValue

您可以编写一个集成测试,以检查CheeseMeltCalculator是否已正确集成到整个食品温度和时间计算过程中。如果这是错误的,但是CheeseMeltCalculator上面的测试很好,您可以确信该错误存在于其他计算器中,或者是来自不同计算器的数据组合在一起的方式。

最后,您可以编写一个用于创建整个配方的端到端测试,您要检查的内容之一是结果温度和时间。如果前面的两个测试水平都很好,但是这样做有误,那么您可以再次确信那些部分是正确的,而错误之处在于温度计算如何集成到应用程序中。例如,可能用户输入未正确传输。

最后,如果所有这些测试都很好,那么你可以相信,“ 如果你添加不同量的几种不同类型的奶酪,它给你适当的温度和时间,让他们都融化

长话短说

关键是您无法进行“正常工作”测试。您只能测试“如果我执行X,则发生Y”。

但是,这正是项目技术规格中应包含的内容。诸如“ 如果您添加不同数量的几种不同种类的奶酪,它会为您提供正确的温度和时间,以便它们都融化这样的陈述不仅使客户对成品的用途有明确的期望,而且可以转换成成品进入自动化测试。

附加信息

用户Richard在编辑中添加了以下信息:

马丁·福勒(Martin Fowler)在他的网站上有一个关于最常见策略的非常不错的摘要:https : //martinfowler.com/articles/microservice-testing/

我不想删除它,但我想说的是:与这个答案相比,它不是一个“摘要”,而是一个更深入的解释,其中包含漂亮的图形和所有内容。

我的建议是:如果阅读完我的回答后一切对您都有意义,那么您就完成了。如果情况仍然不清楚,请拨出一点时间仔细阅读链接的文章。


这是一个很好的概念视图。您是否可以使用示例指标来增强对我们测试覆盖范围的信心?
核果

@stonefruit不是,但是我想我确实有您需要的答案:Testivus的测试覆盖率
R. Schmitz

@stonefruit关于该寓言中的数字,即80%,这是您在这种情况下经常听到的数字。主要是由于pareto原则-最后20%的覆盖率是作品的80%。换句话说,将其从80%提高到100%的工作量是最初将其提高到80%的工作量的4倍。这通常是过大的,但是想像一下您正在为卫星编写控制代码:如果弹出错误,则不能仅解决此问题。那么,将覆盖率提高到100%是值得的。
R. Schmitz

看来我是第三位程序员。哈哈。我想最终还是要回到采用基于风险的方法,就像您在卫星示例中提到的那样。
核果

1
@stonefruit也许您是第一个。如果您的现有项目的覆盖率是0%,请不要将生存率提高到80%。相反,实际上,“ 只是编写一些好的测试 ”。也许用星期五的后半段来编写测试,诸如此类。以我的经验,您将首先自动以最佳的努力-回报比率提出测试,并且每个测试都会给您带来更多的信心。
R. Schmitz

4

您没有可以计算的指标可以给您所需的信心。做某事,然后成功或失败,并从中学到一些东西,就会建立信心。

我发现使我对测试覆盖面充满信心的唯一“指标”是:

  1. 生产中发现的缺陷数量
  2. 您可以重构代码库并依靠您的测试覆盖率来发现回归缺陷吗?

自动化测试不是万灵丹。您需要跟踪在每个发布周期中发现了多少生产缺陷。当这个数字下降时,您将交付更好的软件。自动化测试和持续集成只是您用来提供更好软件的工具

您唯一可以衡量的指标是“您是否提供了更好的软件?”

即使这样,它也是主观的。


与其他答案相比,该答案解决了可能的指标。我一直在考虑使建议的指标更有意义。也许除了查找生产中发现的缺陷数量之外,还可以根据风险管理为每个缺陷评分,并设置一个阈值(例如,在过去3个月中发现30个缺陷点)。达到阈值可能表示在错误代码的技术负担呈指数增加之前,对系统进行了可能的错误检查。
核果

2

您什么时候有足够的自动测试来对您的持续集成流程充满信心?

在大多数经济环境中,您将没有预算来实现足够的置信度(> 99%),但是您必须管理有限的预算:这全都与成本/收益比有关。

  • 一些自动化测试实施起来很便宜,而另一些则非常昂贵。
  • 根据您实际的风险管理,某些风险必须由测试覆盖,而其他则不能。

因此,实际上,将执行简单/便宜/风险较高的测试,而不会执行昂贵/不太可能的测试。

软件开发的一个子目标是创建易于/廉价测试的体系结构(通过应用Test-driven_development设计可测试性),以保持自动测试的可负担性。

我假设Pareto_principle也可以在此处用于可维护/可测试的软件:它表示,多花20%的钱,您将获得80%的额外收益。为了获得剩余的20%的收益,您需要花费额外的80%的钱。

您可以应用诸如代码覆盖率变异覆盖率之类的测试指标 来向您展示潜在的未经测试的源代码。

但是,即使覆盖率达到100%,您也不能保证代码中没有错误。

管理喜欢编码度量。如果开发人员不支持/不喜欢自动测试,而管理人员强制执行“代码覆盖率> = 80%”,则存在编写具有高覆盖率的测试代码的方法,该方法不会证明有任何假象给人以安全感。


1

这里的诀窍不是担心完整的覆盖范围,而在于管理更改的风险。

假设您正在使用管道来部署与生产中已经使用的版本完全相同的版本-回归错误的风险是什么?零(因为没有变化)。

现在,假设我要在其中一个屏幕上更改一段文本。我已经添加了测试,以验证文本现在是否可以正确显示(为方便起见,假设它是一条非常重要的文本)。我还需要其他哪些测试来验证没有回归错误?实际上没有...

因此,每个发行版都需要进行的自动化测试的数量不是您的应用程序大小的函数,而是更改大小的函数。如果您要进行小的,低风险的更改,那么您将需要更少的测试来减轻风险。

但是,请稍等...这对CI和CD的要求不是很好吗?

是的 通过将所有更改和增量保持为很小,您可以通过流程而不是测试来减轻许多回归风险。而且,问题实际上并没有变成自动化的问题(这只是我们将使用的工具),而仅仅是测试和风险承受能力的问题。完全忘记自动化,您将针对变更进行哪些测试,以确保变更没有引入问题?从手动测试过程到CI系统,这个问题的答案不会改变-唯一的优点是,许多回归测试以前可能是在以前的功能中开发的,CI鼓励您进行更小,更安全的更改。

TLDR

您的测试是为了减轻更改的风险。增量为零的部署没有风险,因此没有风险。通过将更改保持在很小的范围内,可以轻松地确定验证它们所需的测试-自动化的可重用性是一个好处。


0

它与手动测试产品时的度量标准相同。

实际上,很容易识别出这些低置信度区域:假设您要运送产品,我想您有一些流水线后的手动步骤可以提高您可运送的信心。这些是您应该自动化的领域,以提高对自动过程本身的信心。

您的自动化是一项持续的工作。随着产品的改进,它会不断增长和改进。缺陷是重新考虑代码以及重新配置CI的原因。令人欣慰的是,由于可以实现对产品本身的信心-也可以实现对自动化的信心。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.