SpecFlow icon indicating copy to clipboard operation
SpecFlow copied to clipboard

[BeforeTestRun] and [BeforeFeature] are not executed

Open avinashs15 opened this issue 1 year ago • 2 comments

SpecFlow Version

3.9.74

Which test runner are you using?

NUnit

Test Runner Version Number

3.14

.NET Implementation

.NET 6.0

Project Format of the SpecFlow project

Classic project format using <PackageReference> tags

    <PackageReference Include="Allure.SpecFlow" Version="2.12.1" />
    <PackageReference Include="DotNetEnv" Version="3.0.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
    <PackageReference Include="Microsoft.Playwright" Version="1.44.0" />
    <PackageReference Include="NUnit" Version="3.14.0" />
    <PackageReference Include="SpecFlow" Version="3.9.74" />
    <PackageReference Include="SpecFlow.NUnit" Version="3.9.74" />
    <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
    <PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.9.74" />

.feature.cs files are generated using

SpecFlow.Tools.MsBuild.Generation NuGet package

Test Execution Method

Command line – PLEASE SPECIFY THE FULL COMMAND LINE I use the command dotnet test

SpecFlow Section in app.config or content of specflow.json


{
  "specFlow": {
    "bindingCulture": {
      "name": "en-US"
    },
    "language": {
      "feature": "en-US"
    }
  },
  "stepAssemblies": [
    {
      "assembly": "Allure.SpecFlowPlugin"
    }
  ]
}


Issue Description

I have hooks.cs defined which has [BeforeScenario][AfterScenario][AfterStep][TearDown] which gets executed without an issues but [BeforeTestRun] and [BeforeFeature] are not getting executed. Im using Playwright libraries which uses aysnc Task methods.

Steps to Reproduce

My hooks.cs looks like this //Comment shows which hoo attribute gets executed


using Allure.Net.Commons;
using Microsoft.Playwright;
using NUnit.Framework;
using DotNetEnv;

[assembly: Parallelizable(ParallelScope.Fixtures)]
[assembly: LevelOfParallelism(5)]

namespace cicd_playwright_specflow.src.Hooks
{
    [Binding]
    public class Hooks
    {
        public IPage page { get; private set; } = null!; //-> We'll call this property in the tests
        public IAPIRequestContext RequestContext { get; private set; } = null!;
        public IPlaywright playwrightAPI { get; private set; } = null!;

        [BeforeTestRun] //Does not get executed
        public static async Task BeforeTestRun()
        {
            Console.WriteLine("------Before Test Run");
            // Console.WriteLine("----------InBeforeTestRun");
            // // Load environment variables from .env file
            //  // Call the synchronous static method
            await Task.Run (()=>  LoadEnvironmentVariables());
        }

        [BeforeFeature] //Does not get executed
        public static async Task BeforeAPIFeature()
        {
            await Task.Run (() => Console.WriteLine("Before API Feature ----------"));
        }

        public static void LoadEnvironmentVariables()
        {
            // Load environment variables from .env file
            try
            {
                Env.Load();

                //Somecode
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception ------" + e.Data);
            }
        }

        [BeforeScenario("@UI")] // Gets executed
        public async Task RegisterSingleInstancePractitioner()
        {

            //Initialise Playwright
            var playwright = await Playwright.CreateAsync();
            //Initialise a browser - 'Chromium' can be changed to 'Firefox' or 'Webkit'
            var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
            {
                Headless = false, // -> Use this option to be able to see your test running
                Channel = "chrome",
                SlowMo = 0
                //Channel = "firefox"
            });
            //Setup a browser context
            var context1 = await browser.NewContextAsync();

            //Initialise a page on the browser context.
            page = await context1.NewPageAsync();
        }

        [BeforeScenario("@API")] //Gets executed
        public async Task BeforeAPIScenario()
        {
            Console.WriteLine("Running before Scenario for scenario with API tag");
            playwrightAPI = await Playwright.CreateAsync();
            RequestContext = await playwrightAPI.APIRequest.NewContextAsync(new APIRequestNewContextOptions
            {
                IgnoreHTTPSErrors = true
            });
        }

        [AfterScenario("@UI")] //Gets executed
        public async Task CloseBrowsers()
        {
            if (page != null)
                await page.CloseAsync();
        }

        [AfterStep("@UI")] //gets exeecuted
        public async Task AfterStep(ScenarioContext context)
        {
            if (context.TestError != null)
            {
                Console.WriteLine("Step Failed");
                AllureApi.AddAttachment("FailedScreenshot_" + context.StepContext.StepInfo.Text, "image/png", await page.ScreenshotAsync(new() { FullPage = true }));
            }
        }

        [TearDown]
        public async Task TearDown()
        {
            // Gets executed
        }
    }
}

Link to Repro Project

No response

avinashs15 avatar Jul 03 '24 13:07 avinashs15