2014-06-16 116 views
11

使用MSTest,我需要從[TestInitialize]方法中獲取當前測試的名稱。你可以從TestContext.TestName屬性中得到這個。瞭解MSTest TestContext

我發現,在該[ClassInitialize]方法,一個被聲明爲公共財產(並且得到由測試運行器設置)通過靜態TestContext之間的行爲意想不到的區別。

考慮下面的代碼:

TextContext.TestName='TestMethod1' static _testContext.TestName='TestMethod1' 
TextContext.TestName='TestMethod2' static _testContext.TestName='TestMethod1' 
TextContext.TestName='TestMethod3' static _testContext.TestName='TestMethod1' 

我以前曾假設:

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace TestContext.Tests 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     public TestContext TestContext { get; set; } 

     private static TestContext _testContext; 

     [ClassInitialize] 
     public static void SetupTests(TestContext testContext) 
     { 
      _testContext = testContext; 
     } 

     [TestInitialize] 
     public void SetupTest() 
     { 
      Console.WriteLine(
       "TextContext.TestName='{0}' static _testContext.TestName='{1}'", 
       TestContext.TestName, 
       _testContext.TestName); 
     } 

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

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

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

這導致以下將要輸出(從VS2013 ReSharper的測試運行輸出複製粘貼) TestContext的兩個實例將是等效的,但顯然它們不是。

  • public TestContext屬性的作用我希望
  • 獲取傳遞給[ClassInitialize]private static TestContext值不。由於TestContext有涉及到當前正在運行的測試性能,這個實現似乎誤導,打破

是否有一個地方,你會更喜歡使用傳遞給[ClassInitialize]方法TestContext任何情況下,或者最好是忽略和從沒用過的?

+0

跑步者在每次測試前創建一個新的TestContext實例。你問爲什麼這樣設計? –

+1

@mikez - 對我來說'私人靜態TestContext'行爲似乎是錯誤的。這就是我所問的。 –

+0

'_testContext'是一個字段,只在您用'[ClassInitialize]'屬性標記的方法內分配一次。你爲什麼期望它在測試之間改變?正如@mike所寫,每個測試都會得到一個新的TestContext實例。 – Groo

回答

8

由於[ClassInitialize]只調用在開始階段,測試的名稱是「TestMethod1`。在第一次測試運行後,這是陳舊的。

TestContext爲每個方法設置,因此具有當前的測試名稱。

是的,這有點傻。

+1

我的期望/希望是測試運行者將保持對傳遞給[ClassInitialize]方法的'TextContext'的引用,並保持其值正確更新... –

+2

@RichardEverett這會更實用,更直觀。更好的是,本來只能傳遞'Initialize()'方法的靜態數據。 – BanksySan

2

方法

[ClassInitialize] 
public static void SetupTests(TestContext testContext) { } 

設定設置的TestContext的屬性之前被調用。所以如果你需要SetupTests中的上下文,那麼這個參數是有用的。否則,使用TestContext屬性,該屬性設置之前每個

[TestInitialize] 
public void SetupTest() { }