c# unit - どのようにユニットテストの中から実行時にユニットテストメソッド名を取得するのですか?





test (5)


NUnit 2.5.7 / 2.6を使用している場合は、 TestContextクラスを使用できます。

[Test]
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully()
{
    string testMethodName = TestContext.CurrentContext.Test.Name;
}

ユニットテストのユニットテストの名前を取得するには?

BaseTestFixtureクラスの中に以下のメソッドがあります:

public string GetCallerMethodName()
{
    var stackTrace = new StackTrace();
    StackFrame stackFrame = stackTrace.GetFrame(1);
    MethodBase methodBase = stackFrame.GetMethod();
    return methodBase.Name;
}

My Test Fixtureクラスは、基本クラスから継承します。

[TestFixture]
public class WhenRegisteringUser : BaseTestFixture
{
}

私は以下のシステムテストを受けています:

[Test]
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully_WithValidUsersAndSites()
{
    string testMethodName = this.GetCallerMethodName();
    //
}

Visual Studio内でこれを実行すると、期待通りにテストメソッド名が返されます。

これがTeamCityで実行されているときに、 _InvokeMethodFast()が返されます。これは、TeamCityが実行時に独自の方法で生成するメソッドのようです。

では、実行時にテストメソッド名を取得するにはどうすればよいですか?




Visual Studioを使用してテストを実行する場合、テストクラスにTestContextプロパティを追加すると、この情報を簡単に取得できます。

[TestClass]
public class MyTestClass
{
    public TestContext TestContext { get; set; }

    [TestInitialize]
    public void setup()
    {
        logger.Info(" SETUP " + TestContext.TestName);
        // .... //
    }
}



NUnitを使用していない場合は、スタックをループしてテストメソッドを見つけることができます:

foreach(var stackFrame in stackTrace.GetFrames()) {
  MethodBase methodBase = stackFrame.GetMethod();
  Object[] attributes = methodBase.GetCustomAttributes(typeof(TestAttribute), false);
  if (attributes.Length >= 1) {
    return methodBase.Name;
  } 
}
return "Not called from a test method";



Nunitやその他のサードパーティのツールを使用していない場合 あなたはTestAttributeを取得しません。

テストメソッドの名前を取得するためにこれを行うことができます。 TestAttributeのTestMethodAttribute instedを使用します

    public string GetTestMethodName()
    {
            // for when it runs via Visual Studio locally
            var stackTrace = new StackTrace();
            foreach (var stackFrame in stackTrace.GetFrames())
            {
                MethodBase methodBase = stackFrame.GetMethod();
                Object[] attributes = methodBase.GetCustomAttributes(typeof(TestMethodAttribute), false);
                if (attributes.Length >= 1)
                {
                    return methodBase.Name;
                }
            }
            return "Not called from a test method";
    }



私はフレームワークを使用しません、私はちょうどautotoolsの "チェック"ターゲットサポートを使用します。 "main"を実装し、assert(s)を使用します。

私のテストディレクトリMakefile.am(s)は次のようになります:

check_PROGRAMS = test_oe_amqp

test_oe_amqp_SOURCES = test_oe_amqp.c
test_oe_amqp_LDADD = -L$(top_builddir)/components/common -loecommon
test_oe_amqp_CFLAGS = -I$(top_srcdir)/components/common -static

TESTS = test_oe_amqp




c# unit-testing automated-tests teamcity