【问题标题】:How to write output in the [ClassInitialize()] of a Unit Test class?如何在单元测试类的 [ClassInitialize()] 中编写输出?
【发布时间】:2010-12-07 07:44:37
【问题描述】:

我正在为我的 C#.NET 应用程序的持久层编写一些单元测试。在测试类的测试执行之前和之后,我想做一些清理以擦除可能插入的虚拟值,因此,这种清理发生在标有[ClassInitialize()] 和@987654322 属性的方法中@。

(我知道更好的方法是使用内存数据库,但就我们依赖大量存储的过程而言,这并不是真正可行的......) p>

我想输出一些关于清理结果的信息,但我找不到使用 VISUAL Studio 2010 在测试结果中获取输出的方法。

这就是我目前正在做的事情:

        ///... lots of stuff before ...

        //global for the test run
        private static TestContext context;

        //for each test
        private IRepository repo;

        #region Initialisation and cleanup

        /// <summary>
        /// Execute once before the test-suite
        /// </summary>
        [ClassInitialize()]
        public static void InitTestSuite(TestContext testContext)
        {
            context = testContext;    
            removeTestDataFromDb();    
        }

        [ClassCleanup()]
        public static void CleanupTestSuite()
        {
            removeTestDataFromDb();
        }

        private static void removeTestDataFromDb()
        {
            context.WriteLine("removeTestDataFromDb starting");
            using (ISession session = NHibernateHelper.OpenSession())
            {    
                IDbConnection cn = session.Connection;
                IDbCommand cmd = cn.CreateCommand();
                //remove anyt test data
                cmd.CommandText = @"DELETE FROM SomeTable
                    WHERE somefield LIKE 'easyToFindTestData%Test'";
                int res = cmd.ExecuteNonQuery();    
                context.WriteLine("removeTestDataFromDb done - affected {0} rows", res);
            }
        }


        [TestInitialize()]
        public void InitTest()
        {
            repo = new MyRepositoryImplementation();
        }

        [TestCleanup()]
        public void CleanupTest()
        {
            //cleanup       
            repo = null;
        }

        #endregion

我正在尝试使用 context.WriteLine() ...

我也尝试使用 Console.WriteLine() 获得相同的结果。

您如何在ClassInitialize 部分中写入标准输出以及在哪里可以访问该输出?

【问题讨论】:

    标签: c# unit-testing visual-studio-2010


    【解决方案1】:

    [ClassInitialize][ClassCleanup] 只为该类中的所有测试运行一次。您最好使用在每次测试之前和之后运行的[TestInitialize][TestCleanUp]。还可以尝试将完整的测试包装在数据库事务中。这样,您可以简单地回滚操作(通过不提交事务)并且您的数据库保持一致状态(这对于值得信赖的自动化测试至关重要)。

    我为集成测试做的一个技巧是定义一个基类,我的所有集成测试类都可以从该基类继承。基类确保每个测试都在一个事务中运行并且该事务被回滚。代码如下:

    public abstract class IntegrationTestBase
    {
        private TransactionScope scope;
    
        [TestInitialize]
        public void TestInitialize()
        {
            scope = new TransactionScope();
        }
    
        [TestCleanup]
        public void TestCleanup()
        {
            scope.Dispose();
        }
    }
    

    祝你好运。

    【讨论】:

    • 感谢 Steven 的建议,但实际上我更愿意每节课只执行一次清理工作。当我使用 NHibernate 时,我不太确定 TransactionScope 的使用......不过,我会看看它。无论如何,这并不能真正回答我关于写入输出的问题:-)
    • 请不要每班清理一次。测试应该独立运行,当你不清理每个测试的测试数据时,测试会相互依赖,这使得它们不可信。当你不再信任你的测试时,它们就变得毫无用处。顺便提一句。 TransactionScope 与 NHibernate 配合得很好,因为 NHibernate 只使用标准的 ADO.NET 连接。另外,当你在[TestCleanup]中写入控制台时不会出现这个问题,但请不要写入控制台,只需回滚即可。
    • 谢谢,我不知道 TransactionScope ...看起来正是我需要的!我不确定我是否理解引擎盖下发生的事情......据我所知,它依赖于 MSDTC......再次感谢!
    • System.Data 中的连接检查是否为当前线程注册了事务范围。如果是这种情况,它们使用相同的连接和事务。 TransactionScope 可以提升为分布式事务,这就是 MSDTC 的用途。我个人觉得 TransactionScope 非常适合自动化集成测试,但我认为如果在生产环境中使用它,那是一种设计味道。
    • 是的,它非常适合测试与数据库相关的部分。对于我见过的所有涉及内存数据库之类的例子来说,这是一个简单的魔法替代品……对于生产来说确实有点太神奇了:)
    【解决方案2】:

    ClassInitialize 和 ClassCleanup 的跟踪输出出现在结果摘要中。

    您可以通过以下方式访问它

    1. 打开测试结果windw [测试->窗口->测试结果]
    2. [测试结果]窗口的左上角应该有一个名为“测试运行已完成”的链接。
    3. 点击叮当
    4. 它应该会打开一个标题为“结果摘要”的窗口,它将显示在 ClassInitialize 和 ClassCleanup 期间创建的调试跟踪

    【讨论】:

      【解决方案3】:

      如果您在“测试结果”窗格中双击测试方法,您可以看到每个测试的控制台输出。它也存在于 .trx xml 结果文件中。

      另外,如果你指定了“Define DEBUG constant”,你可以使用 System.Diagnostics.Debug.WriteLine("ClassInitialize Method invoked, yeah."); .. 最终会出现在“输出”窗格中。

      【讨论】:

      • ClassInitialize 和 ClassCleanup 方法不会输出到单个测试的输出。您可以在它们的输出中看到 TestInitialize 和 TestCleanup。此外,我在任何地方都找不到由 Visual Studio 生成的 .trx 文件,我必须找到一种方法让它们生成这些文件。不过,一旦我这样做了,我应该能够将它们加载到 @hjb417 正在谈论的测试结果窗口中。
      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2019-01-28
      • 1970-01-01
      • 2013-06-12
      • 2019-12-22
      相关资源
      最近更新 更多