C# ExtentReport 仅显示最后一次测试 class (NUnit3)

C# ExtentReport shows only last test class (NUnit3)

我遇到了 ExtentReport 问题,我有几个 class 测试,我想生成一个包含所有测试的报告。我创建了一个带有范围报告初始化的 BaseTest class,测试 classes 继承了它并使用静态变量创建测试,我的问题是 BaseTest class 测试有一个 [OneTimeTearDown ] 方法在其中使用 extent.Flush() 并在每个 classes 完成其中的测试后调用它,然后结果是最后一个 class 覆盖了 class 在它之前。提前致谢!

基础Class:

[SetUpFixture]
public class BaseClass
{
    public static ExtentReports extent;
    public static ExtentHtmlReporter htmlReporter;
    public static ExtentTest extentTest;
    private string path = ""

[OneTimeSetUp]
public void SetUp()
{
    htmlReporter = new ExtentHtmlReporter(path);

    extent = new ExtentReports();
    extent.AttachReporter(htmlReporter);

    htmlReporter.Config.DocumentTitle = "Tests Report";
    htmlReporter.Config.ReportName = "Issta Tests Report";

    extent.AddSystemInfo("OS", "Windows 10");
    extent.AddSystemInfo("Environment", "QA");
    extent.AddSystemInfo("User Name", "Valeri Rozenberg");
}

[OneTimeTearDown]
public void TearDown()
{
    extent.Flush();
    // Email.sendEmail(path);
}
}

测试class:

namespace AutomationTests
{
    [TestFixture]
    public class AutomaticDeals: BaseClass
    {
        DriverManager driverManager;
        public IWebDriver driver;
        public string url = ""

        [SetUp]
        public void SetUpTests()
        {
            driverManager = 
DriverManagerFactory.GetDriverManager(DriverType.Chrome);
            driver = driverManager.GetWebDriver();
            driver.Url = url;
        }

        [Test]
        public void TestLinks()
        {
            extentTest = extent.CreateTest("TestLinks");
            AutomaticDealsPage aDeals = new AutomaticDealsPage(driver);
            Assert.IsTrue(aDeals.CheckEqualUrls(1));
            extentTest.Log(Status.Pass, "Url's in the automatic deals 
page are equal.");
        }

        [Test]
        public void TestPrices()
        {
            extentTest = extent.CreateTest("TestPrices");
            AutomaticDealsPage aDeals = new AutomaticDealsPage(driver);
            Assert.IsTrue(aDeals.allPricesEqual());
            extentTest.Log(Status.Pass, "Prices in the automatic deals 
page are equal.");
        }
    }
}

简化问题陈述:

  1. 您有一项操作(初始化范围报告),您希望在任何测试之前执行该操作 运行。
  2. 您有另一个操作(刷新范围报告),您希望在所有测试完成后执行 运行。

如果这些操作是基础 class 的一部分,代码将重复 运行,如果您使用 '[SetUp]and[TearDown,则每个测试方法一次]or once for each test fixture class using[OneTimeSetUp]` 和“[OneTimeTearDown]”。所以你想做的事情在一个基础class.

是无法完成的

Actually, the first part (initialization) can be done in the base class, using a static flag so that you only initialize the first time. However, there's no way for your code to know that it is being called for the last time, so the second part is impossible.

这种情况正是SetUpFixtureAttribute要处理的

  1. 创建一个新的 class 标记为 [SetUpFixture]。将 class 放在包含所有测试的顶级命名空间中,或者(更简单)放在任何命名空间之外。

  2. 给出 class [OneTimeSetUp] 和 [OneTimeTearDown] 方法。将要在 运行 测试之前和之后执行的操作分别移动到这些方法中。

在任何命名空间之外的 SetUpFixture 中定义,初始化操作将在程序集中的任何测试 运行 和所有测试完成后的拆卸之前发生。

如果一次性初始化留下任何信息供您的测试使用,请将该信息保存在 class 的静态属性中。