Ответ 1
Если вы используете NUnit 2.5.7/2.6, вы можете использовать класс TestContext:
[Test]
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully()
{
string testMethodName = TestContext.CurrentContext.Test.Name;
}
Как получить имя 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 генерирует во время выполнения для собственного использования.
Итак, как я могу получить имя метода тестирования во время выполнения?
Если вы используете NUnit 2.5.7/2.6, вы можете использовать класс TestContext:
[Test]
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully()
{
string testMethodName = TestContext.CurrentContext.Test.Name;
}
При использовании Visual Studio для запуска тестов, если вы добавили свойство TestContext в свой тестовый класс, вы можете легко получить эту информацию.
[TestClass]
public class MyTestClass
{
public TestContext TestContext { get; set; }
[TestInitialize]
public void setup()
{
logger.Info(" SETUP " + TestContext.TestName);
// .... //
}
}
Если вы не используете 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";
Спасибо, ребята; Я использовал комбинированный подход, поэтому теперь он работает во всех средах:
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";
}
}
Если вы не используете 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";
}