Unit testing 在什么时候你达到了单元测试过度的程度?

Unit testing 在什么时候你达到了单元测试过度的程度?,unit-testing,Unit Testing,我目前正在从事一个项目,我正在使用NUnit进行单元测试,使用Moq进行模拟,使用MSpec编写规范,并使用WebAii测试UI 虽然我总体上很享受这段经历,并且学到了很多关于测试什么和如何测试的知识,但我还是想知道这四种工具是否都有点过头了 单元测试有没有变得有点荒谬?有可能做得过火吗?在你看来,什么是合理的测试,什么只是不必要的细节 编辑: 很明显,与其说是我写的测试的数量,不如说是我使用的工具的广度。四个似乎很多,但如果其他人正在使用这种阵容以取得良好效果,我想听听 没有过度测试这回事!当

我目前正在从事一个项目,我正在使用NUnit进行单元测试,使用Moq进行模拟,使用MSpec编写规范,并使用WebAii测试UI

虽然我总体上很享受这段经历,并且学到了很多关于测试什么和如何测试的知识,但我还是想知道这四种工具是否都有点过头了

单元测试有没有变得有点荒谬?有可能做得过火吗?在你看来,什么是合理的测试,什么只是不必要的细节

编辑:

很明显,与其说是我写的测试的数量,不如说是我使用的工具的广度。四个似乎很多,但如果其他人正在使用这种阵容以取得良好效果,我想听听

没有过度测试这回事!当然,你不想这样做。给定方法

public void tripleInt(int i);

您不想测试无穷多个整数。这是不切实际的。您可能想测试正数、负数、整数.Max等。

如果您在测试上浪费的时间比在编码上浪费的时间多,可能您做得太多了。但这是我个人的看法。您可能会感兴趣地将测试驱动开发视为开始测试的一种很好的方法,以确保您将编写所需的代码,并按其应该的方式编写()


祝你好运

如果你一次又一次地测试同一个输入,那就太过分了

只要每个新的测试用例测试不同的东西,您就可以了

当然,你会很快发现一些bug。还有一些罕见的有线案件很难发现。你必须问问自己,如果这个bug在生产中出现,它会有多贵,并将其与生产前找到它所需的价格进行比较

我通常测试边界。如果我写了一个fibuncai函数,我会测试它的值-1,0,1,10和一个整数的Maxvalue。测试20或509不会测试任何尚未涵盖的内容。

一次使用多个测试框架可以吗? 一些开源软件项目确实使用了几种测试框架。如果项目的开发人员不想进行他们自己的模拟,一个常见的设置就是使用单元测试框架和模拟框架

那么什么时候才能达到单元测试过度? 您很快就达到了单元测试的“过度杀伤力”,您可能已经达到了。一般来说,有几种过度测试的方法会破坏您使用的驱动方法的目的。以下是其中之一:

当您开始像编写单元测试一样编写其他类型的测试时,就达到了单元测试过度。这应该通过使用模拟框架(只测试隔离到一个类的交互)和规范框架(测试特性和指定需求)来解决。许多开发人员对此感到困惑,他们似乎认为以相同的方式对待所有不同类型的测试是一个好主意,这导致了一些肮脏的混合

即使TDD专注于单元测试,您仍然会发现自己正在编写功能、集成和性能测试。但是,您必须提醒自己,它们的范围与单元测试有很大的不同这就是为什么有这么多测试工具可用,因为有不同类型的测试。使用许多测试框架没有错,而且大多数测试框架彼此兼容

因此,在编写单元测试时,编写测试时需要考虑以下问题:

unit test                 dirty hybrids               integration test
---------                 -------------               ----------------
* isolated                                            * using many classes 
* well defined                  |                     * tests a larger feature
* repeatable                    |                     * tests a data set
                                |
    |                           |                              |
    |                           |                              |
    v                           v                              v

    O  <-----------------------------------------------------> O 

    ^                           ^                              ^
    |                           |                              |

sweet spot              world full of pain                sweet spot
单元测试集成测试
---------                 -------------               ----------------
*使用多个类进行隔离*
*定义良好的|*测试更大的功能
*可重复|*测试数据集
|
|                           |                              |
|                           |                              |
v v v
O O
^                           ^                              ^
|                           |                              |
甜蜜的世界充满痛苦甜蜜的地方
单元测试很容易编写,您需要编写很多单元测试。但是,如果您编写的测试具有太多的依赖项,那么一旦需求开始改变,您将完成大量的工作。当单元测试中有太多依赖项的代码中断时,您必须检查多个类的代码,而不是一个且只有一个类的代码。这意味着您必须检查它的所有依赖关系,看看问题在哪里,这违背了TDD意义上的单元测试的目的。在一个大型项目中,这将非常耗时

这个故事的寓意是,不要混淆单元测试和集成测试。因为简单地说,他们是不同的。这并不是说其他类型的测试不好,而是应该将它们更多地视为规范或健全性检查。仅仅因为测试中断,它们可能并不表示代码错误。例如:

  • 如果集成测试中断,您的某些需求可能存在问题,需要修改需求、删除、替换或修改测试
  • 如果性能测试中断,取决于它是如何实现的,该测试的随机性可能会让您认为它只是在该实例上运行缓慢
要记住的唯一一件事是以一种易于识别和发现的方式组织测试

您需要一直编写测试吗? 有时省略测试用例是可以的,通常是因为通过验证