Подтвердить что ты не робот

Когда я использую атрибут TestFixtureSetUp вместо конструктора по умолчанию?

В документации NUnit не указывается, когда использовать метод с TestFixtureSetup и когда делать настройку в конструкторе.

public class MyTest
{
    private MyClass myClass;

    public MyTest()
    {
        myClass = new MyClass();
    }

    [TestFixtureSetUp]
    public void Init()
    {
        myClass = new MyClass();
    }
}

Существуют ли какие-либо хорошие/плохие практики в отношении конструктора TestFixtureSetup по умолчанию или нет какой-либо разницы?

4b9b3361

Ответ 1

Я думаю, что это была одна из проблем, которая не была решена командой nUnit. Тем не менее, есть отличный проект xUnit, который увидел эту точную проблему и решил, что конструкторы хорошо подходят для использования на инициализация тестового оборудования.

Для nunit наилучшей практикой в ​​этом случае было использование методов TestFixtureSetUp, TestFixtureTearDown, SetUp и TearDown, как описано в документации.

Я думаю, что это также помогает мне, когда я не думаю о тестировании nUnit как нормальном классе, даже если вы определяете его с помощью этой конструкции. Я думаю о них как о светильниках, и это заставляет меня преодолевать психическое препятствие и позволяет мне игнорировать эту проблему.

Ответ 2

Зачем вам нужно использовать конструктор в тестовых классах?

Я использую [SetUp] и [TearDown] помеченные методы для кода, который должен быть выполнен до и после каждого теста, и аналогично [TestFixtureSetUp] и [TestFixtureTearDown] помечены методы для кода, который должен выполняться только один раз до и после всего теста в были запущены приборы.

Я думаю, вы, вероятно, могли бы заменить [TestFixtureSetUp] для конструктора (хотя я и не пробовал), но это только, кажется, нарушает четкое соглашение, которое предоставляют помеченные методы.

Ответ 3

Одна вещь, которую вы не можете сделать с [TestFixtureSetup], которую вы можете сделать в конструкторе, - это получить параметры из [TestFixture].

Если вы хотите параметризовать свой тестовый прибор, вам придется использовать конструктор, по крайней мере, для некоторой настройки. До сих пор я использовал это только для тестов интеграции, например. для тестирования уровня доступа к данным с несколькими поставщиками данных:

[TestFixture("System.Data.SqlClient",
  "Server=(local)\\SQLEXPRESS;Initial Catalog=MyTestDatabase;Integrated Security=True;Pooling=False"))]
[TestFixture("System.Data.SQLite", "Data Source=MyTestDatabase.s3db")])]
internal class MyDataAccessLayerIntegrationTests
{
    MyDataAccessLayerIntegrationTests(
        string dataProvider,
        string connectionString)
    {
        ...
    }
}

Ответ 4

Я часто задавался вопросом, что нужно для [TestFixtureSetUp], учитывая, что существует простая, хорошо понятая конструкция языка первого класса, которая делает то же самое.

Мое предпочтение заключается в использовании конструкторов, чтобы использовать ключевое слово readonly, чтобы гарантировать, что переменные-члены не могут быть повторно инициализированы.

Ответ 5

Существует разница между конструктором и методом, отмеченным атрибутом [TestFixtureSetUp]. Согласно документации NUnit:

Желательно, чтобы конструктор не имел никаких побочных эффектов, поскольку NUnit может конструировать объект несколько раз в ходе сеанса.

Итак, если у вас есть дорогая инициализация, лучше использовать TestFixtureSetUp.

Ответ 6

Я думаю, что у меня есть отрицательный хороший ответ - причина использования конструктора вместо атрибута - это когда у вас есть наследование между тестовыми классами.

Будет вызван только один метод, аннотированный с помощью [TestFixtureSetup] (только для конкретного класса), но другие инициализаторы фикстуры не будут. В этом случае я предпочел бы поставить инициализацию в конструкторе, который имеет четко определенную семантику для наследования:)

Ответ 7

[TestFixtureSetUp] и [TestFixtureTearDown] предназначены для всего тестового класса. выполняется только один раз.

[SetUp] и [TearDown] - для каждого тестового метода (теста). выполняется для каждого теста.

Ответ 8

Важное различие между конструктором и TestFixtureSetUp заключается в том, что, по крайней мере, в NUnit 2 код конструктора фактически выполняется в тестовом перечислении, а не только в тестовом запуске, поэтому в основном вы хотите ограничить код ctor только заполнением readonly, то есть параметром, значениями, Все, что вызывает побочные эффекты или делает какую-либо фактическую работу, необходимо либо обернуть в Lazy, либо сделать в TestFixtureSetUp/OneTimeSetUp. Таким образом, вы можете думать о конструкторе как о единственном месте для настройки теста. В то время как TestFixtureSetUp - это то, где выполняется тестовое крепление, требуемое начальное состояние системы перед запуском тестов.

Ответ 9

Конструктор и методы SetUp используются по-разному:
Конструктор запускается только один раз.
Однако методы SetUp выполняются несколько раз, прежде чем каждый тестовый пример будет выполнен.