为什么我的 VisualStudio 单元测试中的每个测试都会触发 TestInitialize?

我正在使用 Visual Studio 2010 Beta 2。我有一个单一的 [TestClass],它有一个 [TestInitialize][TestCleanup]和一些 [TestMethods]

每次运行测试方法时,初始化和清除方法也会运行!

我的印象是,[TestInitialize][TestCleanup]应该只运行一次,每个本地测试运行。

是这样吗? 如果不是,正确的做法是什么?

81321 次浏览

这是测试套件的标准行为: 在每次测试之前和之后设置和拆除。这个哲学就是考试不应该相互依赖。如果您想要另一种行为,您可能应该使用在每个测试之间持久化的静态对象。

在每次测试之前和之后运行 TestInitializeTestCleanup,这是为了确保没有测试耦合。

如果希望在所有测试之前和之后运行方法,请使用 ClassInitializeClassCleanup属性装饰相关方法。

来自 VisualStudio 中自动生成的测试文件的相关信息:

在编写测试时,可以使用以下附加属性:

// 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() { }

用[ TestInitialize ()]属性标记的方法用于准备运行单元测试的环境的各个方面。这样做的目的是为运行单元测试建立一个已知的状态。您可以使用[ TestInitialize ()]方法来复制、更改或创建您的测试将使用的某些数据文件。

创建用[ TestCleanUp {}]属性标记的方法,以便在测试运行后将环境返回到已知状态。这可能意味着删除文件夹中的文件或将数据库返回到已知状态。这方面的一个示例是,在测试订单输入应用程序中使用的方法之后,将库存数据库重置为初始状态。

详情请参阅: Http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

微软文档为例:

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);
}
}
}