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