使用NUnit - 如何获得当前正在执行的测试夹具和名称?

时间:2010-07-02 20:42:30

标签: c# nunit

我想在我正在使用的辅助方法中获取当前正在执行的NUnit测试。我们实际上在这里使用NUnit进行集成测试 - 而不是单元测试。测试完成后,我们希望测试在完成后清理一些日志文件。目前,我已经使用StackFrame类破解了这个:

class TestHelper
{
    string CurrentTestFixture;
    string CurrentTest;
    public TestHelper()
    {
        var callingFrame = new StackFrame(1);
        var method = callingFrame.GetMethod();
        CurrentTest = method.Name;
        var type = method.DeclaringType;
        CurrentTestFixture = type.Name;
    }
    public void HelperMethod()
    {
        var relativePath = Path.Combine(CurrentTestFixture, CurrentTest);
        Directory.Delete(Path.Combine(Configurator.LogPath, relativePath));
    }
}

[TestFixture]
class Fix
{
    [Test]
    public void MyTest()
    {
        var helper = new TestHelper();
        //Do other testing stuff
        helper.HelperMethod();
    }
    [Test]
    public void MyTest2()
    {
        var helper = new TestHelper();
        //Do some more testing stuff
        helper.HelperMethod();
    }
}

这很好用,除非有些情况下我想让TestHelper类成为我的fixture的一部分,如下所示:

[TestFixture]
class Fix
{
    private TestHelper helper;

    [Setup]
    public void Setup()
    {
        helper = new TestHelper();
    }

    [TearDown]
    public void TearDown()
    {
        helper.HelperMethod();
    }

    [Test]
    public void MyTest()
    {
        //Do other testing stuff
    }
    [Test]
    public void MyTest2()
    {
        //Do some more testing stuff
    }
}

我不能简单地将这个类变成全局夹具,因为有时单个测试会多次使用它,有时测试根本不需要使用它。有时测试需要将特定属性附加到TestHelper ......就像那样。

因此,我希望能够以某种方式获得当前正在执行的测试而无需手动重复夹具的名称并在我正在查看的几千个测试案例中进行测试。

有没有办法获得这些信息?

3 个答案:

答案 0 :(得分:4)

NUnit 2.5.7添加了一个“实验性”TestContext类。它包含的一个属性是TestName。我没有尝试过,所以我不知道TearDown方法中的信息是否可用。

答案 1 :(得分:0)

TestHelper构造函数中的代码移动到HelperMethod会对您有所帮助吗?

class TestHelper
{
    public void HelperMethod()
    {
        string CurrentTestFixture;
        string CurrentTest;

        var callingFrame = new StackFrame(1);
        var method = callingFrame.GetMethod();
        CurrentTest = method.Name;
        var type = method.DeclaringType;
        CurrentTestFixture = type.Name;

        var relativePath = Path.Combine(CurrentTestFixture, CurrentTest);
        Directory.Delete(Path.Combine(Configurator.LogPath, relativePath));
    }
}

答案 2 :(得分:0)

通过外观是你不能,因为在设置和拆卸点的堆栈帧不包括测试方法。

至于清理日志文件,看起来您希望每个测试方法都有一个日志文件。也许在这种情况下,它们可能更好:

  1. 使用随机ID作为日志文件名的一部分,您可以在帮助程序类的拆卸中清除它。但是,如果测试方法的名称必须是您可以执行的日志文件的一部分..
  2. 您可以实现IDisposable清理

    [Test]
    public void MyTest()
    {
        using(new TestHelper())
        {
            ... test goes here ...
        }
    }
    
  3. 或者使用PostSharp将上述代码编织为测试方法属性的一部分。

    [Test, TestHelper]
    public void MyTest()
    {
       ...
    }
    
  4. [编辑]

    修复了格式。添加了IDisposable