单元测试。什么时候停下来

时间:2013-04-17 14:58:02

标签: unit-testing

我已经在我自己的项目上进行了一段时间的单元测试,并希望得到关于何时停止测试的反馈。请考虑以下示例。

public class Foo
{
    public object Bibble { get; private set; }

    public string Hooch { get; private set; }

    public string BibbleHooch { get { return string.Format("{0},{1}", Bibble, Hooch); } }

    public Foo(object bibble, string hooch)
    {
        if (bibble == null) 
            throw new ArgumentNullException("bibble");

        if (string.IsNullOrEmpty(hooch)) 
            throw new ArgumentNullException("hooch");

        Bibble = bibble;
        Hooch = hooch;
    }
}

在调用构造函数时,我可以想到以下测试。

  • null bibble throws
  • a null hooch throws
  • 空洞的嘘声
  • 一个有效的bibble但是null hooch throws
  • 一个空的bibble,但有效的哇声抛出
  • bibble和hooch都设置为null throws
  • 有效的bibble和hooch不要抛出
  • 一个有效的bibble和hooch意味着Bibble和Hooch不应该为空
  • 有效的bibble和hooch意味着BibbleHooch不应该为空
  • a hooch x应与Foo.Hooch相同
  • a bibble y应该与Foo.Bibble相同
  • 一个x的hooch和一个y的bibble意味着Foo.BibbleHooch应该与xy相同

鉴于这些是不同的排列,我会说它们都是有效的场景。虽然可以删除一些重复,但事实仍然是需要大量的测试来涵盖构造函数的创建。如果我有SetBibble()/ SetHooch方法,我将进入主要的重复。

我的问题是:您将测试上述多少,如何处理排列测试,何时编写测试的成本超过测试值。

2 个答案:

答案 0 :(得分:2)

我会测试实际的逻辑而不会被测试的吸气剂和制定者带走。通常,在测试对象之间的交互过程中会覆盖getter和setter。我看到可能需要测试的示例中的唯一内容是抛出IllegalArgumentExceptions,并且格式化工作正常。 (考虑到你的属性允许成员重置为null,测试抛出异常并没有很多价值。)

单元测试应该对开发人员主要有用,他们并不是为了让管理层满意或满足代码覆盖率指标(尽管有很多地方可以解决这类问题)。我不会花时间测试不相关的事物的不同组合。

答案 1 :(得分:2)

为什么要测试不相关参数之间的相互作用?您已在问题中命名了许多重复测试。我认为你有:

空测试

  • ArgumentNullException测试null bibble
  • ArgumentNullException测试null hooch
  • ArgumentNullException测试空hooch

属性测试

  • Bibble属性由ctor
  • 正确设置
  • Hooch属性由ctor
  • 正确设置
  • BibbleHooch属性返回预期值

这6项测试完全涵盖了班上所有可能的场景。

  

如果我有SetBibble()/ SetHooch方法,我会遇到重大的重复。

如果没有必要,请不要公开setter。首选您的类的最小接口 - 您将需要更少的测试,逻辑将更简单。