是你想要的良好覆盖吗?仅仅在一段代码中运行每个分支的测试不太可能实际上意味着它是正确的——通常更多的是关于极端情况,作为开发人员的你最有可能知道这些极端情况是什么。听起来它也可以通过说“这是一个有趣的输入组合”来工作,而你想要的很可能是指定你想看到的系统的行为——如果你一开始就写错了代码,那么有趣的输入可能与正确的代码完全无关。
也许这不是您正在寻找的答案,但我会说最好的方法是手动!在开始编码之前写下规范,并在您知道/正在为您的类/子系统编写 API 时将其转化为大量测试用例。
As begin filling out the API/writing the code you're likely to pick up extra bits and pieces that you need to do + find out what the difficult bits are - if you have conditionals etc that are something you feel that someone refactoring your code might get wrong then write a test case that covers them. I sometimes intentionally write code wrong at these points, get a test in that fails and then correct it just to make sure that the test is checking the correct path through the code.
然后试着想想你可能没有涵盖的任何奇怪的值——负输入、空值等。通常这些情况是无效的,你不想迎合/不得不考虑——在这些情况下,我通常会写一些测试说他们应该抛出异常——这基本上可以阻止人们在你没有正确/使用无效数据的情况下滥用代码。
这样做的另一个好处是,如果您意识到算法需要彻底重写才能满足一些新要求,那么您所要做的就是添加新的测试用例,然后重写/重构;如果您的测试只是查看算法的细节并假设对外部世界的影响,那么您将非常头疼,试图弄清楚算法当前如何影响行为,哪些部分是正确的,哪些不是,然后试图将大量单元测试迁移到新的 API/算法上。