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