Метод инициализации глобального теста для MSTest

Быстрый вопрос: как создать метод, который запускается только один раз перед запуском всех тестов в решении.


person mglmnc    schedule 15.09.2009    source источник
comment
Хотел бы я также знать :( В настоящее время у меня есть абстрактный базовый класс, от которого наследуется каждый TestClass. Внутри этого класса у меня есть метод TestInitialize. Проблема в том, что этот метод срабатывает каждый раз, когда запускается новый тест!   -  person Pure.Krome    schedule 21.09.2009
comment
Пусть этот абстрактный базовый класс реализует статический конструктор. Он будет запущен только один раз перед запуском любого из тестов.   -  person mglmnc    schedule 22.09.2009


Ответы (3)


Создайте общедоступный статический метод, украшенный ссылкой AssemblyInitialize. Платформа тестирования будет вызывать этот метод Setup один раз при выполнении теста:

[AssemblyInitialize()]
public static void MyTestInitialize(TestContext testContext)
{}

Для TearDown это:

[AssemblyCleanup]
public static void TearDown() 
{}

ИЗМЕНИТЬ:

Еще одна очень важная деталь: класс, к которому относится этот метод, должен быть украшен [TestClass]. В противном случае метод инициализации не будет запущен.

person driis    schedule 15.10.2009
comment
Если у вас есть тесты более чем в одной сборке, MyTestInitialize будет вызываться более одного раза для запуска теста. - person BenCr; 15.06.2011
comment
Это может быть неясно - это выполняется не для каждого теста, а для каждого теста RUN. Это означает, что если вы запускаете набор тестов, скажем, запуская все тесты в классе в одном тестовом прогоне или все тесты в сборке в одном тестовом прогоне, это выполняется ОДИН РАЗ для всех этих тестов в этом прогоне. Таким образом, они могли поделиться результатами/побочными эффектами этого метода или нет, если за один раз запускался только один тест. - person bcr; 20.07.2020

Просто чтобы подчеркнуть, что @driis и @Malice сказали в принятом ответе, вот как должен выглядеть ваш класс инициализатора глобального теста:

namespace ThanksDriis
{
    [TestClass]
    class GlobalTestInitializer
    {
        [AssemblyInitialize()]
        public static void MyTestInitialize(TestContext testContext)
        {
            // The test framework will call this method once -BEFORE- each test run.
        }

        [AssemblyCleanup]
        public static void TearDown() 
        {
            // The test framework will call this method once -AFTER- each test run.
        }
    }
}
person Mass Dot Net    schedule 26.09.2019
comment
Не правда ли (также) что класс с пометкой [TestInitialize] также будет выполняться перед запуском каждого теста? Выполняется ли AssemblyInitialize перед каждым запуском теста или только один раз за тестовый сеанс? [TestInitialize()] public void TestInitialize() { ... } [TestCleanup()] public void TestCleanup() { ... } - person Allen; 22.04.2020
comment
Посмотрите эту ссылку StackOverflow, чтобы получить краткий ответ о том, когда запускается код, украшенный [TestInitialize]: stackoverflow.com/a/23012750/165494 - person Mass Dot Net; 28.04.2020

Извините за кривое оформление...

        /// <summary>
        /// Use TestInitialize to run code before running each test
        /// Runs before every test executes
        /// </summary>
        [TestInitialize()]
        public void TestInitialize()
        {
           ...
           ...
        }


        /// <summary>
        /// Use TestCleanup to run code after each test has run
        /// Runs after every test executes
        /// </summary>
        [TestCleanup()]
        public void TestCleanup()
        {
           ...
           ...
        }
person Allen    schedule 22.04.2020