我存储有关给定测试(多个错误跟踪系统的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及更高版本中提供了
@L_301_0@功能.
具体来说,您可以定义和使用测试上下文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"]); }