繁体   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