你的测试应该多详细/多细粒度

How verbose/granular should your tests be?

本文关键字:细粒度 测试      更新时间:2023-10-16

我最近开始了一个新项目,我决定为大多数功能编写单元测试。在此之前,我的测试仅限于偶尔编写测试"函数",以确保某些东西按预期工作,然后从不费心更新测试函数,显然不好。

现在我已经编写了相当数量的代码和测试,我注意到我正在为我的代码编写大量的测试。我的代码通常是相当模块化的,从某种意义上说,我尝试编写一些做简单事情的小函数,然后根据需要将它们链接在一起,形成一个更大的函数,这也是公认的最佳实践。

但我现在最终编写测试的个人"积木"功能(非常小的测试),以及测试一起用铁链锁住他们的功能,和测试结果,显然结果将是不同的,但由于输入是相似的,我复制一个的测试代码(设置输入部分,每个但不是略有不同的,因为它们不相同的我不能使用一个文本夹具. .)。

另一个问题是,我试图严格遵守每个测试只测试一件事,所以我为函数中的每个不同功能编写一个测试,例如,如果有一些额外的输入可以传递给函数,但这是可选的,我编写一个添加输入的版本,一个不添加输入的版本,并分别测试它们。这里的设置几乎相同,除了我添加的输入,再次不完全相同,所以使用夹具感觉不"正确"。

因为这是我的第一个项目,所有的东西都经过了完全的单元测试,我只是想确保我做的事情是正确的,测试中的代码复制是预期的。所以,我的问题是:我做得对吗?如果不是,我应该改变什么?

我用C和c++写代码。

顺便说一句,我喜欢测试本身,我现在对我的代码更有信心了。

谢谢!

你的问题试图解决很多问题,我只能回答其中的一些。

  1. 尝试获得尽可能高的覆盖率(理想情况下是100%)
  2. 不要在单元测试中使用真正的资源,或者至少尽量避免使用。您可以使用mock和stub。不要对第三方库进行单元测试。
  3. 你可以使用依赖注入或函子来打破依赖。这样可以减少测试的规模。