簡體   English   中英

在這個測試中多個斷言是錯誤的嗎?

[英]Are multiple asserts wrong in this test?

我正在嘗試測試一個名為Login的方法,當用戶和密碼參數正確時,設置兩個會話變量和三個cookie的值,最后返回true。

我一直在閱讀幾篇關於單元測試的帖子,但不知怎的,這並沒有讓我對我的情況完全清楚。 我知道每單元測試應該只有一個斷言,盡管只要測試一個“邏輯概念”就可以使用多個斷言。

登錄方法只有正確設置每個會話變量和cookie並返回預期值才正確,所以我不確定是否可以立即檢查所有這些值(這會導致我在單元中使用六個斷言)測試,我覺得有點臟)或者我應該在不同的測試中分別檢查每個會話變量和cookie的值。

[TestMethod()]
public void SuccessfulLoginTest()
{
    // Arrange.
    String username = "foo";
    String password = "correct password";
    Boolean remember = true;

    // Act.
    Boolean actual = Login(username, password, remember);

    // Assert.
    Assert.IsTrue(actual);
    Assert.AreEqual("foo", HttpContext.Current.Session["Username"]);
    Assert.AreEqual(1, HttpContext.Current.Session["Group"]);
    Assert.AreEqual("foo", HttpContext.Current.Response.Cookies["Username"].Value);
    Assert.AreEqual("en", HttpContext.Current.Response.Cookies["Lang1"].Value);
    Assert.AreEqual("es", HttpContext.Current.Response.Cookies["Lang2"].Value);
}

您已經注意到, 一個斷言規則涉及概念斷言,而不是對Assert方法的裸調用。 當一個邏輯斷言由許多斷言組成並且使測試更具可讀性時,一個很好的常見技巧可以減少混淆,它將斷言包含在實用程序方法中。 在你的情況下,它可能看起來像這樣:

void AssertSessionIsValid(string username, int group, ...)
{
    Assert.AreEqual(username, HttpContext.Current.Session["Username"]);
    Assert.AreEqual(group, HttpContext.Current.Session["Group"]);
    ...
}

有許多框架有助於提高測試的可讀性,例如Shouldly

對我來說也很好看。 我不確定你的每個單元測試應該只有一個Assert的概念。 這聽起來像一個“象牙塔”規則,只是一個愚蠢的IMO。 如果您的方法在給定特定輸入的情況下設置了一堆變量,那么您應該檢查給定該輸入的所有變量。 編寫六個不同的單元測試(以及相關的設置代碼)似乎非常低效。

但是當談到編寫軟件時,我傾向於傾向於實用主義而不是學術上的“正確性”。

我建議斷言你關心的所有事情都在“工作”,而不僅僅是那個。 斷言太少而你的測試會忽略明顯破壞的功能; 太多了,當一些不相關的細節發生變化時,你的測試會變得脆弱並且不必要地破壞。

在布爾變量中匹配條件,如果滿足所有條件,則布爾變量應返回true。

資產這個布爾變量

bool AreAllConditionsFulfilled = condition1 && condtionCheckingSessionVariablesOne && conditionCheckingSessionVariablesTwo

此外,我建議讓各個測試用例測試每個會話變量,並斷言它們是否正確。

[Test]
public void TestUserNameSessionVariable()
{
//Login Code
Assert.AreEqual("foo", HttpContext.Current.Session["Username"]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM