Чому 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
Rodolpho Brock

12

це досить стандартна поведінка для тестових наборів: налаштування та припинення до та після кожного тесту. Філософія полягає в тому, що тести не повинні залежати один від одного. Якщо ви хочете іншої поведінки, ви, ймовірно, повинні використовувати статичні об'єкти, що зберігаються між кожним тестом.


9

Повний приклад взятий з майкрософт документації :

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.