想象一下,有一个汽车对象的 CRUD(创建、读取、更新、删除)测试。
最好有
[Test, Order(1)]
{
Create
}
[Test, Order(2)]
{
Read
}
[Test, Order(3)]
{
Update
}
[Test, Order(4)]
{
Delete
}
或者
[Test]
{
Create
Read
Update
Delete
}
两种方法都有效,但我想知道各有什么优缺点
想象一下,有一个汽车对象的 CRUD(创建、读取、更新、删除)测试。
最好有
[Test, Order(1)]
{
Create
}
[Test, Order(2)]
{
Read
}
[Test, Order(3)]
{
Update
}
[Test, Order(4)]
{
Delete
}
或者
[Test]
{
Create
Read
Update
Delete
}
两种方法都有效,但我想知道各有什么优缺点
这是可以得出基于意见的答案的问题之一,但我认为可以相当事实地回答它。
当编写测试时,人们会假设它有可能失败 - 否则,为什么要编写它。如果失败,您需要知道出了什么问题。假设您为所有测试指定了有意义的名称,第一种方法会告诉您,例如,更新失败,而其他三种方法有效。这对它有利。
在第二种方法中,您需要添加消息来明确失败的原因。这是一个小小的不便,但您最不想想到的是必须查看堆栈跟踪来简单地知道这四个中的哪一个失败了。
一个折衷的办法是这样写。
事实上,这是 TDD 的老前辈普遍建议的。如果您的测试尽可能小而简单,那么重复某些操作所需的额外时间应该是最少的,其成本远低于您可能花费在找出问题所在上的额外时间的价值。
在 NUnit 下,为了获得额外的酷感,您可以使用 Assume.That 来确保每个初步的 Create 操作都通过,而不会生成额外的错误。
正如@Ilya 所指出的,您的第一种方法使得不可能单独运行单个测试。通过使测试独立,可以避免这个问题。
所以...使测试独立并自我记录。其他一切实际上都是意见问题。:-)