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

112

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

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

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

Джордж Мауэр
источник

Ответы:

153

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

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

Если у вас более одной сборки модульного теста, я не знаю ничего, что включает более одной сборки.

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

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

Марк Симанн
источник
1
У меня была аналогичная проблема (только для MSTest), и я работал нормально. Спасибо :)
Оскар Фоли
1
Для всех, у кого есть проблемы с получением этой работы как из MsTest, так и из TestDriven.NET, вы можете использовать статический флаг, чтобы определить, запускать ли код в ClassInitialize (это не работает в MsTest).
Carl
7
Примечание. Механизм тестирования запускает метод, помеченный атрибутом AssemblyInitialize, только если этот метод является членом класса, помеченного атрибутом TestClass.
Jowen
5
@Jowen: механизм тестирования запускает метод, помеченный атрибутом AssemblyInitialize, только если этот метод является членом класса, отмеченного атрибутом TestClass and contains methods that are marked with the TestMethod attribute.
oɔɯǝɹ 01
3
Метод, помеченный как AssemblyInitialize, будет работать в Visual Studio 2015 Ultimate без других методов, отмеченных атрибутами TestMethod.
Крис
63

Для завершения это параметры «выполнить код до» для MSTest:

  • Используйте [AssemblyInitialize]для запуска кода один раз для каждой сборки перед запуском любого теста в этой сборке.
  • Используется [ClassInitialize]для запуска кода один раз для каждого класса перед любым тестом в классе, где определен метод.
  • Используется [TestInitialize]для запуска кода перед каждым тестом в классе, где определен метод.
Konamiman
источник
12
Аналогом этих атрибутов для очистки является суффикс Cleanup (например, ClassCleanup) для операций
удаления
13

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

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

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

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

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

Маэстро1024
источник
Если я чего-то не упускаю, сценарии установки не помогают с запуском кода в тестовом домене приложений.
Джордж Мауэр,
2
Это, вероятно, меня. Я не уверен, что понимаю вас, когда вы говорите «запуск кода в тестовом домене приложений». Я прочитал ваш вопрос как желание выполнить код перед серией тестов, если это было что-то другое. «Сценарии установки и сценарии очистки выполняются до и после тестовых запусков, независимо от типов тестов, содержащихся в этих тестовых запусках». msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024, 05