Подтвердить что ты не робот

Как получить имя метода unit test во время выполнения из unit test?

Как получить имя unit test из unit test <? >

У меня есть метод ниже в классе 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 генерирует во время выполнения для собственного использования.

Итак, как я могу получить имя метода тестирования во время выполнения?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Если вы не используете 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";

Ответ 4

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

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

Ответ 5

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

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