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

В основном я хотел бы сказать MSTest, чтобы выполнить бит кода перед запуском в серию тестовых прогонов, по существу, то, что я хотел бы сделать, это то же самое, что придерживаться некоторого кода в Main().

Причина, по которой я хотел бы сделать это, - это то, что я хотел бы сделать некоторое ведение журнала с помощью log4net во время моих тестовых тестов интеграции. Я не могу просто использовать атрибут сборки log4net.Config.XmlConfigurator, поскольку с момента его чтения в моей тестовой сборке он уже назвал LoggerManager. Документация рекомендует явно настроить log4net в точке ввода кода, но где это в моих тестах?

Мне нужно иметь возможность запускать мои тесты в тестовом сервере TestDriven.NET и MSTest.

Ответ 1

FWIW, вы можете использовать атрибут AssemblyInitialize для запуска кода перед выполнением всех модульных тестов в сборке:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Если у вас более одной сборки unit test, я не знаю ничего, что охватывает более одной сборки.

Насколько мне известно, это как можно ближе к эквиваленту Main.

Обратите внимание, что AssemblyInitialize -декорированный метод должен находиться в TestClass -декорированном классе, который содержит хотя бы один TestMethod -декорированный метод, иначе он будет не выполняться!

Ответ 2

Для завершения это опции "запустить код до" для MSTest:

  • Используйте [AssemblyInitialize] для запуска кода один раз для сборки, прежде чем запускается какой-либо тест в этой сборке.
  • Используйте [ClassInitialize] для запуска кода один раз в классе перед любым тестом в классе, где определяется метод.
  • Используйте [TestInitialize] для запуска кода перед каждым тестированием в классе, где определяется метод.

Ответ 3

Я вижу это в заголовке MS Test.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Это будет выполняться перед тестами в одном классе.

Похоже, вы хотите что-то запустить перед всеми тестами.

В конфигурации тестового запуска также есть параметр настройки script.