2017-05-26 67 views
0

我正在測試一個包含三個不同模塊的網頁。在我的測試框架中,每個頁面模塊都由其自己的測試類表示:Module1TestsModule2TestsModule3Tests。此外,爲了滿足每個模塊的具體條件,我在每個測試課程中都使用Assume.That。 有了這個設置,如果我只是測試單獨的模塊,一切正常。 但是,當我創建整個頁面的測試類,並使用Assert.Multiple這樣的:NUnit:Assert.Multiple for methods that contains Assume.That

public class HomePageTests 
    { 
     public Module1Tests Module1Tests { get; } = new Module1Tests(); 

     public Module2Tests Module2Tests { get; } = new Module2Tests(); 

     public Module3Tests Module3Tests { get; } = new Module3Tests(); 

[Test] 
public void HomePage() 
{ 
    Assert.Multiple(() => 
    { 
     Module1Tests.Module1TestMethod(); 
     Module2Tests.Module2TestMethod(); 
     Module3Tests.Module3TestMethod(); 
    }); 
} 

,我感到我不能在Assert.Multiple塊使用方法與Assume.That錯誤消息。

我也打過電話模塊的測試方法,而沒有Assert.Multiple塊,但整個頁面測試停止在第一次失敗執行。

有沒有辦法解決這個問題?基本上我只想對所有基礎模塊測試通過的頁面進行測試。

+0

這似乎是[記錄](https://github.com/nunit/docs/wiki/Multiple-Asserts)行爲(數6在列表)。不知道他們爲什麼這麼做,但似乎是故意的。 –

+0

是的,這是故意的。我希望有一些其他的方式來實現我的目標。 – YMM

回答

0

正如已經指出的那樣,並且如消息所示,您不能在多重聲明塊中使用假設。如果您查看文檔「假設」頁面上註釋6中的排除項目列表,您將看到它們都是旨在立即終止執行測試的所有項目。

Assert.Fail以及失敗的斷言也打算立即終止過程中的測試。多個斷言使得這個例外......記錄失敗,但是直到所有嵌套的Assert.Multiple塊結束,測試才結束。

我認爲做一些例外的每個列表上的項目,這將需要界定爲他們每個人的新的行爲。目前還不清楚最好的替代行爲是什麼,所以我決定等待用戶反饋。這個問題實際上是我見過的第一個反饋,謝謝!

在共同使用,假設提前放置所有斷言的,有時甚至在設置方法。他們在這種情況下的含義基本上是:「如果這個假設失敗了,那麼運行測試就沒有意義了。」偶爾,他們會被放在幾個斷言之後,這意味着「如果失敗了,再次運行測試是沒有意義的。」

如果我理解正確的話,你想失敗的假設意味着我們就應該跳過在你的模塊測試之一以下所有斷言,而是繼續與任何其他模塊的測試。但是至少在今天,測試用例中模塊測試的概念在NUnit中並不存在。在NUnit的提供給您的結構是通過層次表示: *命名空間(可能是嵌套) *夾具 *測試用例 *多種斷言塊(可能是嵌套) *斷言

如果你的模塊測試使用多斷言自己塊,然後我們可以考慮將多個斷言塊中的假設的行爲映射爲「在這個塊內運行更多測試代碼是沒有意義的」。如果你想這樣做,你需要在github上提交一個功能請求。我可以告訴你,這不是一個微不足道的變化,所以我們不能保證我們會這樣做,但可能值得做一些分析,看看它是如何工作的。基本上,我們想給你你需要的東西而不會讓其他用戶困惑。:-)

隨着電流的能力,我看到兩個選擇,一個解決方法:

  1. 使每個模塊的測試夾具,基本上取代了目前的測試方法中的一個單獨的測試方法。如果執行順序對您很重要,請在每個測試中放置Order屬性。換句話說,你現有的n個測試夾具將成爲n個獨立的夾具。我不知道這是否可行,因爲我沒有看到您的代碼,但它是利用NUnit的現有工具進行結構化測試的一種方法。

  2. 將模塊測試封裝爲一組類而不是一組方法。用一種方法運行所有的假設,用另一種方法運行所有的假設。在您的Assert.Multiple塊之前,先調用所有假設。如果你不想讓失敗的假設停止整個測試,那麼你必須從假設條目返回一個bool,並記住是否運行每個模塊。

  3. 可能是最簡單的:在每個模塊測試方法中將您的假設條件化爲條件。如果假設失敗,則不要運行測試。

我真的希望我可以提供作爲結構的替代方案是嵌套燈具。在很多方面,這將符合你想要做的比其他選擇更好的東西。不幸的是,儘管NUnit允許在語法上嵌套拼圖,但是在運行測試時嵌套會被完全忽略。我們有一個突出的功能要求來改變這一點,但它相當未來。

  • Replac
  • +0

    感謝這樣一個詳細的答案,@Charlie! 建議1是我在發佈我的問題之前嘗試的第一個。我有一個帶有三個'[Test]'塊的頁面測試類,每個塊代表一個方法,從模塊測試類中調用模塊測試方法。其實它的工作原理,但問題是,我使用模塊的參數化測試方法(使用'[Values]'和'[ValueSource]'屬性),並且爲每個模塊重複相同的參數塊對我來說似乎並不優雅。我在燈具級嘗試了參數化,但我不能在那裏使用'[ValueSource]'屬性。 – YMM

    +0

    建議3看起來不錯,但如果條件不滿意,我該如何不運行測試?例如,我使用'if'來檢查布爾條件,如果不是這樣,我該怎麼做才能跳過測試?由於相同的原因,不允許調用'Assert.Inconclusive'。 – YMM

    +0

    我假設你會從模塊測試中返回,將控制權交還給測試方法本身,然後調用下一個模塊測試。 – Charlie