11

特定のテストに関するさまざまな情報 (複数のバグ追跡システムの 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, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, 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, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at NUnit.Core.Reflect.InvokeMethod(MethodInfo method, Object fixture, Object[] args)

更新 興味のある人のために、次の方法でコードを実装しました (これにより、 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"];
}
4

2 に答える 2

8

単一値のテスト ケース バージョン文字列 (つまり"001, B-8345, X543"の代わり) を使用しても問題ない場合は、 NUnit 2.5.7以降で利用可能なTestContext機能"001","B-8345","X543"を利用できるはず です。

具体的には、テスト コンテキストのProperty属性TestCaseVersionを次のように定義して使用できます。

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

更新ところで、テストケースバージョンの多値表現を使用たい場合は、次のように複数のプロパティを定義できます。

[Test, 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"]);
}
于 2012-08-02T06:16:21.043 に答える
0

私はあなたの考えを理解していないかもしれませんが、もっと単純な解決策を使用しないのはなぜですか?

[TestCase(TestName = "001, B-8345, X543")]
public void TestSomethingOrOther()
于 2012-08-01T16:17:58.423 に答える