我们的团队正在就是否允许将失败的单元测试签入源控制进行激烈辩论。
一方面,争论是肯定的,只要它是暂时的,就可以在当前的冲刺中解决。有人说即使在当前冲刺中可能无法纠正的错误的情况下,我们也可以签入相应的失败测试。
论证的另一方面是那些测试,如果他们签入,必须用Ignore属性标记 - 原因是每晚构建不应该作为开发人员的TODO列表。
忽略属性的问题是我们倾向于忘记测试。
社区对我们有什么建议吗?
我们是一个由8名开发人员组成的团队,每晚都会进行构建。就个人而言,我正在尝试练习TDD,但团队倾向于在编写代码后编写单元测试
答案 0 :(得分:9)
我不仅要说你不应该检查新的失败测试,你应该禁用“10次左右的长期失败测试”。当然,更好地解决它们,但是每晚都有一个失败的构建和每个包含的测试通过(有些被排除在外) - 你最好是绿色。就目前的情况而言,当您更改导致现有测试套件出现新故障的内容时,您很可能会错过它。
禁用失败的测试并为每个测试输入一张票;那样你就可以了。您也会对自动构建系统感觉好多了。
答案 1 :(得分:5)
我和一位朋友讨论了这个,我们的第一个评论是最近的极客和捅:)(附)
更具体一点 - 所有测试都应该在之前编写(只要它应该是TDD),但那些检查未实现的功能的测试应该在其前面加上否定值。如果它没有实现 - 它应该不起作用。 [如果它有效 - 测试很糟糕]在实施测试后你删除了!
并且它可以正常工作[或失败,但那时它就是这样做:)]。
你不应该认为测试是一次性的,而且总是正确的。测试也可能有bug。所以编辑测试应该是正常的。
答案 2 :(得分:4)
我会说,检查(已知)失败的测试当然应该是暂时的,如果有的话。如果构建总是失败,它就会失去意义(我们一直在那里而且那不是很好)。
我想如果您发现了一个错误并且可以通过测试快速重现它,那么检查失败的测试是可以的,但是违规代码不是“你的”并且您没有时间/责任进入它足以修复代码。然后给一个知道他的方式并指向测试的人一张票。
否则我会说你的票系统是TODO列表,而不是构建。
答案 3 :(得分:1)
这取决于您如何使用测试。在我的小组中,运行测试是你在提交之前做的,以便检查你(可能)没有破坏任何东西。
当你即将提交的时候,找到失败的测试看起来很痛苦,这些测试看起来很可能与你的变化有关,但仍然很奇怪,调查了几个小时,然后意识到它不可能是因为你的变化,做一个干净的检查,编译,并确定测试失败确实来自主干。
显然你不会以同样的方式使用测试,否则你甚至不会问。
答案 4 :(得分:1)
如果您使用的是DVCS(例如,git),这不会是一个问题,因为您将失败的测试提交到本地存储库,使其工作,然后推送整批(测试和修复)到团队的主存储库。干得好,大家都开心。
由于您似乎无法做到这一点,您可以做的最好的事情是首先确保测试已编写并在沙箱中失败,然后在提交之前修复它。这可能是也可能不是伟大的TDD,但它与其他人的工作实践是合理的妥协;与你的同事一起工作比在每个方面遵循一些象牙塔原则更重要,因为该原则的作者不在隔壁的隔间内......
答案 5 :(得分:1)
你每晚构建的目的是让你相信前一天写的代码没有破坏任何东西。如果测试经常失败,那么你就无法获得这种信心。
您应首先修复任何失败的测试,然后删除或注释掉/忽略其他失败的测试。每晚的建筑都应该是绿色的。如果不是那么就会出现问题而且现在很明显,因为它应该是绿色的。
其次,你永远不应该检查失败的测试。你永远不应该故意破坏构建。永远。它会造成不必要的噪音,干扰并降低信心。它还在质量和纪律方面创造了一种懒惰的氛围。对于已检入的忽略测试,应在代码审查中捕获并解决这些问题,这也应该涵盖测试代码。
如果人们想先编写代码并稍后进行测试,这是可以的(虽然我更喜欢TDD),但只有经过测试的绿色代码才能签入。
最后,我建议将每晚构建更改为持续集成构建(在每次代码检查时运行),这可能会改变人们在代码签入时的习惯。
答案 6 :(得分:1)
我可以看到你有很多问题。
1)您正在编写失败的测试。
太好了!但是,有人打算检查“在当前冲刺中修复”。这告诉我,这些单元测试通过需要很长时间。测试覆盖了一个或两个以上的行为方面,或者您的底层代码太复杂了。重构代码以将其分解并使用模拟将被测试类的职责与其协作者分开。
2)您倾向于忘记使用[忽略]属性进行测试。
如果您提供的是人们关心的代码,它是否有效,或者是否存在需要更改系统行为的错误。如果您的单元测试描述了该行为但行为尚未发挥作用,那么您不会忘记,因为有人会注册错误。但是,请参阅第1点。
3)您的团队在编写代码后正在编写测试。
这对于学习TDD的团队来说相当普遍。如果他们认为测试不是作为检查他们的代码是否被破坏的测试,而是另一个开发人员可能想要使用他们的代码的示例,以及他们的代码提供的值的描述,他们可能会发现它更容易。也许你可以和他们配对并帮助他们学习他们之后编写测试的知识?
4)你正在尝试练习TDD。
做或不做。没有尝试。先写一个测试,否则。即使您认为自己正在做TDD,学习也永远不会停止。