Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit断言方法的措辞应该是肯定的还是否定的?_Java_Junit_Assert - Fatal编程技术网

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,这绝对值得尽可能清楚地说明——当在数百次测试中出现故障时,您需要尽可能多的上下文来帮助您了解其原因这是否定形式,那么我不同意。“绝对”知道上下文可能意味着,您将打印出整个操作系统内存的转储(有点夸张)。关键是要提供相关信息。积极断言文本正是为了这个目的。