为什么在Visual Studio单元测试中的每个测试都会触发TestInitialize?


158

我使用Visual Studio 2010 Beta 2中我有一个单一的[TestClass],其中有一个[TestInitialize][TestCleanup]和几个[TestMethods]

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

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

那是对的吗?如果没有,执行此操作的正确方法是什么?

Answers:


314

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

如果要在ALL测试之前和之后运行方法,请使用ClassInitializeClassCleanup属性修饰相关方法。

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

完整示例摘自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);
        }
    }
}

-1

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

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

有关更多信息,请参考:http : //msdn.microsoft.com/zh-cn/library/ms182517%28v=vs.100%29.aspx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.