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


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

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

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

3 86

3 ответа:

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

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

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

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

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

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

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

Я вижу это в заголовке теста МС.

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

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

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

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