如何编写加载项以在Parameterize Method Suite中的NUnit测试用例中扩展单个测试

时间:2012-12-27 11:28:55

标签: nunit add-in

我正在编写一个扩展NUnitTestMethod并覆盖其RecordException()方法的插件,以根据可以标记测试的多个自定义属性提供有关测试的更多信息。

到目前为止,我已成功创建了一个插件来扩展单个测试,并使用[Test]扩展名为ITestDecorator属性。当我尝试对测试用例执行大部分相同操作时,会出现问题,标记为参数化[TestCase()]属性。在这种情况下,NUnit创建了一个所谓的ParametrizedMethodSuite,我似乎无法找到一种方法来注入我的类,它继承自NUnitTestMethod到这样的套件中。

前段时间我发布了NUnit邮件列表的问题,没有得到任何答案。也许这里有一些NUnit大师,遇到同样的问题可以帮到我吗?

有关我项目的代码示例,请参阅NUnit邮件列表中的帖子:
https://groups.google.com/d/topic/nunit-discuss/dZW0Nc8N2LM/discussion

修改
在深入研究了NUnit源代码之后,我终于想出了一种实现我想要的方式,尽管方式不同。
据我所知,不可能使用自己的测试方法填充ParameterizedMethodSuite,这些方法继承自NUnitTestMethod,因为我无法在派生类中访问私有参数构造,因此无法设置它们。 /> 我最终扩展了ParameterizedMethodSuite并覆盖Run()方法,随后修改了从TestResult返回的base.Run()个 为了保持一致性,扩展NUnitTestMethod的类现在也会覆盖Run()方法。

在此过程中,我还发现了一个有趣的异常:TestResult.StackTrace有一个setter,而TestResult.Message没有。由于我实际需要修改消息,因此我不得不通过SetResult()方法更新所有内容。

[NUnitAddin(Name = "Custom Tag Attribute Decorator", Description = "Outputs additional information for tests tagged with custom attributes.")]
public class TagDecorator : ITestDecorator, IAddin
{
    public Test Decorate(Test test, MemberInfo member)

    {
        List<Attribute> tags = Reflect.GetAttributes(member, false).OfType<ITestTag>().Cast<Attribute>().ToList();
        if (tags.Count == 0)
        {
            return test;
        }

        if (test is NUnitTestMethod)
        {
            return new TestMethodExtension((test as NUnitTestMethod).Method, tags);
        }

        if (test is ParameterizedMethodSuite)
        {

            ParameterizedMethodSuite suite = test as ParameterizedMethodSuite;
            ParameterizedMethodSuiteExtension outputSuite = new ParameterizedMethodSuiteExtension(member as MethodInfo, tags);
            NUnitFramework.ApplyCommonAttributes(member, outputSuite);
            outputSuite.RunState = suite.RunState;
            outputSuite.IgnoreReason = suite.IgnoreReason;


            foreach (NUnitTestMethod testMethod in suite.Tests)
            {
                outputSuite.Add(testMethod);
            }

            return outputSuite;
        }

        return test;
    }

    public bool Install(IExtensionHost host)
    {
        IExtensionPoint testDecorators = host.GetExtensionPoint("TestDecorators");
        if (testDecorators == null)
            return false;

        testDecorators.Install(this);
        return true;
    }
}


public static class TagExtensionHandler
{
    public static void ModifyTestResult(TestResult testResult, List<Attribute> tags)
    {
        StringBuilder message = new StringBuilder();
        message.AppendLine("Related to:");
        foreach (ITestTag taggedAttrib in tags.OfType<ITestTag>().Select(attrib => attrib))
        {
            message.Append("     ");
            message.AppendLine(taggedAttrib.GetInfo());
            message.AppendLine();
        }

        message.AppendLine();
        message.Append(testResult.Message);

        testResult.SetResult(testResult.ResultState, message.ToString(), testResult.StackTrace, testResult.FailureSite);
    }
}

public class ParameterizedMethodSuiteExtension : ParameterizedMethodSuite
{
    private readonly List<Attribute> _tags;
    public ParameterizedMethodSuiteExtension(MethodInfo method, List<Attribute> tags)
        : base(method)
    {
        _tags = tags;
    }

    public override TestResult Run(EventListener listener, ITestFilter filter)
    {
        TestResult result = base.Run(listener, filter);
        foreach (TestResult subResult in result.Results)
        {
            TagExtensionHandler.ModifyTestResult(subResult, _tags);
        }

        return result;
    }
}

public class TestMethodExtension : NUnitTestMethod
{
    private readonly List<Attribute> _tags;
    public TestMethodExtension(MethodInfo methodInfo, List<Attribute> tags)
        : base(methodInfo)
    {
        _tags = tags;
    }

    public override TestResult Run(EventListener listener, ITestFilter filter)
    {
        TestResult result = base.Run(listener, filter);
        TagExtensionHandler.ModifyTestResult(result, _tags);
        return result;
    }
}

0 个答案:

没有答案