逐步实现功能测试自动化
本文关键字:自动化 功能测试 实现 | 更新日期: 2023-09-27 18:01:07
我在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"));
然而,这在单元测试范式中感觉不太好,在该范式中,建议一次只测试一件事。
所以我在这里寻求一些建议。我是不是想得太多了?我应该继续这样做吗?或者还有其他更好、更适应的方式来完成这样的事情吗?
您的每个测试都应该测试一个逻辑事物。这可能需要几个步骤或断言来验证。这很好。
然而,在我看来,你的测试就像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"));
}
我在这里不得不引起争议——我认为"一个测试,一个测试方法"是一种教条,而不是一种有用的工具。这取决于你的测试是否完整、完整和可预测。我想说,坚持你目前的方法——毕竟,通过拆分和增加复杂性可以获得什么。与为每个Assert添加额外的函数调用相比,您的代码目前的圈复杂度更低。