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

Pur*_*ome 148 c# mstest visual-studio-2010 visual-studio vs-unit-testing-framework

我正在使用Visual Studio 2010 Beta 2.我有一个[TestClass],有一个[TestInitialize],[TestCleanup]有几个[TestMethods].

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

我的印象中[TestInitialize][TestCleanup]应只运行一次,每次当地试运行.

那是对的吗?如果没有,这样做的正确方法是什么?

ale*_*exn 297

TestInitialize并且TestCleanup在每次测试之前和之后运行,这是为了确保没有测试耦合.

如果要在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() { }
Run Code Online (Sandbox Code Playgroud)

  • 你还有两个像这里提到的AssemblyInitialize和AssemblyCleanup http://stackoverflow.com/a/21304674/864201 (7认同)
  • TestInitialize是否会运行标记为[Ignore]的测试? (2认同)

sti*_*ijn 12

这是测试套件的标准行为:每次测试之前和之后的设置和拆卸.理念是测试不应该相互依赖.如果您想要其他行为,则应该使用在每次测试之间持久存在的静态对象.


Rod*_*ock 8

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)