如何在Unit Test类的[ClassInitialize()]中编写输出?

时间:2010-12-07 07:44:37

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

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

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

我想输出有关清理结果的一些信息,但我找不到使用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部分写入标准输出,在哪里可以访问该输出?

3 个答案:

答案 0 :(得分:17)

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

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

public abstract class IntegrationTestBase
{
    private TransactionScope scope;

    [TestInitialize]
    public void TestInitialize()
    {
        scope = new TransactionScope();
    }

    [TestCleanup]
    public void TestCleanup()
    {
        scope.Dispose();
    }
}
祝你好运。

答案 1 :(得分:1)

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

您可以通过执行以下操作来访问它

  1. 打开测试结果windw [测试 - &gt; Windows - &gt;测试结果]
  2. [测试结果]窗口的左上角应该有一个名为“测试运行已完成”的链接。
  3. 点击碰撞
  4. 它应该打开一个带有“Result Summary”标题的窗口,它将显示在ClassInitialize和ClassCleanup期间创建的调试跟踪

答案 2 :(得分:0)

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

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