Этот вопрос касается фреймворка модульного тестирования xUnit.net .
Мне нужно запустить некоторый код перед выполнением любого теста, а также некоторый код после завершения всех тестов. Я подумал, что должен быть какой-то атрибут или интерфейс маркера для указания глобального кода инициализации и завершения, но не смог их найти.
В качестве альтернативы, если я вызываю xUnit программно, я также могу добиться того, чего хочу, с помощью следующего кода:
static void Main()
{
try
{
MyGlobalSetup();
RunAllTests(); // What goes into this method?
}
finally
{
MyGlobalTeardown();
}
}
Может ли кто-нибудь дать мне подсказку о том, как декларативно или программно запустить некоторый глобальный код установки / удаления?
Ответы:
Насколько мне известно, xUnit не имеет глобальной точки расширения инициализации / удаления. Однако создать его несложно. Просто создайте базовый тестовый класс, который реализует
IDisposable
и выполнит вашу инициализацию в конструкторе, а ваш разрыв вIDisposable.Dispose
методе. Это выглядело бы так:Однако код установки и удаления базового класса будет выполняться для каждого вызова. Возможно, это не то, что вам нужно, так как это не очень эффективно. Более оптимизированная версия будет использовать
IClassFixture<T>
интерфейс, чтобы гарантировать, что глобальная функция инициализации / удаления вызывается только один раз. В этой версии вы не расширяете базовый класс из тестового класса, а реализуетеIClassFixture<T>
интерфейс, в котором онT
ссылается на ваш класс фикстуры:Это приведет к тому, что конструктор
TestsFixture
будет запускаться только один раз для каждого тестируемого класса. Таким образом, выбор одного из двух методов зависит от того, что именно вы хотите.источник
[Collection("<name>")]
атрибутомЯ искал тот же ответ, и в настоящее время документация xUnit очень полезна в отношении того, как реализовать фикстуры классов и фикстуры коллекций, которые предоставляют разработчикам широкий спектр функциональных возможностей установки / разрыва на уровне класса или группы классов. Это соответствует ответу Гейра Сагберга и дает хорошую реализацию скелета, чтобы проиллюстрировать, как он должен выглядеть.
https://xunit.github.io/docs/shared-context.html
источник
Collection
атрибутом, чтобы произошла «глобальная» настройка. Это означает, что если у вас есть что-то, что вы хотите настроить до запуска -any- test, вам нужно украсить классы -all- test этим атрибутом. На мой взгляд, это слишком непросто, так как если забыть украсить один тестовый класс, это может привести к ошибкам, которые трудно отследить. Было бы неплохо, если бы xUnit создал способ действительно глобальной настройки и демонтажа.Есть простое простое решение. Используйте плагин Fody.ModuleInit
https://github.com/Fody/ModuleInit
Это пакет nuget, и когда вы его устанавливаете, он добавляет новый файл с именем
ModuleInitializer.cs
. Здесь есть один статический метод, который встраивается в сборку после сборки и запускается, как только сборка загружается, но до того, как что-либо будет запущено.Я использую это, чтобы разблокировать лицензию на программное обеспечение для библиотеки, которую я купил. Я всегда забывал разблокировать лицензию в каждом тесте и даже забывал вывести тест из базового класса, который разблокировал бы его. Яркие искры, написавшие эту библиотеку, вместо того, чтобы сообщать вам, что она заблокирована по лицензии, представили тонкие числовые ошибки, которые приводят к сбою или прохождению тестов, когда они не должны. Вы никогда не узнаете, правильно вы разблокировали библиотеку или нет. Итак, теперь мой модуль init выглядит как
и для всех тестов, которые помещены в эту сборку, будет правильно разблокирована лицензия.
источник
Чтобы поделиться кодом SetUp / TearDown между несколькими классами, вы можете использовать xUnit's CollectionFixture .
Цитата:
источник