Почему TestInitialize запускается для каждого теста в моих модульных тестах Visual Studio?


158

Я использую Visual Studio 2010 Beta 2. У меня есть один [TestClass], который имеет [TestInitialize], [TestCleanup]и несколько [TestMethods].

Каждый раз, когда запускается тестовый метод, также запускаются методы инициализации и очистки!

У меня сложилось впечатление, что [TestInitialize]& [TestCleanup]следует запускать только один раз для каждого локального теста.

Это правильно? Если нет, как правильно это сделать?

Ответы:


314

TestInitializeи TestCleanupвыполняются до и после каждого теста, чтобы убедиться, что ни один тест не связан.

Если вы хотите запустить методы перед и после всех испытаний, украшают соответствующие методы с ClassInitializeи ClassCleanupатрибутами.

Соответствующая информация из автоматически сгенерированного тестового файла в Visual Studio:

При написании тестов вы можете использовать следующие дополнительные атрибуты:

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

// Use ClassCleanup to run code after all tests in a class have run
[ClassCleanup()]
public static void MyClassCleanup() { }

// Use TestInitialize to run code before running each test 
[TestInitialize()]
public void MyTestInitialize() { }

// Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup() { }

9
и у вас есть еще два AssemblyInitialize и AssemblyCleanup, как упомянуто здесь stackoverflow.com/a/21304674/864201
Родольф Брок

12

это довольно стандартное поведение для наборов тестов: настройка и разборка до и после каждого теста. Философия заключается в том, что тесты не должны зависеть друг от друга. Если вам нужно другое поведение, вам, вероятно, следует использовать статические объекты, которые сохраняются между каждым тестом.


9

Полный пример взят из документации Microsoft :

using Microsoft.VisualStudio.TestTools.UnitTesting;
using SampleClassLib;
using System;
using System.Windows.Forms;

namespace TestNamespace
{
    [TestClass()]
    public sealed class DivideClassTest
    {
        [AssemblyInitialize()]
        public static void AssemblyInit(TestContext context)
        {
            MessageBox.Show("AssemblyInit " + context.TestName);
        }

        [ClassInitialize()]
        public static void ClassInit(TestContext context)
        {
            MessageBox.Show("ClassInit " + context.TestName);
        }

        [TestInitialize()]
        public void Initialize()
        {
            MessageBox.Show("TestMethodInit");
        }

        [TestCleanup()]
        public void Cleanup()
        {
            MessageBox.Show("TestMethodCleanup");
        }

        [ClassCleanup()]
        public static void ClassCleanup()
        {
            MessageBox.Show("ClassCleanup");
        }

        [AssemblyCleanup()]
        public static void AssemblyCleanup()
        {
            MessageBox.Show("AssemblyCleanup");
        }

        [TestMethod()]
        [ExpectedException(typeof(System.DivideByZeroException))]
        public void DivideMethodTest()
        {
            DivideClass.DivideMethod(0);
        }
    }
}

-1

Методы, помеченные атрибутом [TestInitialize ()], используются для подготовки аспектов среды, в которой будет выполняться ваш модульный тест. Цель этого - установить известное состояние для запуска вашего модульного теста. Вы можете использовать метод [TestInitialize ()] для копирования, изменения или создания определенных файлов данных, которые будет использовать ваш тест.

Создайте методы, помеченные атрибутом [TestCleanUp {}], чтобы вернуть среду в известное состояние после выполнения теста. Это может означать удаление файлов в папках или возврат базы данных в известное состояние. Примером этого является сброс базы данных инвентаризации в исходное состояние после тестирования метода, который используется в приложении для ввода заказа.

Для получения дополнительной информации, пожалуйста, обратитесь: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.