我正在学习单元测试。我有一个“域对象”,除了保持状态(即Employee
没有任何业务逻辑)之外没有太大作用。它有一个方法SetDefaults()
,它只是用合理的值填充它的状态。一个简单的方法。
但是当我去单元测试这个方法时,我能想到的就是运行方法,然后检查每个字段是否应该是什么。喜欢(在C#
中):
[TestMethod()]
public void SetDefaultsTest()
{
Employee target = new Employee();
employee.SetDefaults();
Assert.AreEqual(employee.Name, "New Employee");
Assert.AreEqual(employee.Age, 30);
// etc.
}
在我的测试中复制SetDefaults()的整个功能感觉不对。我应该保持这种方法未经测试吗?问题是我想要一个测试,以确保当新属性添加到类时,它们也被添加到SetDefaults()方法。
答案 0 :(得分:3)
琐碎的getter和setter有时候没有为它们编写单元测试。如果这就是SetDefaults()的全部内容,那么跳过它可能不会有什么坏处。
您要考虑测试的一件事是,在调用employee
后,SetDefaults()
实例的所有设置属性都不为空:
var nonNullProperties = new object[] { employee.Name, employee.Age, ... };
foreach (var property in nonNullProperties)
Assert.IsNotNull(property);
这是有道理的,因为你真的只关心他们 设置为某个默认值,而不是他们是特定的值。
答案 1 :(得分:2)
这取决于您从该测试中获得的价值。不要仅仅为了测试而进行测试。但是,如果这些默认值非常重要,而不是更改,那么请继续。
许多测试涉及决定“嘿,这是否会让我的工作从长远来看更容易?”这些默认值是一直在变化,还是不变?默认值是非常复杂的,还是少数字符串和数字?这些默认值是否正确对客户有多重要?对其他开发人员来说,默认值是否正确有多重要?
测试可以做一百万件事,但如果不给那些关心它的人增加一些价值,那就不用担心了。如果您被要求自动测试所有代码的100%,那么阅读和讨论以下博客中提出的一些想法可能会使您的团队受益:
http://blog.jayfields.com/2009/02/thoughts-on-developer-testing.html http://msdn.microsoft.com/en-us/magazine/cc163665.aspx
否则,如果它没有增加太多价值或经常中断,我会说继续并将其遗漏。
答案 2 :(得分:1)
对我来说,这看起来是一个非常合理的单元测试。您正在提供一个简单的测试,用于检查调用该方法的结果。但是,它对任何新属性都没有帮助,因为现有的测试仍然会通过。也许您可以使用Reflection迭代对象的所有属性并检查它们是否为空?
同样SetDefaults()
似乎是一种有点奇怪的方法。为什么不直接将新的Employee
初始化为这些值?这样,另一个程序员就不会创建Employee
并忘记致电SetDefaults()
。