在这个测试中多个断言是错误的吗?

时间:2013-11-21 11:25:40

标签: c# visual-studio unit-testing assert

我正在尝试测试名为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);
}

4 个答案:

答案 0 :(得分:3)

您已经注意到,一个断言规则涉及概念断言,而不是对Assert方法的裸调用。当一个逻辑断言由许多断言组成并且使测试更具可读性时,一个很好的常见技巧可以减少混淆,它将断言包含在实用程序方法中。在你的情况下,它可能看起来像这样:

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

有许多框架有助于提高测试的可读性,例如Shouldly

答案 1 :(得分:3)

对我来说也很好看。我不确定你的每个单元测试应该只有一个Assert的概念。这听起来像一个“象牙塔”规则,只是一个愚蠢的IMO。如果您的方法在给定特定输入的情况下设置了一堆变量,那么您应该检查给定该输入的所有变量。编写六个不同的单元测试(以及相关的设置代码)似乎非常低效。

然而,当谈到编写软件时,我倾向于倾向于实用主义而不是学术上的“正确性”。

答案 2 :(得分:1)

我建议断言你关心的所有事情都是'工作',而不仅仅是那个。断言太少而你的测试会忽略明显破坏的功能;太多了,当一些不相关的细节发生变化时,你的测试会变得脆弱并且不必要地破坏。

答案 3 :(得分:-1)

在布尔变量中匹配条件,如果满足所有条件,则布尔变量应返回true。

资产这个布尔变量

bool AreAllConditionsFulfilled = condition1 && condtionCheckingSessionVariablesOne && conditionCheckingSessionVariablesTwo

另外,我建议让各个测试用例测试每个会话变量,并断言它们是否正确。

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