35

MSTest を使用して、[TestInitialize]メソッド内から現在のテストの名前を取得する必要がありました。これはプロパティから取得できTestContext.TestNameます。

TestContextメソッドに渡された static と[ClassInitialize]、パブリック プロパティとして宣言された (そしてテスト ランナーによって設定された) static の動作に予期しない違いがあることがわかりました。

次のコードを検討してください。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestContext.Tests
{
    [TestClass]
    public class UnitTest1
    {
        public TestContext TestContext { get; set; }

        private static TestContext _testContext;

        [ClassInitialize]
        public static void SetupTests(TestContext testContext)
        {
            _testContext = testContext;
        }

        [TestInitialize]
        public void SetupTest()
        {
            Console.WriteLine(
                "TestContext.TestName='{0}'  static _testContext.TestName='{1}'",
                TestContext.TestName,
                _testContext.TestName);
        }

        [TestMethod] public void TestMethod1() { Assert.IsTrue(true); }

        [TestMethod] public void TestMethod2() { Assert.IsTrue(true); }

        [TestMethod] public void TestMethod3() { Assert.IsTrue(true); }
    }
}

これにより、以下が出力されます (VS2013 の Resharper テスト ランナー出力からコピーして貼り付けます)。

TestContext.TestName='TestMethod1'  static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod2'  static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod3'  static _testContext.TestName='TestMethod1'

以前は の 2 つのインスタンスTestContextが同等であると想定していましたが、明らかにそうではありません。

  • public TestContextプロパティは期待どおりに動作します
  • メソッドに渡されるprivate static TestContext値は渡され[ClassInitialize]ません。現在実行中のテストに関連するプロパティがあるためTestContext、この実装は誤解を招き、壊れているようです

TestContextメソッドに渡されたものを実際に使用することを好むシナリオはありますか[ClassInitialize]、それとも無視して使用しないのが最善ですか?

4

5 に答える 5

28

最初だけ呼ばれるので[ClassInitialize]、テスト名はTestMethod1. これは、最初のテスト実行後は古くなっています。

TestContextすべてのメソッドに設定されているため、現在のテスト名があります。

はい、それは少しばかげています。

于 2014-06-17T14:36:54.477 に答える
5

方法

[ClassInitialize]
public static void SetupTests(TestContext testContext) { }

プロパティ セット TestContext が設定される前に呼び出されます。したがって、SetupTests でコンテキストが必要な場合は、パラメーターが役立ちます。それ以外の場合は、それぞれの前に設定されている TestContext プロパティを使用します。

[TestInitialize]
public void SetupTest() { }
于 2014-06-17T14:32:30.593 に答える