逐步功能测试自动化

时间:2015-07-03 15:02:43

标签: c# .net visual-studio testing tdd

我在C#中有一个基本类,我从中为数据绑定方案创建了继承类。您可以将其视为.NET DataRow类的替代品。

我希望自动测试典型行的生命周期,确保对象状态和变化检测等内容始终保持一致。

我的第一个想法是简单地使用单元测试类和一个可以执行多个操作和后续断言的方法,如下所示:

/*
For the sake of keeping this as simple as possible, let's just assume
that new instances can be created with a public constructor, as "unchanged".
*/

var row = new PocoTest(); // Derived from aforementionned base class

Assert.AreEqual(RecordStates.Unchanged, row.RecordState);
Assert.IsFalse(row.IsPropertyModified("MyProperty"));

row.MyProperty = "this is a new value";

Assert.AreEqual(RecordStates.Modified, row.RecordState);
Assert.IsTrue(row.IsPropertyModified("MyProperty"));

row.AcceptChanges();

Assert.AreEqual(RecordStates.Unchanged, row.RecordState);
Assert.IsFalse(row.IsPropertyModified("MyProperty"));

然而,在单元测试范例中,这并不合适,建议一次只测试一件事。

所以我在这里寻找一些建议。我是否想过这个?我应该继续这样做吗?还是有另一种更好,更适应的方式来完成这样的事情吗?

2 个答案:

答案 0 :(得分:3)

你的测试应该每个都测试一个合乎逻辑的东西。这可能需要几个步骤或断言来验证。这很好。

然而,你的测试看起来像3次测试。 1验证在创建时属性是否未更改,然后验证在更改对象时是否反映了该属性,然后验证在接受更改后,状态再次未更改。

您当前对测试的称谓是什么?我怀疑你在给它起名字方面遇到了麻烦,或者它有一个很长的错综复杂的名字。拆分它应该给你很好的描述性名称。

我会这样做:

public void WhenRowIsCreatedItShouldBeInAnUnchangedState()
{
  var row = new PocoTest(); // Derived from aforementionned base class

  Assert.AreEqual(RecordStates.Unchanged, row.RecordState);
  Assert.IsFalse(row.IsPropertyModified("MyProperty"));
}


public void WhenPropertyIsChangedItShouldBeInAModifiedState()
{
  var row = new PocoTest(); // Derived from aforementionned base class
  row.MyProperty = "this is a new value";

  Assert.AreEqual(RecordStates.Modified, row.RecordState);
  Assert.IsTrue(row.IsPropertyModified("MyProperty"));
}

public void WhenChangesAreAcceptedItShouldBeInAnUnchangedState()
{
  var row = new PocoTest(); // Derived from aforementionned base class
  row.MyProperty = "this is a new value";
  row.AcceptChanges();

  Assert.AreEqual(RecordStates.Unchanged, row.RecordState);
  Assert.IsFalse(row.IsPropertyModified("MyProperty"));
}

答案 1 :(得分:1)

我必须在这里引起争议 - 我认为“一种测试,一种测试方法”是一种教条,而不是一种有用的工具。这是您的测试是完整,完整和可预测的问题。我会说你现在采用的方法 - 毕竟通过拆分和增加复杂性可以获得什么。您的代码目前的圈复杂度低于为每个Assert添加额外的函数调用。