【问题标题】: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】:

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

    如果您想在所有测试之前和之后运行方法,请使用 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() { }
    

    【讨论】:

    【解决方案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);
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          • 2016-10-30
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          相关资源
          最近更新 更多