Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 在编写单元测试时,我应该参考实现吗?_Unit Testing - Fatal编程技术网

Unit testing 在编写单元测试时,我应该参考实现吗?

Unit testing 在编写单元测试时,我应该参考实现吗?,unit-testing,Unit Testing,我被分配了一项任务,关于为一些已经实现的类编写单元测试 目前我还不太了解每门课的目的。我关心的是,我应该(1)深入研究实现,还是(2)仅仅看到每个类(及其方法)的输入-预期输出 海事组织: (1) 有一个优势,我可以看到一些潜在的bug,这样我就可以设计出能够覆盖这些情况的单元测试 另一方面,(1)有以下缺点:(a)我可能会因实施而产生偏见,(b):需要时间。事实上,两者都有 首先,也是最重要的一点,您将重点放在测试类的公共契约上。因此,是的,查看输入/输出应该是您的“第一站” 你看,理想情况下

我被分配了一项任务,关于为一些已经实现的类编写单元测试

目前我还不太了解每门课的目的。我关心的是,我应该(1)深入研究实现,还是(2)仅仅看到每个类(及其方法)的输入-预期输出

海事组织:

(1) 有一个优势,我可以看到一些潜在的bug,这样我就可以设计出能够覆盖这些情况的单元测试


另一方面,(1)有以下缺点:(a)我可能会因实施而产生偏见,(b):需要时间。

事实上,两者都有

首先,也是最重要的一点,您将重点放在测试类的公共契约上。因此,是的,查看输入/输出应该是您的“第一站”

你看,理想情况下,你的单元测试不需要任何类型的模拟。您在测试下创建了一些实例
;你调用一个方法;您可以观察/验证某些行为(例如,根据实际返回值断言预期值)

但当然,有时值得深入了解实施的细节

因此,合理的程序是:

  • 编写不了解实现细节的“黑盒”测试(如果可能)
  • 使用覆盖率来了解您的测试覆盖被测类的“良好”程度
从覆盖率数字中,您可以得出进一步的结论,如:

  • 您的黑盒测试是不够的,您需要添加某些“白盒”测试以进入特定的方法。意思是:你观察被测试的班级,了解他们在做什么;以及如何进入重要的角落
  • 您的测试实际上很棒,但是在测试的类中有未使用的代码。也许可以删除它(作为软件工程师,删除源代码是第二件最好的事情!)

最后:创建(或多或少)重新编程实现的单元测试更像是一种反模式。您确实希望避免单元测试除了为生产代码正在进行的那些调用配置mock之外什么都不做。问题是:当您测试实现细节时,任何实现更改(比如简单的重构/重新排序)都可能破坏您的单元测试

如果你不知道这些类的用途是什么,你怎么可能为它们编写测试呢?一个类的编写者应该是为它编写测试的人,事实恰恰相反。实现的编写者倾向于测试当前的实现,而不是测试规范,因此建议不同的人编写测试和实现。如果在实现之前编写测试,效果会更好