allure-framework / allure-csharp

Allure integrations for C# test frameworks
https://allurereport.org/
Apache License 2.0
105 stars 65 forks source link

Argument null exception when decorating Setup fixtures or extending classes #325

Open vladdex opened 1 year ago

vladdex commented 1 year ago

[//]: # ( . Note: for support questions, please use Stackoverflow or Gitter. . This repository's issues are reserved for feature requests and bug reports. . . In case of any problems with Allure Jenkins plugin please use the following repository . to create an issue: https://github.com/jenkinsci/allure-plugin/issues . . Make sure you have a clear name for your issue. The name should start with a capital . letter and no dot is required in the end of the sentence. An example of good issue names: . . - The report is broken in IE11 . - Add an ability to disable default plugins . - Support emoji in test descriptions )

I'm submitting a ...

What is the current behavior?

If the [AllureNunit] attribute is added to a [SetupFixture] or a [TestFixture] that only contains [OneTimeSetup] methods (for example a BaseTest class which is extended by all test calsses) then a ArgumentNullException is thrown at runtime

   at System.ThrowHelper.ThrowArgumentNullException(String name)
   at System.Collections.Concurrent.ConcurrentDictionary`2.TryGetValue(TKey key, TValue& value)
   at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key)
   at Allure.Net.Commons.Storage.AllureStorage.Get[T](String uuid)
   at Allure.Net.Commons.AllureLifecycle.AddAttachment(String name, String type, Byte[] content, String fileExtension)
   at NUnit.Allure.Core.AllureNUnitHelper.AddConsoleOutputAttachment()
   at NUnit.Allure.Core.AllureNUnitHelper.StopTestCase()
   at NUnit.Allure.Core.AllureNUnitAttribute.AfterTest(ITest test)
   at NUnit.Framework.Internal.Commands.TestActionCommand.<>c__DisplayClass0_0.<.ctor>b__1(TestExecutionContext context)
   at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.<>c__DisplayClass1_0.<Execute>b__1()
   at NUnit.Framework.Internal.Commands.DelegatingTestCommand.RunTestMethodInThreadAbortSafeZone(TestExecutionContext context, Action action)

If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem

Run Test1()

[SetUpFixture]
[AllureNUnit]
public class Setup
{

    [OneTimeSetUp]
    public void Setup1()
    {
        Console.Out.WriteLine("setup");
    }
}

[TestFixture]
[AllureNUnit]
public class Test :Setup
{

    [Test]
    public void Test1()
    {
        Console.Out.WriteLine("Test1");
    }
}

OR

[TestFixture]
[AllureNUnit]
public class Setup
{

    [OneTimeSetUp]
    public void Setup1()
    {
        Console.Out.WriteLine("setup");
    }
}

[TestFixture]
[AllureNUnit]
public class Test :Setup
{

    [Test]
    public void Test1()
    {
        Console.Out.WriteLine("Test1");
    }
}

What is the expected behavior?

Tests should work and Setup/Teardown methods should be logged accordingly in the report. NUnit.Allure 1.2.1.1 handles this correctly logging a message.

What is the motivation / use case for changing the behavior?

Without the [AllureNunit] attribute added to setup classes they are not captured correctly in the report. Check differences here

Please tell us about your environment:

Other information

This is related to #286 I suspect this has something to do with the deprecation of wrapIntoStep property or changes to wrapIntoStep method. Allure.Nunit 2.9.1-preview.5 does not have this problem

vladdex commented 1 year ago

Hey guys, is anyone looking into this problem ?

delatrie commented 1 year ago

Hi, @vladdex !

Try to remove [AllureNUnit] from setup fixtures and base classes:

[SetUpFixture]
public class Setup
{

    [OneTimeSetUp]
    public void Setup1()
    {
        Console.Out.WriteLine("setup");
    }
}

[TestFixture]
[AllureNUnit]
public class Test :Setup
{

    [Test]
    public void Test1()
    {
        Console.Out.WriteLine("Test1");
    }
}

OR

[TestFixture]
public class Setup
{

    [OneTimeSetUp]
    public void Setup1()
    {
        Console.Out.WriteLine("setup");
    }
}

[TestFixture]
[AllureNUnit]
public class Test :Setup
{

    [Test]
    public void Test1()
    {
        Console.Out.WriteLine("Test1");
    }
}