2012-11-05 127 views
0

我正在使用NUnit和Selenium WebDriver編寫Web測試。 在每次測試結束時,我想獲取瀏覽器的屏幕截圖並保存圖像。 我希望圖像名稱與Test名稱相同。 但我無法獲得測試方法名稱。如何獲取父方法名稱?

這裏是測試方法:

[Test] 
public void AbcTest_ShouldPass() 
{ 
    Assert.AreEqual(true, true); 
} 

這裏的每個Test後運行TearDown

[TearDonw] 
[MethodImpl(MethoImplOptions.NoInlining)] 
public void TestCleanupNunit() 
{ 
    var methodName = new List<string>(); 
    for (int i = 0; i < 30; i++) 
     methodName.Add(i.ToString() + " is " + new StackTrace(i, true).GetFrame(0).GetMethod().Name); 

} 

,但是當我看methodName,我找不到AbcTest_ShouldPass

0 is TestCleanupNUnit 
1 is InvokeMethod 
2 is UnsafeInvokeInternal 
3 is Invoke 
4 is Invoke 
5 is InvokeMethod 
6 is InvokeMethod 
7 is RunTearDown 
8 is RunTest 
9 is RunTest 
10 is RunRepeatedTest 
11 is RunTestInContext 
12 is Run 
13 is RunAllTests 
14 is RunSuite 
15 is RunSuiteInContext 
16 is Run 
17 is Run 
18 is RunAllTests 
19 is RunSuite 
20 is RunSuiteInContext 
21 is Run 
22 is RunAllTests 
23 is RunSuite 
24 is RunSuiteInContext 
25 is Run 
26 is RunAllTests 
27 is RunSuite 
28 is RunSuiteInContext 
29 is Run 

我看着這個post,但它並沒有幫助我。

回答

1

Nunit Framework提供了CurrentContext,它是NUnit.Framework.TestContext的成員。

TestContext.CurrentContext.Test.Name將返回正在執行的測試的名稱,並且TestContext.CurrentContext.Test.FullName將從名稱空間的名稱返回完全限定的名稱。

0

是的,因爲您的測試沒有調用測試拆解。測試運行者調用您的測試用例,然後依次將測試拆下。換句話說,您的測試用例方法調用位於堆棧跟蹤的另一個分支中,而不是拆卸。

你需要將你的方法名稱緩存在你的測試夾具中。也許是一個私有成員變量,你可以在每個測試用例的方法中設置該變量。這不是很優雅,但這是我目前唯一可以考慮的方式。

+0

這與我以前做過的類似。我希望有更好的辦法。但是,感謝您的額外信息。 –

0

不幸的是,單元測試的Setup和Teardown方法不是作爲同步調用棧的一部分運行,而是由測試引擎處理。因此從Teardown方法觀察到的調用堆棧將不包含作爲測試一部分運行的方法。

0

而不是讓這個在測試拆除,你可以有一個私人的方法,保存你在每次測試結束時調用的屏幕截圖。然後你的堆棧跟蹤將包含你所期望的測試用例方法。

我同意這種方法並不完美,因爲您必須記住將其添加到每個測試用例,但至少它是通用的,並且不涉及硬編碼字符串中的方法名稱。