6

作为基于测试的开发的新手,这个问题一直困扰着我。多少是太多了?应该测试什么,应该如何测试,为什么要测试?给出的示例是在 C# 中使用 NUnit,但我认为问题本身与语言无关。

这是我自己的两个当前示例,对通用列表对象的测试(使用字符串进行测试,初始化函数添加了三个项目{"Foo", "Bar", "Baz"}):

[Test]
public void CountChanging()
{
    Assert.That(_list.Count, Is.EqualTo(3));
    _list.Add("Qux");
    Assert.That(_list.Count, Is.EqualTo(4));
    _list[7] = "Quuuux";
    Assert.That(_list.Count, Is.EqualTo(8));
    _list.Remove("Quuuux");
    Assert.That(_list.Count, Is.EqualTo(7));
}

[Test]
public void ContainsItem()
{
    Assert.That(_list.Contains("Qux"), Is.EqualTo(false));
    _list.Add("Qux");
    Assert.That(_list.Contains("Qux"), Is.EqualTo(true));
    _list.Remove("Qux");
    Assert.That(_list.Contains("Qux"), Is.EqualTo(false));
}

该代码是相当自我注释的,所以我不会详细说明正在发生的事情,但是这种事情是否太过分了?Add()并且Remove()当然是单独测试的,那么我应该通过这些测试达到什么水平?我什至应该进行这些测试吗?

4

4 回答 4

7

我会说你实际测试的是等价类。在我看来,添加到包含 3 个项目或 7 个项目的列表没有区别。但是,0 项、1 项和 >1 项之间存在差异。对于这些情况,我最初可能会对 Add/Remove 方法进行 3 次测试。

一旦质量检查/用户开始出现错误,我会将每个这样的错误报告添加为测试用例;通过获得红色条查看错误重现;通过获得绿色条来修复错误。每一个这样的“错误检测”测试都会保留下来——这是我的安全网(阅读:回归测试),即使我再次犯这个错误,我也会得到即时反馈。

于 2008-10-04T07:37:29.840 回答
6

将您的测试视为规范。如果您的系统可以在测试失败的情况下发生故障(或存在重大错误),那么您的测试覆盖率就不够了。如果一个单点故障导致许多测试中断,那么您可能有太多(或过于紧密耦合)。

这真的很难以客观的方式定义。我想我会在测试太多方面说错误。然后,当测试开始让您烦恼时,这些就是要重构/重新调整用途的特定测试(因为它们太脆弱,或者测试错误的东西,并且它们的失败没有用)。

于 2008-10-04T06:57:16.643 回答
2

一些提示:

  1. 每个测试用例应该只测试一件事。这意味着测试用例的结构应该是“setup”、“execute”、“assert”。在您的示例中,您混合了这些阶段。尝试拆分您的测试方法。这样可以更轻松地准确查看您正在测试的内容。

  2. 试着给你的测试方法起一个描述它正在测试什么的名字。即包含在您的 ContainsItem() 中的三个测试用例变为: containsReportsFalseIfTheItemHasNotBeenAdded()、 containsReportsTrueIfTheItemHasBeenAdded()、 containsReportsFalseIfTheItemHasBeenAddedThenRemoved()。我发现强迫自己想出一个这样的描述性名称有助于我在编写实际测试代码之前概念化我必须测试的内容。

  3. 如果您使用 TDD,您应该首先编写测试,并且只有在测试失败时才将代码添加到您的实现中。即使您实际上没有这样做,它也会让您了解多少测试就足够了。或者使用覆盖工具。对于像容器这样的简单类,您应该以 100% 的覆盖率为目标。

于 2008-10-04T07:05:14.897 回答
1

_list您编写的类的实例吗?如果是这样,我会说测试它是合理的。尽管在那种情况下,您为什么要构建自定义 List 类?

如果它不是您编写的代码,请不要测试它,除非您怀疑它在某种程度上存在错误。


我尝试测试独立和模块化的代码。如果我必须维护代码中的某种上帝功能,我会尽可能多地将其剥离成子功能并独立测试它们。那么 God 函数可以写成“明显正确”——没有分支,没有逻辑,只是将结果从一个经过良好测试的子函数传递到另一个。

于 2008-10-04T06:56:33.323 回答