如何以编程方式访问NUnit测试名称?

时间:2010-08-27 22:14:42

标签: nunit naming

是否有某些全局状态我可以访问当前运行的测试名称?

我有测试将文件输出到一个目录中并将其读回。我希望每个测试都能创建一个目录,然后自行清理,我不想在那里推送该名称(我必须让它独一无二,然后确保每个测试都保持独特; ew)。我可以使用GUID,但我希望帮助方法能够假设“这是应该存储测试文件的地方”,而不必将GUID推送到它们。再一次,这是一个全球状态的螺旋钻。

基本上,我想要一个像TestRunner.Current.CurrentTest.Name这样的电话。这样的事情存在吗?

4 个答案:

答案 0 :(得分:31)

(假设c#)

NUnit.Framework.TestContext.CurrentContext.Test.Name 

NUnit.Framework.TestContext.CurrentContext.Test.FullName

或者如果你真的很懒,并且没有使用TestCaseSource进行测试(感谢@aolszowka):

this.GetType().ToString()

答案 1 :(得分:23)

我还没有升级到2.5.7,但它包含一个TestContext类,它似乎只能提供您正在寻找的内容:http://www.nunit.org/index.php?p=releaseNotes&r=2.5.7

答案 2 :(得分:4)

假设每个Test有一个方法,在NUnit代码中,您可以使用反射从堆栈跟踪中获取方法名称。

如果您在其他方法调用的NUnit代码中编写辅助方法来执行此文件记录,则可以使用此语法检查上一个方法

string MethodName = new StackFrame(1).GetMethod().Name;

有关详细信息,请参阅question 44153, "Can you use reflection to find the name of the currently executing method?"的答案。

答案 3 :(得分:0)

如果我们使用 TestCaseSource 标签,那么上述解决方案可能无法给出正确答案

尝试使用 TestContext.CurrentContext.Test.MethodName

按照下面的例子

namespace NunitTests
{
public class Class1
{

static List<TestData> Data = new List<TestData>()
        {
            new TestData()
            {
                ...
            }
        };

[Test]
        [TestCaseSource(nameof(TenMBInstance))]
        public void TestCase(TestData value)
        {
            TestContext.CurrentContext.Test.Name; //TestCase(NunitTests..TestData) 
            TestContext.CurrentContext.Test.MethodName; //TestCase
        }
}
}