如何记录单元测试条目并离开MSTest

时间:2010-10-07 08:16:22

标签: logging mstest

我正在使用MSTest,我希望在测试执行之前和完成之后编写日志条目。 显然我不希望在每个测试的开始和结束时添加自定义日志记录代码 - 它只会使测试不可读并且看起来很费劲(我有> 500次测试)

使用 TestInitialize TestCleanup 似乎是要走的路,但我无法获得测试名称。

有谁知道怎么做?

3 个答案:

答案 0 :(得分:3)

在MSTest中,test context property中提供了测试用例的名称。因此,要在测试初始化​​(以及测试清理)方法中访问它,您可以使用以下内容: -

    [TestInitialize()]
    public void MyTestInitialize() 
    {
        if (string.Equals(**TestContext.TestName**, "TestMethod1", StringComparison.OrdinalIgnoreCase))
        { 
        }
    }

此致 Aseem Bansal

答案 1 :(得分:1)

我们使用nLog进行日志记录,并使用基类进行测试初始化​​和测试清理,如果测试已通过,则进行日志记录。

这是基类:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using NLog;

namespace Tests
{
    public class TestBase
    {
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

        public TestContext TestContext { get; set; }

        [TestCleanup]
        public void TestCleanup()
        {
            string testName = string.Format("{0}.{1}", TestContext.FullyQualifiedTestClassName, TestContext.TestName);
            UnitTestOutcome currentTestOutcome = TestContext.CurrentTestOutcome;
            string message = string.Format("Test '{0}' {1}", testName, currentTestOutcome.ToString().ToUpperInvariant());
            if (currentTestOutcome != UnitTestOutcome.Passed)
            {
                Logger.Error(message);
            }
            else
            {
                Logger.Info(message);
            }
        }

        [TestInitialize]
        public void TestInitialize()
        {
            string testName = string.Format("{0}.{1}", TestContext.FullyQualifiedTestClassName, TestContext.TestName);
            Logger.Info("Started with test '{0}'", testName);
        }
    }
}

这是使用它

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Tests
{
    [TestClass]
    public class JustTest : TestBase
    {
        [TestMethod]
        public void Fail()
        {
            Assert.IsTrue(false);
        }

        [TestMethod]
        public void Pass()
        {
            Assert.IsTrue(true);
        }
    }
}

这是日志文件中的部分

Started with test 'Tests.JustTest.Fail'
Test 'Tests.JustTest.Fail' FAILED

Started with test 'Tests.JustTest.Pass'
Test 'Tests.JustTest.Pass' PASSED

答案 2 :(得分:0)

更新:好的,我现在看到你得到了什么。坏消息是我不使用MSTest或MSTest夹具来查找..

在NUnit中,你可以

>"nunit-console.exe" API_Tests.dll /out:My.log /labels

这将输出以下日志文​​件

***** Test.Gumba.API_Tests.Tests.ArithmeticProgression.DummyTest2
Woohoo! made it till test2
***** Test.Gumba.API_Tests.Tests.ArithmeticProgression.GeneratesTheRightProgressionAsSpecifiedByTheUser
Try#0 failed. due to 0. Retrying NUnit.Framework.AssertionException:   Expected is <System.Int32[10]>, actual is <System.Int32[0]>
<snipped>...

对于 MSTest 我是looking at the command line switches,以下内容看起来很有趣

mstest /testcontainer:Some.dll /detail:testname

---------------之前的答案如下-----
要回答您的问题,可以使用带有委托的方法来执行'执行'方法。但是,如果您可以详细说明为什么需要这个,那么可能有更好的解决方案来实现您的目标

e.g。

private void LogAround(Action action)
{
  // log entry with calling method name using StackTrace class
  action();
  // log exit
}

并且电话将是

Do( delegate {
  // test code
});