В документации NUnit не указывается, когда использовать метод с TestFixtureSetup
и когда делать настройку в конструкторе.
public class MyTest
{
private MyClass myClass;
public MyTest()
{
myClass = new MyClass();
}
[TestFixtureSetUp]
public void Init()
{
myClass = new MyClass();
}
}
Существуют ли какие-либо хорошие/плохие практики в отношении конструктора TestFixtureSetup
по умолчанию или нет какой-либо разницы?
Ответ 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
выполняются несколько раз, прежде чем каждый тестовый пример будет выполнен.