Java JUnit断言方法的措辞应该是肯定的还是否定的?
我是否应该写作Java JUnit断言方法的措辞应该是肯定的还是否定的?,java,junit,assert,Java,Junit,Assert,我是否应该写作 assertTrue(“用户登录”,User.isLoggedIn()) 或 assertTrue(“用户未登录”,User.isLoggedIn()) 前者可以更好地读取源文件: “我断言以下是正确的:用户已登录。” 错误消息可以双向读取: java.lang.AssertionError:用户登录 “断言用户已登录时出错” “错误是用户已登录。” JUnit文档没有提供一个明确的指南,除非它是 “用于{@link AssertionError}的标识消息, 在这两种情况下,文
assertTrue(“用户登录”,User.isLoggedIn())代码>
或
assertTrue(“用户未登录”,User.isLoggedIn())代码>
前者可以更好地读取源文件:
“我断言以下是正确的:用户已登录。”
错误消息可以双向读取:
java.lang.AssertionError:用户登录
“断言用户已登录时出错”
“错误是用户已登录。”
JUnit文档没有提供一个明确的指南,除非它是
“用于{@link AssertionError}的标识消息,
在这两种情况下,文本标识正在运行的测试
常用的用法是什么?那么:
assertTrue("User should be logged in", user.isLoggedIn());
这是双向的。好吧,你也可以陈述你的假设,然后说明假设是如何不成立的。像这样:
assertTrue("Expected user to be logged it, and wasn't", user.isLoggedIn());
使信息更清晰,但输入和阅读的时间更长。您应该同时包含这两种情况。当您三角化您的断言时,您有更好的测试用例 为了避免这个问题,我越来越倾向于使用assertThat
而不是“低级”assert*方法。事实上,正如解释的那样,资产在发生故障时会给您一条非常清晰的错误信息。您可以使用:
assertTrue("Test if user is logged in", user.isLoggedIn());
当您这样做时,您正在验证user.isLoggedIn()
是否为真,您不能说用户是否登录,您还不知道,您只是在测试它。有趣的是,我会使用:
assertTrue("user should be logged in", user.isLoggedIn());
这告诉我这个断言的预期状态
我认为最好的选择是你能理解的。在你的断言信息中要绝对积极
使用第一个示例中的肯定断言文本,或类似于:
assertTrue("User is logged in", user.isLoggedIn());
原因是:
- 肯定断言较短
- 您正在检查一个断言条件,以及许多可能的原因,为什么它出错。不要试图检测原因,只需说明断言失败的原因
- 它在代码中更具可读性。通常建议使用肯定表达式进行编码,这样可以在读者的头脑中保留对条件的否定
- 它在错误跟踪中仍然是可读的,一般用户不应该理解错误跟踪,但是程序员应该理解错误跟踪,而程序员最终还是会理解错误跟踪。即使是系统管理员,也不会访问代码,会向作者提供完整的错误消息,程序员会理解,它来自断言
试图在断言消息中提供“所有上下文信息”并不能改善这种情况,反而会造成信息混乱
你知道,优秀的程序员调试代码,并提供可工作且较短的代码
在这个方向上,首先要做的就是使用肯定的断言消息
另一个方向——用越来越多不必要的东西修补代码正在为编程地狱铺平道路。+1,这绝对值得尽可能清楚地说明——当在数百次测试中出现故障时,您需要尽可能多的上下文来帮助您了解其原因这是否定形式,那么我不同意。“绝对”知道上下文可能意味着,您将打印出整个操作系统内存的转储(有点夸张)。关键是要提供相关信息。积极断言文本正是为了这个目的。