如果多个方法具有该钩子,是否有一种方法可以设置 NUnit [OneTimeTearDown] 测试钩子的顺序?

问题描述 投票:0回答:1

我有一个移动自动化项目,该项目使用 .NET 6 以及 Specflow、NUnit 和 Xamarin.UITest。 当我的项目在 .NET Framework 4.8 上并且使用钩子 [OneTimeTearDown] 时,我能够创建一个控制台方法,可以使用代码生成实时文档。请参阅此处以供参考: https://github.com/SpecFlowOSS/SpecFlow/issues/2701 在 .NET 6 中,我遇到一个问题,即当它生成活动文档时,但它使用的是上次运行的 TestExecution.json,而不是刚刚完成的运行。我发现这是因为 TestExecution.json 是在我启动的 [OneTimeTearDown] 方法之后生成的。这是由于 Specflow NUnit 使用相同的钩子,见下文:

// <auto-generated />
#pragma warning disable

using System.CodeDom.Compiler;
using System.Diagnostics;
using global::NUnit.Framework;
using global::TechTalk.SpecFlow;
using global::System.Runtime.CompilerServices;

[GeneratedCode("SpecFlow", "3.9.74")]
[SetUpFixture]
public class HEBPharmacy_UITests_NUnitAssemblyHooks
{
    [OneTimeSetUp]
    [MethodImpl(MethodImplOptions.NoInlining)]
    public void AssemblyInitialize()
    {
        var currentAssembly = typeof(HEBPharmacy_UITests_NUnitAssemblyHooks).Assembly;

        TestRunnerManager.OnTestRunStart(currentAssembly);
    }

    [OneTimeTearDown]
    [MethodImpl(MethodImplOptions.NoInlining)]
    public void AssemblyCleanup()
    {
        var currentAssembly = typeof(HEBPharmacy_UITests_NUnitAssemblyHooks).Assembly;

        TestRunnerManager.OnTestRunEnd(currentAssembly);
    }
}
#pragma warning restore

这是我的方法:

[AfterTestRun]
[OneTimeTearDown]
public static void AfterTestRun()
{
    if (TestEnvironment.Platform.Equals(TestPlatform.Local))
    {
        Thread.Sleep(1000);
        GenerateLivingDoc();
    }
}

请记住,[AfterTestRun] 的 Specflow 挂钩在 Mac 上不起作用,因此这不是一个解决方案。正如你所看到的,我在方法上有它,但它不能解决问题。 有没有办法设置 [OneTimeTearDown] 挂钩,以便我的方法在 Specflow 的方法之后启动?我该怎么做?

c# nunit .net-6.0 specflow xamarin.uitest
1个回答
0
投票

我不知道如何设置订单,但我能够解决我的生活文档问题。通过从 SpecFlow 本身获取方法并将它们添加到我的代码库中。这些是我采取的方法:

    [SetUpFixture]
public class RxCheck_UITests_NUnitAssemblyHooks
{
    //[OneTimeSetUp]
    [MethodImpl(MethodImplOptions.NoInlining)]
    public void AssemblyInitialize()
    {
        var currentAssembly = typeof(RxCheck_UITests_NUnitAssemblyHooks).Assembly;

        TestRunnerManager.OnTestRunStart(currentAssembly);
    }

    //[OneTimeTearDown]
    [MethodImpl(MethodImplOptions.NoInlining)]
    public void AssemblyCleanup()
    {
        var currentAssembly = typeof(RxCheck_UITests_NUnitAssemblyHooks).Assembly;

        TestRunnerManager.OnTestRunEnd(currentAssembly);
    }
}

一旦我添加了当实时文档生成时我控制的那些方法,如下所示:

 [OneTimeSetUp]
    public void OnAutomationStartup()
    {
        RxCheck_UITests_NUnitAssemblyHooks.AssemblyInitialize();
       
    }

    [AfterTestRun]
    [OneTimeTearDown]
    public void AfterTestRun()
    {
        if (TestEnvironment.Platform.Equals(TestPlatform.Local))
        {
            RxCheck_UITests_NUnitAssemblyHooks.AssemblyCleanup();
            Thread.Sleep(1000);
            GenerateLivingDoc();
        }
    }

我希望这可以帮助任何使用 .net 6 使用 SpecFlow 的人

© www.soinside.com 2019 - 2024. All rights reserved.