在执行TDD时,如何判断“这个类/功能的测试是否足够”?
即。你什么时候能说你完成了对所有边缘案件的测试?
答案 0 :(得分:13)
使用测试驱动开发,您将在编写测试代码之前编写测试。一旦你编写了代码和测试通过,那么是时候编写另一个测试了。如果您正确地遵循TDD,那么一旦您的代码完成了所有必需的操作,您就已经编写了足够多的测试。
对于边缘情况,我们举一个例子来验证方法中的参数。在将参数添加到代码之前,您将创建测试,以验证代码是否能正确处理每个案例。然后,您可以添加参数和关联的逻辑,并确保测试通过。如果你想到更多的边缘情况,那么可以添加更多的测试。
通过一步一步,当您编写代码时,您不必担心边缘情况,因为您已经为它们编写了所有测试。当然,总会有人为错误,你可能会错过一些东西......当出现这种情况时,是时候添加另一个测试,然后修复代码。
答案 1 :(得分:9)
Kent Beck的建议是编写测试,直到恐惧变成无聊。也就是说,假设你从适当程度的恐惧开始,你就不再害怕任何事情会破裂。
答案 2 :(得分:3)
在某种程度上,这是一种直觉
“我相信这些测试能够解决我能想到的所有问题 现在?“
在另一个层面上,您已经拥有必须满足的一组用户或系统要求,因此您可以停在那里。
虽然我确实使用代码覆盖率来告诉我,如果我没有遵循我的TDD流程并找到可以删除的代码,我不会将代码覆盖率视为知道何时停止的有用方法。您的代码覆盖率可能是100%,但如果您忘记包含一项要求,那么,您还没有完成,是吗?
或许对TDD的误解是你必须事先知道一切才能进行测试。这是错误的,因为TDD过程产生的测试就像一个面包屑痕迹。你知道过去经过测试的东西,可以在一定程度上引导你,但它不会告诉你下一步该怎么做。
我认为TDD可以被认为是一个进化过程。也就是说,您从初始设计开始,然后是一组测试。当您的代码在生产中受到重创时,您会添加更多测试以及使这些测试通过的代码。每次你在这里添加一个测试,并在那里进行测试,你也会做TDD,而且费用不高。当你编写第一组测试时,你不知道存在这些情况,但是你现在已经掌握了这些知识,只需按一下按钮就可以检查这些问题。这是TDD的强大力量,也是我为此提倡的一个原因。
答案 3 :(得分:2)
好吧,当你想不到任何不能按预期工作的失败案例时。
TDD的一部分是保留你想要实现的东西的列表,以及你当前实现的问题......所以当这个列表用完时,你基本上就完成了....
请记住,当您发现实施中的错误或新问题时,您可以随时返回并添加测试。
答案 4 :(得分:2)
请不要忘记,如果你以后发现了一个bug,先写一个测试来重现bug,然后更正它,这样你就可以防止将来的更改再次破坏它!
有些人抱怨他们没有X%的报道......一些测试没用,100%的报道并不意味着你测试一切可以使你的代码破坏,只有它不会破坏的事实你用它的方式!
答案 5 :(得分:2)
测试是一种精确描述您想要的东西的方法。添加测试会扩展您想要的范围,或者添加您想要的详细信息。
如果你想不出你想要的任何东西,或者你想要的任何改进,那么继续前进。你可以随时回来。
答案 6 :(得分:2)
TDD中的测试涉及规范,实际上它们可以是规范的替代。在TDD中,测试不是关于覆盖代码。它们确保代码涵盖规范,因为如果代码不符合规范,代码将无法通过测试。您拥有的任何额外代码都无关紧要。
当测试看起来像是描述了您或利益相关者的所有期望时,您就有足够的测试。
答案 7 :(得分:1)
也许我错过了Agile / XP世界的某些地方,但我对这个过程的理解是开发人员和客户将测试指定为功能的一部分。这允许测试用例替换更正式的需求文档,帮助识别功能的用例等。所以当所有这些测试都通过时,你已经完成了测试和编码...以及你认为的更多边缘情况一路走来
答案 8 :(得分:1)
Alberto Savoia says“如果你的所有考试都通过了,那么你的考试可能不够好”。我认为这是考虑测试的一种好方法:询问你是否在做边缘情况,传递一些意想不到的参数等等。提高测试质量的一个好方法是使用一对 - 特别是测试人员 - 并获得有关更多测试用例的帮助。与测试人员配对很好,因为他们有不同的观点。
当然,您可以使用某种工具来mutation tests,并从测试中获得更多信心。我使用了Jester,它改善了我的测试和我编写它们的方式。考虑使用类似的东西。
亲切的问候
答案 9 :(得分:1)
从理论上讲,你应该涵盖所有可能的输入组合并测试输出是否正确,但有时它是不值得的。
答案 10 :(得分:1)
许多其他评论已经触头。鉴于您的测试覆盖率,您对自己编写的代码有信心吗?随着您的代码的发展,您的测试是否仍能充分覆盖它?您的测试是否捕获了待测组件的预期行为和功能?
必须有一个幸福的媒介。随着您添加越来越多的测试用例,您的测试可能会变得脆弱,因为边缘情况会不断变化。根据之前的许多建议,随着软件的发展,获得您可以预先考虑的所有内容然后添加新的测试非常有用。这种有机生长可以帮助您的测试成长,而无需预先付出任何努力。
我不会撒谎,但在回去编写额外的测试时我经常会变得懒惰。我可能会错过包含0代码的属性或我不关心的默认构造函数。有时不完全肛门的过程可以节省你不那么重要的区域的时间(100%的代码覆盖率神话)。
你必须记住,最终目标是获得一流的产品,而不是自杀测试。如果你有这样的直觉,就像你错过了某些东西,那么你很有可能并且你需要添加更多的测试。
祝你好运,编码愉快。
答案 11 :(得分:0)
您可以随时使用测试覆盖率工具,如EMMA(http://emma.sourceforge.net/)或其Eclipse插件EclEmma(http://www.eclemma.org/)等。一些开发人员认为,100%的测试覆盖率是一个有价值的目标;其他人不同意。
答案 12 :(得分:0)
尝试在各种方式内提出你可能会导致失败的事情。空值,超出范围的值等。一旦你不能轻易拿出任何东西,只需继续做其他事情。
如果您在路上发现了新的错误或想出办法,请添加测试。
这与代码覆盖无关。这是一个危险的指标,因为代码在“经过良好测试”之前很久就会被“覆盖”。