我正在学习单元测试最佳实践(特别感谢这篇文章:What makes good unit-test?),因为在我的项目中,我们开始以一种无政府的方式进行单元测试。所以现在我必须从一开始就采用强大的测试方法。
引用的帖子没有回答的一个问题是我是否必须测试所有课程,甚至是没有特定功能的课程?
编辑:“没有功能”我指的是没有公共方法的类。例如,一个Person类,它只有2个自动实现的Name和Lastname属性。
答案 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)
我打赌你的班级确实有功能。例如,我敢打赌,如果构造函数传递不正确的输入,它应该抛出异常。另外,我敢打赌你们可能会相互比较,并且如果它们都封装了相同的值,则期望它们相等。
如果它确实没有任何功能,并且在概念上更像是一种结构,那么我认为没有必要进行实际测试。