Чи можливо виконати код один раз до запуску всіх тестів?


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
    }
}

Якщо у вас є більше одного тестового вузла, я не знаю нічого, що охоплює більше ніж одну збірку.

Наскільки я знаю, це так близько, як ви можете дістатися до Main еквівалента.

Зауважте, що AssemblyInitializeметод -decorated повинен бути у TestClass-декорованому класі, який містить принаймні один TestMethod-декорований метод, інакше він не буде виконаний!


1
У мене були подібні проблеми (тільки для MSTest) і працював чудово. Дякую :)
Оскар Фолі

1
Для всіх, хто має проблеми з тим, як працювати з MsTest і TestDriven.NET, ви можете використовувати статичний прапор, щоб визначити, чи запускати код у ClassInitialize (це не працює в MsTest).
Карл

7
Примітка. Тестовий механізм запускає метод, який позначений атрибутом AssemblyInitialize, лише якщо цей метод є членом класу, який позначений атрибутом TestClass.
Джовен

5
@Jowen: Тестовий механізм запускає метод, позначений атрибутом AssemblyInitialize, лише якщо цей метод є членом класу, який позначений атрибутом TestClass and contains methods that are marked with the TestMethod attribute.
окт

3
Метод, позначений AssemblyInitialize, запускатиметься в Visual Studio 2015 Ultimate без інших методів, позначених атрибутами TestMethod.
Кріс

63

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

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

12
Колегатом очищення цих атрибутів є суфікс очищення (наприклад, ClassCleanup) для операцій зі знищенням
Yair Nevet

13

Я бачу це в заголовку MS Test.

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

Це запускається перед тестами в одному класі.

Схоже, ви хочете щось запустити перед усіма тестами.

Також у налаштуваннях тестового запуску є параметр сценарію настройки.


Якщо я щось не пропускаю, сценарії налаштування не допомагають виконувати код у тестовій AppDomain.
Джордж Мауер

2
Мабуть, це я. Я не впевнений, що я слідкую за вами, коли ви говорите "запущений код у тестовій AppDomain". Я читав ваше запитання, як хочу виконати код перед серією тестів, якщо це було щось інше. "Сценарії налаштування та сценарії очищення виконуються до та після тестових запусків, незалежно від типів тестів, які містяться в цих тестових запусках." msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.