BDD和测试覆盖率

5
我已经开始使用Quick和Nimble编写我在iOS上的第一个BDD测试,并且我对测试覆盖率有疑问。
我意识到,在传统的单元测试中,开发人员会努力实现100%的测试覆盖率。但是,我没有在BDD中读到这一点。如果我正确理解BDD,那么当我测试代码行为时,实现的细节并不重要;重要的是我从我的代码中得到了预期的结果,对吗?
我试图获得100%的代码覆盖率,但是似乎我开始编写容易出错的测试,因为我不是专注于代码的结果,而是试图涵盖代码可以采取的所有路径。
问题:
1. 我是否正确理解了BDD? 2. 争取100%的代码覆盖率是否违背了BDD的目的?

1
BDD和TDD的区别不在于测试覆盖率,而在于专注于软件行为而非测试实现细节(有些人称之为测试API而非实现)。BDD和TDD都将导致100%的代码覆盖率,因为其中一个主要思想是在任何实现代码之前先编写测试。 - Sam
2
你可以使用两种方法实现100%的测试覆盖率,但是BDD将确保您开发了正确的东西。 - Rénald
1
我知道传统的单元测试中,开发人员的目标是实现100%的测试覆盖率。但实际上并非如此。100%的测试覆盖率意味着代码的所有分支至少被遍历一次,这可以通过覆盖工具来证明。通常情况下这是不必要的,除非你正在编写高度保障的代码(此时形式化方法可能更加适用)。单元测试的目的是验证单元的正确功能,以便在修复错误和重构后可以轻松地检查其功能是否仍然正确。如果想实现100%的覆盖率,则还需要重新编写单元测试。 - David Tonhofer
1个回答

9
正如评论中提到的一样,BDD的核心是为你提供测试(可以自动化),以确保你的产品正好做它应该做的事情。显然,“不少于这个”。因此,BDD加上覆盖率有助于确保您的产品不会做得比这更多。
换句话说:假设你的所有BDD测试都通过了;你的覆盖率为75%……那就可能意味着:你的代码库中25%的代码并不需要在BDD测试用例中指定的行为中提供。也就是说,你可以仔细查看那25%未使用的代码行,了解它们为什么不需要,然后确定是否有可能删除这些未使用的源代码的某些部分。
即:作为软件开发人员,你可以做的第二件最好的事情是从你的代码库中删除代码,而不会减少你的产品功能。
(顺便说一下:软件开发人员可以做的最好的事情是为他的产品添加一个吸引新客户的新功能——删除代码有助于长期提高质量,但客户短期、中期和长期内支付你的薪水。)

有道理。 - Nick Kohrn
1
当你讨论75%和25%时,我发现更清晰了。原因是我在一些guard语句中添加了fatalError()来帮助我轻松找到逻辑漏洞。然而,在运行我的测试时,guard语句的else子句没有被执行,因为一切都按预期运行。我正在创建额外的测试,使guard语句通过else子句,从而获得else子句的覆盖范围,但不知道这是否适用于实现100%的覆盖率。 - Nick Kohrn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接