这个单元测试是多余的吗?

时间:2014-07-28 17:17:44

标签: unit-testing

这些天我写了比我不久前更多的单元测试,因为我意识到我做得不好(我觉得我做得很好,但实际上却错过了很多测试)。我有点不确定我是否过度做了。

以下面的Asp.NET MVC控制器方法声明为例:

[HttpGet]
[ValidateAntiForgeryToken]
public ActionResult Edit(EditOrganizationViewModel editOrganizationViewModel)

如果模型状态无效,我希望该方法返回ViewResult,其中EditOrganizationViewModel与传递给方法的相同[TestMethod] public void EditPost_InvalidModelState_ReturnsViewResult() [TestMethod] public void EditPost_InvalidModelState_ReturnsEditComplianceViewModel() [TestMethod] public void EditPost_InvalidModelState_ReturnsSameEditComplianceViewModel() (editOrganizationViewModel)。

所以我写了以下三个测试:

[TestMethod]
public void EditPost_InvalidModelState_ReturnsEditComplianceViewModelWithSameName()

第二次测试由于第三次测试而感到多余,因为它是隐含的。第三次测试通过时,第二次测试不应该失败。我们还需要吗?

如果问题的答案是“否,我们不需要它”,那么如果我们添加一个测试来检查视图模型的属性是否具有相同的原因,那么我们应该能够删除第三个测试没有被控制器更改:

{{1}}

我能看到保留这些“看似减少”的测试的唯一原因是,尽管它们现在可能会减少,但它们可能不会在将来出现。保留它们的一个非常强大的理由,直到现在我才想到的一个。我想我只是说服自己,但我想知道人们的想法。我有可能错过了一些东西。

1 个答案:

答案 0 :(得分:2)

这是有争议的,也取决于动机和推理。你的所有积分都是非常有效的,我会做的几乎一样。例如,即使他们有一些冗余,也要保持测试,我有充分的理由保留它们。

:用于:

另外看看这种方式.. 您的测试名称非常具有描述性,可以准确地说明被测系统(SUT)作为规范/文档。因此,即使测试之间存在重叠,这些测试也有助于新人理解SUT的作用。

即使测试不能存在而没有其他测试(正如你在3次测试中所做的那样),只要他们测试完全不同的东西就没有任何伤害。这是你的规范(某种程度)

<强>反对:

这是一个简单的自然规则,对于单元测试更是如此,您可能希望删除任何重复或冗余。 测试非常重要,但与此同时,它是您必须维护的额外代码。因此,如果我们不注意,我们会在轨道上增加很多负担来维持这些测试。

一般来说,尝试针对一次失败测试进行一次更改。如果您更改代码,多个测试失败,您可以查看删除一些冗余。单元测试中有一个概念,你应该只在测试中测试一件事。这是非常正确的,但并不意味着你只会断言一件事。只要您的单元测试验证逻辑相关的操作,它仍然会测试被测系统的一个方面(SUT)。

你测试方法名称是非常具有描述性的,这是一件非常好的事情。这意味着你计划单独测试一件事 - 应该是。当您以这种方式编写测试时,如果仍然发现存在冗余,则删除冗余测试。如果您进行TDD(测试驱动开发),那么您将删除冗余代码/测试的过程的这一部分。

<强>结论:

尝试在For vs Against之间取得一些平衡,但要倾向于不进行冗余测试。