How to get the unit test method name at runtime from within the unit test?

后端 未结 5 1693
栀梦
栀梦 2020-12-28 14:57

How to get the unit test name from the within unit test?

I have the below method inside a BaseTestFixture Class:

public string GetCallerMethodName()
         


        
相关标签:
5条回答
  • 2020-12-28 15:01

    If you are not using NUnit you can loop over the stack and find the test method:

    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";
    
    0 讨论(0)
  • 2020-12-28 15:08

    If you are using NUnit 2.5.7 / 2.6 you can use the TestContext class:

    [Test]
    public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully()
    {
        string testMethodName = TestContext.CurrentContext.Test.Name;
    }
    
    0 讨论(0)
  • 2020-12-28 15:10

    If you are not using Nunit or any other third party tool. you will not get TestAttribute.

    So you can do this to get Test Method name. Use 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";
        }
    
    0 讨论(0)
  • 2020-12-28 15:21

    When using Visual Studio to run your tests if you add a TestContext property in your test class you can get this information easily.

    [TestClass]
    public class MyTestClass
    {
        public TestContext TestContext { get; set; }
    
        [TestInitialize]
        public void setup()
        {
            logger.Info(" SETUP " + TestContext.TestName);
            // .... //
        }
    }
    
    0 讨论(0)
  • 2020-12-28 15:25

    Thanks guys; I used a combined approach so it now works in all environments:

    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";  
        }
    }
    
    0 讨论(0)
提交回复
热议问题