如何在单元测试中从运行时获取单元测试方法名称?

时间:2012-03-12 11:55:43

标签: 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在运行时为自己使用而生成的方法。

那么我怎样才能在运行时获得测试方法名称?

5 个答案:

答案 0 :(得分:18)

如果在测试类中添加TestContext property,则使用Visual Studio运行测试时,可以轻松获取此信息。

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

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

答案 1 :(得分:17)

如果您使用的是 NUnit 2.5.7 / 2.6 ,则可以使用TestContext class

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

答案 2 :(得分:7)

如果你没有使用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";

答案 3 :(得分:5)

谢谢你们;我使用了一种组合方法,因此它现在适用于所有环境:

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

答案 4 :(得分:0)

如果您不使用Nunit或任何其他第三方工具。你不会得到 TestAttribute

所以你可以这样做以获得测试方法名称。 使用 TestAttribute TestMethodAttribute

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