NUnit:记录测试步骤并断言测试失败或错误的描述

NUnit: Log test steps and assert description on test failure or error

在测试失败时,Nunit 将只显示评估的预期和实际情况。如果您有多个断言,则无法判断哪个断言失败

Expected: True
But was: False

同样的异常问题:有一个堆栈跟踪,但它不是那么具有描述性,并且没有告诉我错误发生之前发生的步骤的任何细节。

一种方法是将消息传递给 Assert 或添加日志语句(例如使用 TestContext.WriteLine)。但这意味着每次我写一个断言我都需要写一个唯一的消息或者我必须为每个步骤添加一个日志语句,这很耗时并且在更新测试时需要额外的维护。

是否有更简单的方法来显示此信息,即按原样包含方法调用和断言代码语句?

例如,像这样:

Expected: True
But was: False

On: Assert.That(User.HasOrderInvoice, Is.True)

Steps:
   User.LoginToAccount(UserAccData.TestUserAcc)
   User.AddProductToCart(Data.TestProdData)
   User.PurchaseCart()
   User.GoToOrderHistory()

这里的一个解决方案是使您的测试更加明确。 NUnit 有多种约束可以让您这样做 - 并获得更多有用的失败消息。

例如,我会把你上面的断言写成:

Assert.That(User, Has.Property(nameof(User.HasOrderInvoice)).True)

这会给出类似这样的失败消息:

Expected: Has property 'HasOrderInvoice' equal to true
But was: False

我发现这涵盖了我感兴趣的大部分情况。对于任何无法明确表达的情况,您可以在Assert.That()中添加描述,如下所示:

Assert.That(User.HasOrderInvoice, Is.True, "Test User Has Order Invoice")

这会给你这样的消息:

Test User Has Order Invoice
Expected: True
But was: False

我终于能够通过使用 2 组库来解决这个问题:

  1. PostSharp - 使用 AOP 我能够记录代表导致断言的步骤的方法调用
  2. FluentAssertions - Replacing NUnit assertions with FluentAssertions made assertions failures more readable (https://fluentassertions.com/introduction#subject-identification).