Почему TestInitialize запускается для каждого теста в модульных тестах Visual Studio?
Я использую Visual Studio 2010 Beta 2. У меня есть один [TestClass]
, который имеет [TestInitialize]
, [TestCleanup]
и несколько [TestMethods]
.
Каждый раз, когда запускается тестовый метод, запускаются методы инициализации и очистки!
У меня создалось впечатление, что [TestInitialize]
и [TestCleanup]
следует запускать только один раз за каждый локальный пробный запуск.
Это правильно? Если нет, то каков правильный способ сделать это?
Ответы
Ответ 1
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() { }
Ответ 2
это довольно стандартное поведение для тестовых наборов: настройка и отключение до и после каждого теста. Философия заключается в том, что тесты не должны зависеть друг от друга. Если вы хотите другое поведение, вы, вероятно, должны использовать статические объекты, которые сохраняются между каждым тестом.
Ответ 3
Полный пример взят из документации 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);
}
}
}
Ответ 4
Методы, отмеченные атрибутом [TestInitialize()], используются для подготовки аспектов среды, в которой будет выполняться ваш unit test. Целью этого является создание известного состояния для запуска unit test. Вы можете использовать метод [TestInitialize()] для копирования, изменения или создания определенных файлов данных, которые будут использоваться вашим тестом.
Создайте методы, отмеченные атрибутом [TestCleanUp {}], чтобы вернуть среду в известное состояние после запуска теста. Это может означать удаление файлов в папках или возврат базы данных в известное состояние. Примером этого является reset база данных инвентаризации в исходное состояние после тестирования метода, который используется в приложении для ввода заказа.
За дополнительной информацией обращайтесь:
http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx