Как получить имя метода модульного теста во время выполнения из модульного теста? - PullRequest
21 голосов
/ 12 марта 2012

Как получить название модульного теста изнутри модульного теста?

У меня есть метод ниже в классе 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 ]

18 голосов
/ 24 ноября 2015

Если вы используете Visual Studio для запуска ваших тестов, если вы добавили TestContext свойство в ваш тестовый класс, вы можете легко получить эту информацию.

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

    [TestInitialize]
    public void setup()
    {
        logger.Info(" SETUP " + TestContext.TestName);
        // .... //
    }
}
17 голосов
/ 12 марта 2012

Если вы используете NUnit 2.5.7 / 2.6 , вы можете использовать TestContext class :

[Test]
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully()
{
    string testMethodName = TestContext.CurrentContext.Test.Name;
}
7 голосов
/ 12 марта 2012

Если вы не используете 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";
6 голосов
/ 16 марта 2012

Спасибо, ребята; Я использовал комбинированный подход, так что теперь он работает во всех средах:

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 голосов
/ 29 сентября 2015

Если вы не используете Nunit или какой-либо другой сторонний инструмент. вы не получите TestAttribute .

Таким образом, вы можете сделать это, чтобы получить имя метода тестирования. Используйте TestMethodAttribute insted из 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";
    }
...