代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

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

  •  138
  • Pure.Krome  · 技术社区  · 15 年前

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

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

    我的印象是 [验证] 和; [测试清除] 每次本地测试运行只能运行一次。

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

    4 回复  |  直到 6 年前
        1
  •  274
  •   Jonathan Schneider    10 年前

    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
  •  12
  •   stijn    15 年前

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

        3
  •  8
  •   Tim spar    6 年前

    完整的例子取自 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);
            }
        }
    }
    
        4
  •  -1
  •   Pushkar Prabhu    10 年前

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

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

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