【问题标题】:Why does TestInitialize get fired for every test in my Visual Studio unit tests?为什么我的 Visual Studio 单元测试中的每个测试都会触发 TestInitialize?
【发布时间】:2010-12-24 19:08:02
【问题描述】:
我正在使用 Visual Studio 2010 Beta 2。我有一个 [TestClass],其中有一个 [TestInitialize]、[TestCleanup] 和几个 [TestMethods]。
每次运行测试方法时,初始化和清理方法也会运行!
我的印象是 [TestInitialize] 和 [TestCleanup] 应该只运行一次,每次本地测试运行。
正确吗?如果没有,这样做的正确方法是什么?
【问题讨论】:
标签:
c#
visual-studio
visual-studio-2010
mstest
vs-unit-testing-framework
【解决方案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 documentation:
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);
}
}
}