Unit testing 单元测试。何时停止

Unit testing 单元测试。何时停止,unit-testing,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 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;
    }
}
当调用构造函数时,我可以想到以下测试

  • 一个空的bibble抛出
  • 一个空的胡说八道
  • 空空荡荡的胡说八道
  • 有效的bibble但无效的hooch抛出
  • 无效的bibble但有效的hoow抛出
  • bibble和hooch都设置为空抛出
  • 一个有效的bibble和hooch不能扔
  • 有效的bibble和hooch表示bibble和hooch不应为null
  • 有效的bibble和hooch表示BibbleHooch不应为null
  • hooch x应该与Foo.hooch相同
  • bibble y应该和Foo.bibble一样
  • x的hooch和y的bibble表示Foo。BibbleHooch应与xy相同
考虑到这些是不同的排列,我想说它们都是有效的场景。诚然,可以删除一些重复项,但事实上仍然需要大量的测试来覆盖构造函数的创建。如果我有setibble()/SetHooch方法,那么我将陷入严重的重复


我的问题是:你会测试上面的多少,你如何处理排列测试,什么时候编写测试的成本超过测试的价值。

我会测试实际逻辑,而不会因为测试getter和setter而得意忘形。通常,getter和setter在测试对象之间的交互过程中都会用到。在您的示例中,我认为可能需要测试的唯一事情是抛出IllegalArgumentException,并且格式化工作正常。(考虑到您的属性允许成员重置为null,测试抛出的异常没有太大价值。)


单元测试应该主要对开发人员有用,而不是为了让管理层满意或满足代码覆盖率指标(尽管有很多地方会被这类事情冲昏头脑)。我不会花时间测试不相关的事物的不同组合。

我会测试实际的逻辑,而不会因为测试getter和setter而得意忘形。通常,getter和setter在测试对象之间的交互过程中都会用到。在您的示例中,我认为可能需要测试的唯一事情是抛出IllegalArgumentException,并且格式化工作正常。(考虑到您的属性允许成员重置为null,测试抛出的异常没有太大价值。)


单元测试应该主要对开发人员有用,而不是为了让管理层满意或满足代码覆盖率指标(尽管有很多地方会被这类事情冲昏头脑)。我不会花时间测试不相关的事物的不同组合。

为什么要测试不相关参数之间的交互?你的问题中有很多重复的测试。在我看来,你有:

空测试
  • ArgumentNullException
    测试空bibble
  • ArgumentNullException
    测试空hooch
  • ArgumentNullException
    测试空hooch
性能测试
  • Bibble
    属性由ctor正确设置
  • Hooch
    由ctor正确设置的属性
  • BibbleHooch
    属性返回预期值
这6个测试完全涵盖了课堂上所有可能的场景

如果我有setibble()/SetHooch方法,那么我将陷入严重的重复


如果没有必要,不要暴露setter。更喜欢类的最小接口-您需要的测试更少,逻辑也更简单。

为什么要测试不相关参数之间的交互?你的问题中有很多重复的测试。在我看来,你有:

空测试
  • ArgumentNullException
    测试空bibble
  • ArgumentNullException
    测试空hooch
  • ArgumentNullException
    测试空hooch
性能测试
  • Bibble
    属性由ctor正确设置
  • Hooch
    由ctor正确设置的属性
  • BibbleHooch
    属性返回预期值
这6个测试完全涵盖了课堂上所有可能的场景

如果我有setibble()/SetHooch方法,那么我将陷入严重的重复


如果没有必要,不要暴露setter。与类相比,您更喜欢一个最小的接口-您将需要更少的测试,并且逻辑将更简单。

在测试时,您是如何描述快乐路径的。例如新Foo(空,“有效字符串”);“勇敢之旅”是幸福之路。或者问一下您如何命名这个测试可能更好。我会通过NullArgumentExceptionOnNullBibble将该测试命名为
(或者无论您的等效命名约定是什么)。。。这不是一条快乐的道路!我想这可能是一个过度思考的情况,我的情况是这样的。我很担心是否明确提到了快乐之路,但我想我不会为此担心。只要测试有效。如果您的意思是“我应该如何命名测试以查看hooch属性是否设置正确?”那么
hoochpropertysetcorrectlyfromtor
如何呢?啊,我明白了-不,您不必担心提及“快乐路径”是什么(测试不在乎!),而是关注测试的实际行为,无论测试是快乐还是例外,你是如何描述快乐的道路的。例如新Foo(空,“有效字符串”);“勇敢之旅”是幸福之路。或者问一下您如何命名这个测试可能会更好。我会通过NullArgumentExceptionOnNullBibble将这个测试命名为
(或者其他类似的名称)