2010-10-07 22 views
3

我正在使用MSTest,並且希望在測試執行之前和完成之後寫入日誌條目。 很顯然,我不希望在開始和每個測試的末尾添加自定義日誌代碼 - 這將只會使測試不可讀似乎是一個很大的努力(我有> 500個測試)如何記錄單元測試條目並離開MSTest

使用TestInitializeTestCleanup似乎是要走的路,但我無法獲得測試名稱。

有誰知道如何做到這一點?

+0

的一部分,爲什麼你需要的測試名稱?如果您可以告訴我們您使用日誌記錄要實現的目標,也許我可以給出更好的答案。 – Gishu 2010-10-07 08:32:55

+0

@Gishu - 我有一個來自所有測試的長日誌文件,我希望在該日誌中看到當前條目屬於哪個測試。通過在每次測試之前和之後添加日誌記錄,我可以「綁定」測試的信息 – 2010-10-07 09:17:43

回答

3

在MSTest的,測試案例的名稱是test context property可用。所以要訪問它在測試初始化​​(以及測試清理)方法,你可以使用這樣的事情: -

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

問候 Aseem邦薩爾

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>... 

looking at the command line switches對於MSTest和以下看起來很有趣

mstest /testcontainer:Some.dll /detail:testname 

---------------以前的答案如下-----
要回答你的問題,'執行'方法可以使用一個採用委託的方法來完成。然而,如果你能詳細說明爲什麼你需要這個,也許有一個更好的解決方案來實現你在

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

和接聽的話會有

Do(delegate { 
    // test code 
}); 
+0

不幸的是,這意味着我需要將此代碼添加到所有可能會影響其可讀性的當前和未來測試中。我還需要確保團隊中的所有開發人員在他們的所有測試中都使用這個... 我想要一個「芳香」地將日誌記錄添加到我的所有測試中的解決方案 – 2010-10-07 09:12:22

+0

@Dror - 已更新的答案..您需要一些來自MSTest的支持。希望它存在... – Gishu 2010-10-07 10:33:04

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 
+1

你的答案可以通過添加一些你的代碼的解釋來大大改善。 – Henrik 2013-01-09 09:45:10