c# – 如何在NUnit测试运行中从运行时获取单元测试方法属性?

我存储有关给定测试(多个错误跟踪系统的ID)的各种信息,如下所示:
[TestCaseVersion("001","B-8345","X543")]
public void TestSomethingOrOther()

为了在测试过程中获取这些信息,我写了下面的代码

public string GetTestID()
     {
        StackTrace st = new StackTrace(1);
        StackFrame sf;
        for (int i = 1; i <= st.FrameCount; i++)
        {
            sf = st.GetFrame(i);
            if (null == sf) continue;
            MethodBase method = sf.getmethod();
            if (method.GetCustomAttributes(typeof(TestAttribute),true).Length == 1)
            {
                if (method.GetCustomAttributes(typeof(TestCaseVersion),true).Length == 1)
                {
                    TestCaseVersion tcv =
                        sf.getmethod().GetCustomAttributes(typeof(TestCaseVersion),true).OfType<TestCaseVersion>()
                            .First();
                    return tcv.TestID;
                }
            }
        }

问题是当在版本模式下通过NUnit运行测试时,应该具有测试名称和这些属性方法将被以下替换:

System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method,Object target,Object[] arguments,SignatureStruct& sig,MethodAttributes methodAttributes,RuntimeType typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method,Signature sig,RuntimeType typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] parameters,CultureInfo culture,Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,CultureInfo culture)
   at NUnit.Core.Reflect.InvokeMethod(MethodInfo method,Object fixture,Object[] args)

UPDATE
对于任何有兴趣的人,我以以下方式解决了实现代码(从而可以访问任何属性值,而不用更改任何使用TestCaseVersion属性的现有代码

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method,AllowMultiple = false)]
public class TestCaseVersion : PropertyAttribute
{
   public TestCaseVersion(string testCaseCode,string story,string task,string description)
   {
      base.Properties.Add("TestId",testCaseCode);
      base.Properties.Add("Description",description);
      base.Properties.Add("StoryId",story);
      base.Properties.Add("TaskId",task);
    }
}

public string GetTestID()
{
   return TestContext.CurrentContext.Test.Properties["TestId"];
}

解决方法

如果您有一个单值测试用例版本字符串(即“001,B-8345,X543”而不是“001”,“B-8345”,“X543”),则应该可以使用在NUnit 2.5.7及更高版本中提供了 TestContext功能.

具体来说,您可以定义和使用测试上下文Property属性TestCaseVersion,如下所示:

[Test,Property("TestCaseVersion","001,X543")]
public void TestContextPropertytest()
{
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["TestCaseVersion"]);
}

UPDATE BTW,如果您想要使用测试用例版本的多值表示形式,则可以定义多个属性,Property("MajorVersion","001"),Property("MinorVersion","B-8345"),Property("Build","X543")] public void TestContextPropertytest() { Console.WriteLine(TestContext.CurrentContext.Test.Properties["MajorVersion"]); Console.WriteLine(TestContext.CurrentContext.Test.Properties["MinorVersion"]); Console.WriteLine(TestContext.CurrentContext.Test.Properties["Build"]); }

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...