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