Использование NUnit - как я могу получить в настоящий момент выполняемое тестовое устройство и имя? - PullRequest
3 голосов
/ 03 июля 2010

Я бы хотел получить текущий выполняемый тест 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 частью моего прибора, например:1004 *

[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 ]

4 голосов
/ 25 августа 2010

NUnit 2.5.7 добавил «экспериментальный» класс TestContext.Одно из содержащихся в нем свойств - TestName.Я не пробовал, поэтому не знаю, доступна ли информация в методе TearDown.

0 голосов
/ 03 июля 2010

Похоже, что вы не можете, потому что кадр стека в точке установки и демонтажа не включает в себя метод теста.

Что касается очистки файлов журнала, похоже, вы хотите иметь файл журнала для каждого метода тестирования. Возможно, в этом случае может быть лучше:

  1. Используйте случайный идентификатор как часть имени файла журнала, который вы можете очистить в разборке вспомогательного класса. Однако если имя метода теста является частью файла журнала, вы можете это сделать.
  2. Вы можете реализовать IDisposable для очистки

    [Test]
    public void MyTest()
    {
        using(new TestHelper())
        {
            ... test goes here ...
        }
    }
    
  3. Или используйте PostSharp , чтобы создать вышеприведенный код как часть атрибута в вашем методе тестирования.

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

[EDIT] * * тысячу двадцать-один

исправлено форматирование. Добавлен IDisposable

0 голосов
/ 03 июля 2010

Перемещение кода, который вы имеете в конструкторе 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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...