我是否必须在没有特定功能的情况下进行单元测试?

时间:2009-10-01 11:16:40

标签: .net unit-testing tdd

我正在学习单元测试最佳实践(特别感谢这篇文章:What makes good unit-test?),因为在我的项目中,我们开始以一种无政府的方式进行单元测试。所以现在我必须从一开始就采用强大的测试方法。

引用的帖子没有回答的一个问题是我是否必须测试所有课程,甚至是没有特定功能的课程?

编辑:“没有功能”我指的是没有公共方法的类。例如,一个Person类,它只有2个自动实现的Name和Lastname属性。

5 个答案:

答案 0 :(得分:6)

可以说你不应该有没有特定功能的课程(见single responsibility rule),但答案是肯定的。理想情况下,您应该对您编写的任何类单元测试所有公共方法/属性。

理想情况下:

  • 先写下测试。
  • 创建类/方法等以使测试编译。
  • 实现使测试通过所需的最小代码(如果需要,甚至返回硬编码值以匹配测试)。
  • 重构以删除重复(即更改代码以使其“正常”工作,而不是返回硬编码的“正确”值)。
  • 进行小的更改,以便测试继续通过,并且只要测试开始失败,您就会知道完全失败的原因。
  • 稍后,冲洗,重复。

我从Kent Beck TDD book获得了这个过程。

答案 1 :(得分:2)

没有功能的类的示例是否类似于域对象?

public class DomainObjectFoo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DateCreated { get; set; }
}

如果您的所有类都包含自动实现的属性,字段等,则确实无法测试任何内容。但是,您可以添加类似

的内容
public override string ToString()
{
    return Name;
}

然后它值得单元测试。在这种情况下,单元测试可能很简单,但这没关系。它将准确描述ToString应返回的内容(在本例中为Name)。您甚至可以为此方法编写边缘情况:如果Name为空,该怎么办?如果Name为null怎么办?通常,.NET内容(例如自动实现的属性)不需要单元测试来确保getter和setter工作。但是,即使是最简单的功能(在本例中,ToString())也应该进行测试。

答案 2 :(得分:0)

任何课程都应该进行测试。测试自动化是降低软件缺陷的人为因素的唯一方法。这可以通过测试简单性(分而治之;)和良好的软件设计来实现。

如果您的类实现了多个任务,那么将其拆分。如果它实现了一个任务案例,但其中一些非常庞大,那么将一些代码移动到将在需要时调用的底层类。但是从来没有实现没有精心设计的东西,因为这意味着它没有被正确定义 - 这导致分析不佳。

答案 3 :(得分:0)

在您的情况下,我不知道测试公共自动生成的属性是否值得。但是,您应该考虑期望非空值的情况。

例如:

public IList<Thing> Things {get; set;}

如果你在设置它之前获取这个属性,你将得到一个null,也许你期望(我经常这样做)一个零元素的List。

问候!

答案 4 :(得分:0)

我打赌你的班级确实有功能。例如,我敢打赌,如果构造函数传递不正确的输入,它应该抛出异常。另外,我敢打赌你们可能会相互比较,并且如果它们都封装了相同的值,则期望它们相等。

如果它确实没有任何功能,并且在概念上更像是一种结构,那么我认为没有必要进行实际测试。