逐步的功能测试自动化
Step-by-step functional testing automation
我在 C# 中有一个基本的 class,我从中创建了用于数据绑定方案的继承 classes。您可以将其视为 .NET 的 DataRow
class.
的替代品
我想自动测试典型行的生命周期,确保对象状态和更改检测等内容始终保持一致。
我的第一个想法是简单地使用单元测试 class 和一个可以执行多个操作和后续断言的方法,如下所示:
/*
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"));
然而,这在建议一次只测试一个东西的单元测试范例中感觉不对。
所以我想在这里寻求一些建议。我是不是想多了?我应该继续这样做吗?还是有另一种更好、更适应的方法来完成这样的事情?
我必须在这里引起争议 - 我认为 "one test, one test method" 是教条而不是有用的工具。这关系到您的测试是否完整、完整和可预测。我会说采用您当前的方法 - 毕竟通过拆分和增加复杂性可以获得什么。您的代码目前的圈复杂度低于为每个断言添加额外的函数调用。
你的每个测试都应该测试一件合乎逻辑的事情。这可能需要几个步骤或断言来验证。这很好。
但是你的测试在我看来像 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"));
}
我在 C# 中有一个基本的 class,我从中创建了用于数据绑定方案的继承 classes。您可以将其视为 .NET 的 DataRow
class.
我想自动测试典型行的生命周期,确保对象状态和更改检测等内容始终保持一致。
我的第一个想法是简单地使用单元测试 class 和一个可以执行多个操作和后续断言的方法,如下所示:
/*
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"));
然而,这在建议一次只测试一个东西的单元测试范例中感觉不对。
所以我想在这里寻求一些建议。我是不是想多了?我应该继续这样做吗?还是有另一种更好、更适应的方法来完成这样的事情?
我必须在这里引起争议 - 我认为 "one test, one test method" 是教条而不是有用的工具。这关系到您的测试是否完整、完整和可预测。我会说采用您当前的方法 - 毕竟通过拆分和增加复杂性可以获得什么。您的代码目前的圈复杂度低于为每个断言添加额外的函数调用。
你的每个测试都应该测试一件合乎逻辑的事情。这可能需要几个步骤或断言来验证。这很好。
但是你的测试在我看来像 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"));
}