如何从单位内部测试中获取单元测试名称?
我在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在运行时为自己使用而生成的方法。
那么我怎样才能在运行时获得测试方法名称?
答案 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";
}