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





2 Answers

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

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

    [TestInitialize]
    public void setup()
    {
        logger.Info(" SETUP " + TestContext.TestName);
        // .... //
    }
}
c# unit-testing automated-tests teamcity

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

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が実行時に独自の方法で生成するメソッドのようです。

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




みんなありがとう; 私は組み合わされたアプローチを使用したので、すべての環境で動作します:

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





Related