测试时间长时如何保持行李箱稳定?


9

我们提供三套测试套件:

  • 一个“小型”套件,只需几个小时即可运行
  • 耗时数小时的“中型”套件,通常每晚(每晚)
  • 一个“大型”套件需要一周以上的时间才能运行

我们也有很多较短的测试套件,但在这里我不关注它们。

当前的方法是在每次提交到干线之前运行小型套件。然后,中型套件每天晚上运行,如果早晨发现它失败了,我们将尝试找出应归咎于昨天提交中的哪个,回滚该提交,然后重试测试。对于大型套房,只执行每周一次而不是每晚一次的类似过程。

不幸的是,中型套件确实经常失败。这意味着后备箱通常是不稳定的,当您要进行修改和测试时,这非常烦人。这很烦人,因为当我从后备箱中退房时,我无法确定它是否稳定,并且如果测试失败,我也无法确定它是否是我的错。

我的问题是,是否存在一些已知的方法来处理此类情况,以使行李箱始终处于最佳状态?例如:“提交到一个特殊的预提交分支,该分支将在每夜经过时定期更新中继”。

它是像SVN这样的集中式源代码控制系统还是像git这样的分布式源代码控制系统有关系吗?

顺便说一下,我是一名初级开发人员,但更改功能的能力有限,我只是想了解是否有办法解决我遇到的这种痛苦。


6
我不知道您正在使用什么软件,但是一个需要数小时才能运行的小型测试套件是一些WTF。如果它们运行得更快,这将更容易,没有办法简化您的测试?
本杰明·班尼尔

2
行李箱不稳定怎么了?不知道是否知道,但是最受欢迎的分支策略之一甚至叫做不稳定树干
gnat 2012年

1
有许多方法可以优化测试套件(就像其他任何软件一样)。我不知道您为什么要花这么长时间,但是例如,您可能能够重用某些测试环境,或者在运行时仅使用更好的算法/数据结构(分析很有帮助)。也可能是没有人花时间来识别代表性样本,而您只是根据某个参考来测试每个可能的输入/输出。也许您的构建系统允许您对代码测试的依赖项进行编码,所以您不需要运行完整的集合。我知道这不是您的问题,这就是为什么我发表评论而不是回答。
本杰明·班尼尔

1
...嗯,您更好的选择可能会改善测试和应用程序日志记录,以便更轻松地查找失败原因。这样,就需要找到并修复失败的原因,而不是浪费时间在“侦查”上寻找谁,何时以及为什么更改特定代码行……
gnat 2012年

1
@honk有些测试需要很长时间才能运行。我在一家制造数据采集设备的公司工作,我们的“部分”测试运行需要大约一个小时。测试需要进行各种类型的测量,而这只是时间。
Velociraptors 2012年

Answers:


1

解决不稳定性的根本原因的唯一方法是将代码解耦,以使更改更加隔离,如其他答案所建议的那样。

但是,作为一个单独的开发人员,如果您想要一个更稳定的构建供您自己使用,则相对来说很容易解决。您无需花费任何技巧,而只需将通过通宵测试套件的最后一个构建拉入工作树即可。如果您可以为每个更改创建功能分支,则从最后的稳定版本中分支出来。

是的,您的树会落后几天,但是大多数时候都没有关系。对稳定的版本进行工作,以使您知道所做的更改破坏了所有测试,然后在签入之前更新到最新版本并进行常规集成。然后,在签入之后,再次备份到上一个稳定的版本。

您仍然必须进行混乱的集成工作,但是我喜欢这种方法的地方是它将集成工作隔离到更方便的时间,并在不方便的时候为我提供了稳定的代码库。与其他人相比,当我的更改可能使构建中断时,我有一个更好的主意。


1
从分支机构工作-1是可行的选择,但建议不建议进行测试可能弊大于利。只有测试可以显示特定项目是否可行。例如,在我大约两年前做的一个项目中,这样的测试表明,与不稳定的主干相比,分支机构的工作要多花7倍的时间
2012年

谢谢卡尔!虽然这不是我希望学习的内容,但这是一种非常实用的方法,可以帮助我解决当前的问题。我同意,在后备箱中工作几天只会很少引起集成问题。
2012年

12

我知道您正在尝试避免这种情况,但是真正的见解是要意识到您的代码库存在严重问题:您需要运行整套测试,而这需要一周的时间才能确保您的代码稳定!

解决此问题的最有利方法是开始将代码库和测试分离为(独立的)子单元。
这有很多优点:

  • 这些单元中每个单元的测试都将运行得更快(根本就是更少),并且如果独立单元或下游单元之一出现问题,它们也不会中断。
  • 测试失败将被定位到特定的单元,这将使查找问题根源变得容易得多。
  • 您可以分离不同单元的VCS位置,以便您的“稳定”分支可以是每个单元的最新经过成功测试的构建的“挑剔”组合,从而使一两个损坏的单元不会破坏您的“稳定”版本的稳定性。

在另一方面,您的VCS结构的管理将变得更加复杂,但是在整个星期的测试过程中,我认为您可以承受痛苦!

我仍然建议以某种形式使用“稳定”和“开发”分支策略,但是有很多方法可以解决,您可以选择最适合您组织的方法(具有固定修订版的元存储库指向每个单元都有单独的存储库,一个稳定分支和一个dev分支,一个功能分支....)


1
我从未说过大型测试是原子测试,而是测试套件。当单个开发人员对元素X进行修改时,他将运行与X相关的测试-无论它们源自哪个测试套件。这是对每周测试的补充,该测试旨在确保一个地方的更改不会意外影响另一个地方。但是,您提出了一个有趣的观点,即至少以这种方式分离事物将有助于加快对特定模块的测试,同时将风险保持在大致相同的水平。
橡树

2
@oak-好吧,如果套件全部运行,则套件是原子的,这是您唯一有信心代码稳定的唯一方法,但是您确实有好处,所以我编辑了答案。
Joris Timmermans,2012年

4
对于我们的编译器,我们有大量的测试套件,其中一些测试套件需要几天才能运行,对于像C ++编译器这样复杂的软件,这并不罕见。并不是说套件定义了什么是“稳定的”,而是有数百万种不同的代码生成极端情况,不可能每天都对其进行测试。
JesperE 2012年

1
@JesperE-这是可以理解的,如果庞大的测试套件未定义“稳定”而是巨大的健全性测试。我不希望整个套件(甚至是中型套件)经常失败。
Joris Timmermans,2012年

1

对于SVN,我不了解“预提交”之类的东西。我认为测试失败时可能会产生提交和回滚。正如doc-brown所说,唯一的方法是在一个临时分支上提交,然后再将其与trunk合并。

我认为使用git或mercurial之类的分布式工具是可行的。使用“测试”存储库和“稳定”存储库。您推动测试代表,每晚进行测试,如果一切正常,则从测试推动到稳定。否则,您将回滚测试代表。当您从测试版本推向稳定版本时,我有点不确定版本历史记录的样子,但是我认为这样做可以排除损坏的回滚内容。首先进行一点试验是最安全的。

另一种选择是每晚测试每个人的本地后备箱。然后,允许通过测试的人员在早上将其推送到中央服务器。


1

恕我直言,这与您使用的VCS没有关系。使用“被测”分支可能是解决方案,也可以使用集中式或分布式VCS来实现。但说实话,我认为您所处的状况中最好的是尝试优化中级测试套件(似乎它包含最重要的测试),以便其运行速度更快,因此您可以将其用于预提交到主干测试,就像您现在使用“小型套件”进行测试一样。


我在这里主要是询问方法论-即是否有一种通用的方法来处理这种情况。至少出于讨论的考虑,我们假设无法对测试进行优化,而不是对其进行优化。
2012年

@Oak:这里的某个人(您?)否决了我的答案-但有时,您不希望听到的事情是唯一有帮助的事情。正如您在以下问题的讨论中所看到的那样,其他人也提出了相同的建议,因此我的建议似乎并不那么糟糕。
布朗

+1,这是正确的答案。OP的真正问题是“帮助,我淹没在垃圾中,我可以使用什么方法来帮助自己?” 答案是,真正的方法论不是您应该担心的。
MrFox 2012年

1

失败的中级测试:在大多数情况下,相同的测试会失败吗?

如果出现故障,是否总是有相同的相关测试失败?

如果为true,则可以选择一些经常失败的中等测试(针对每种错误类别进行一次测试),然后在较小的范围内执行它们。

大多数测试集成测试都使用真实的数据库吗?如果是这样,是否可以将其替换为具有模拟数据库的单元测试?


1

您需要使测试运行更快,没有其他方法可以使该圆圈平方。

考虑一下问题:您要确保在签出时拥有有效的代码。当然,您可以推迟提交并进行分支直到发布之前,但这只会将问题的出现推迟到集成为止。在这种情况下,每次合并后都需要运行为期一周的套件吗?方法学不是解决方案,解决方案纯粹是技术性的。

这是我的建议:

1)尽可能使测试处于大气状态,并最大程度地重用环境。

2)获得一个测试套件场来运行它们。如果最终只有8个大模块而不是50个,则可以启动一堆Amazon EC2竞价型实例并并行运行整个套件。我敢肯定这会花费一些钱,但是会节省大量的开发人员时间。


0

在您的问题中,理所当然的关键是所有提交都必须通过测试。尽管这是一个很好的遵循规则,而且似乎有些道理,但有时却不切实际。您的案例就是一个例子(尽管MadKeithV确实有道理),而且我可以想象保留一个VCS分支,这样如果开发者之间没有足够的合作,那么可能很难做到原始。

实际上,您想要以某种方式知道哪些提交通过或失败。您建议的“预提交分支”将起作用,但是开发人员在进行提交时可能需要开发人员付出额外的努力,这可能很难销售。

一种可能更容易的类似方法是,让人们随心所欲地断开主干,并为未中断的提交创建分支。自动脚本可以在对主干进行提交时进行提交,对它们运行测试,如果通过则将其添加到分支中。

或者,您可能太荒谬了,并拥有一个脚本,该脚本在文本文件中列出了传递的提交(它本身可能受版本控制)。

或者有一个批处理系统,它接受对分支/修订的请求(从树中的任何地方进行测试),并对其进行测试,如果它们通过,则将其提交到主干(或另一个分支)。

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.