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

如何以编程方式访问NUnit测试名称?,nunit,naming,Nunit,Naming,是否有某个全局状态可以访问当前运行的测试名称 我有一些测试,可以将文件输出到一个目录中,然后将它们读回。我希望每个测试都创建一个目录来播放,然后在自己之后进行清理,我不希望将该名称推入(我必须使其唯一,然后确保每个测试保持其唯一;ew)。我可以使用GUID,但我希望助手方法能够假定“这是测试文件应该存储的地方”,而不必将GUID推给它们。再一次,这为某个地方的全球状态敲响了警钟 基本上,我需要一个调用,比如TestRunner.Current.CurrentTest.Name。这样的事情存在吗?

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

我有一些测试,可以将文件输出到一个目录中,然后将它们读回。我希望每个测试都创建一个目录来播放,然后在自己之后进行清理,我不希望将该名称推入(我必须使其唯一,然后确保每个测试保持其唯一;ew)。我可以使用GUID,但我希望助手方法能够假定“这是测试文件应该存储的地方”,而不必将GUID推给它们。再一次,这为某个地方的全球状态敲响了警钟


基本上,我需要一个调用,比如
TestRunner.Current.CurrentTest.Name
。这样的事情存在吗?

假设每个测试有一个方法,在NUnit代码中,您可以使用反射从stacktrace获取方法名

如果您在NUnit代码中编写了一个由其他方法调用的帮助器方法来执行此文件日志记录,则可以使用此语法检查前面的方法:


有关更多详细信息,请参见的答案。

我自己还没有升级到2.5.7,但它包括一个
TestContext
类,似乎提供了您想要的内容:

(假设为c)

或者如果您真的很懒,并且没有使用TestCaseSource驱动测试(谢谢@aolszowka):


如果我们使用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
        }
}
}
namespace-nunitests
{
公共班级1
{
静态列表数据=新列表()
{
新测试数据()
{
...
}
};
[测试]
[TestCaseSource(名称(TenMBInstance))]
公共void TestCase(TestData值)
{
TestContext.CurrentContext.Test.Name;//TestCase(NunitTests..TestData)
TestContext.CurrentContext.Test.MethodName;//TestCase
}
}
}

这不会处理多次调用的[TestCase]方法,但它足够接近,可以让您获得代表。这非常有效。我使用正则表达式去除目录名中不起作用的字符,这一切都很好。谢谢要在代码中使用它,请通过调用静态CurrentContext方法获取TestContext。因此,例如:TestContext.CurrentContext.Test.Name更新了NUnit 3的文档:最初建议您在懒惰时使用这个.GetType().ToString();但是,这不适用于TestCaseSource驱动的测试,您必须使用TestContext中的两个重载之一才能在所有场景中工作。@aolszowka为什么删除该行而不是在编辑中添加该信息?@aolszowka但这与您所做的相反。您已删除帖子中的信息,并将其替换为您的评论。
NUnit.Framework.TestContext.CurrentContext.Test.Name 
NUnit.Framework.TestContext.CurrentContext.Test.FullName
this.GetType().ToString()
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
        }
}
}