web-dev-qa-db-ja.com

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

ユニット内テストからユニットテスト名を取得するにはどうすればよいですか?

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

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

私のTestFixtureクラスは、基本クラスから継承しています。

_[TestFixture]
public class WhenRegisteringUser : BaseTestFixture
{
}
_

そして私は以下のシステムテストを持っています:

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

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

これがTeamCityによって実行されると、代わりに_InvokeMethodFast()が返されます。これは、TeamCityが実行時に独自に使用するために生成するメソッドのようです。

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

25
The Light

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

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

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";

みんなありがとう;組み合わせたアプローチを使用したため、すべての環境で機能するようになりました。

public string GetTestMethodName()
{
    try
    {
        // for when it runs via TeamCity
        return TestContext.CurrentContext.Test.Name;
    }
    catch
    {
        // 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(TestAttribute), false); 
            if (attributes.Length >= 1)
            {
                return methodBase.Name;
            }
        }
        return "Not called from a test method";  
    }
}
7
The Light

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

したがって、これを実行してテストメソッド名を取得できます。 TestMethodAttribute insted of TestAttributeを使用します。

    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";
    }
1
Jay Patel