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