Unit testing 如何克服单元测试回归问题。。。?

Unit testing 如何克服单元测试回归问题。。。?,unit-testing,code-analysis,regression,Unit Testing,Code Analysis,Regression,我在为那些花太多时间处理单元测试回归问题的软件开发团队寻找某种解决方案(在我的例子中,大约30%的时间!!!),也就是说,处理每天都失败的单元测试 下面是我熟悉的一个解决方案,它分析了导致某个单元测试失败的最新代码更改: 我想知道是否有人知道类似的工具,以便我可以对它们进行基准测试。 同样,如果有人能推荐另一种方法来处理这个恼人的问题 感谢高级经常测试,经常提交 如果您还没有这样做,我建议使用一个工具,并要求/要求开发人员在提交之前运行自动测试。至少是测试的一个子集。如果运行所有测试花费的时间

我在为那些花太多时间处理单元测试回归问题的软件开发团队寻找某种解决方案(在我的例子中,大约30%的时间!!!),也就是说,处理每天都失败的单元测试

下面是我熟悉的一个解决方案,它分析了导致某个单元测试失败的最新代码更改:

我想知道是否有人知道类似的工具,以便我可以对它们进行基准测试。 同样,如果有人能推荐另一种方法来处理这个恼人的问题


感谢高级

经常测试,经常提交

如果您还没有这样做,我建议使用一个工具,并要求/要求开发人员在提交之前运行自动测试。至少是测试的一个子集。如果运行所有测试花费的时间太长,那么使用CI工具为每个提交生成一个构建(包括运行所有自动测试),这样您就可以很容易地看到哪个提交破坏了该构建


如果自动化测试太脆弱,也许他们不测试功能,但测试实现细节?有时测试实现细节是一个好主意,但可能会有问题。

我们同情您。听起来你有脆性测试综合症。理想情况下,对单元测试的一次更改只会破坏一次测试——这应该是一个真正的问题。就像我说的,“理想”。但这种行为是常见的,是可以治疗的

我建议花一些时间与团队一起做一些根本原因分析,以了解为什么所有这些测试都失败了。是的,有一些奇特的工具可以跟踪哪些测试最常失败,哪些测试一起失败。一些持续集成服务器内置了此功能。太好了。但我怀疑如果你们只是问对方,你们会知道的。我经历过这一切,球队总是从他们的经验中知道这一点

不管是谁,我还看到了一些其他原因:

  • 单元测试通常不应该仅仅依赖于它们所测试的类和方法。寻找已经悄悄进入的依赖项。确保您正在使用依赖项注入来简化测试
  • 这些测试真的是独一无二的吗?还是他们在一遍又一遍地测试同样的东西?如果它们总是会一起失败,为什么不把它们全部去掉,只留下一个呢
  • 与单元测试相比,许多人更喜欢集成,因为它们可以获得更多的覆盖率。但是有了这些,一个单一的改变就可以打破许多测试。也许你在写集成测试
  • 也许他们都在为许多测试运行一些通用的设置代码,导致他们一致地中断。也许这可以模拟出来隔离行为

  • 关于运行最有可能失败的测试的子集,因为它通常是由于其他团队成员(至少在我的情况下)而失败的,我需要请其他人运行我的测试,这在某些开发环境中可能是“政治问题”。)。如有其他建议,将另行通知。非常感谢–SpeeDev 9月30日10时23分18分

  • 如果您必须“要求他人”运行您的测试,那么这表明您的测试基础架构存在严重问题。所有测试(不管是谁编写的)都应该自动运行。修复失败测试的责任应由做出更改的人而不是测试作者承担。

    测试失败是因为导致生产代码中断的更改,还是因为测试过于敏感?@Jon Good point。尤其是不应该测试单元的实现细节,而应该测试单个功能。这是一个常见的错误。没有简单的答案。写更好的测试。嗨,很抱歉反应太晚-我不在办公室。1.我写了“单元测试”,但同时写了单元测试和集成测试。实际上,集成测试通常是失败的。2.关于“跟踪哪些测试最常失败的奇特工具”——我发布的工具并不跟踪哪些测试最常失败,而是查找导致单元测试失败的代码更改(如果您想更好地理解它的工作原理,请观看上面链接中的电影)。这是我在网上找到的唯一一个,但当然,我对其他类型的解决方案和方法持开放态度。任何其他建议都将不胜感激。谢谢你,如果你没有使用嘲弄(stubing,spies,等等),明智地结合这些将有助于你的测试不那么脆弱。嗨,很抱歉反应太晚-我不在办公室。谢谢你的回复。嗨,很抱歉回复太晚-我不在办公室。谢谢你的回复。3.对这些测试非常独特。当然,有一个基础架构代码可以在大多数测试中运行,但基本上-我们不重复测试。4.我们经常测试,但并不总是有帮助。首先,有一些构建将大的更改集提交到源代码管理中,第二,有时候构建不稳定,编译失败了好几天,然后我收到通知说测试在真正失败一周后失败了。关于在每次提交之前运行自动测试,在我(我相信在大多数情况下)的情况下是不现实的,因为运行所有集成测试需要花费很多时间,即使我们要运行它,尽管如此,如果在我的机器上测试失败,我仍然需要弄清楚,如果代码更改导致单元测试失败,那是什么原因——但是你说得对,这应该更容易。关于运行最有可能失败的测试的子集,因为它通常是由于其他团队成员(至少在我的情况下)而失败的,我需要请其他人运行我的测试,这在某些开发环境中可能是“政治问题”。)。如有其他建议,将另行通知。在我看来,持续集成的漏洞在于发现构建在提交之后(甚至在提交之前)就被破坏了。如果你收到通知