assertEquals,啥是实际的,啥是预期的?
Posted
技术标签:
【中文标题】assertEquals,啥是实际的,啥是预期的?【英文标题】:assertEquals, what is actual and what is expected?assertEquals,什么是实际的,什么是预期的? 【发布时间】:2014-11-24 00:30:19 【问题描述】:我一直想知道在 TestNG 之类的库中 assertEquals
中实际和预期的确切含义是什么。
如果我们阅读我们看到的 Java 文档:
public static void assertEquals(... actual, ... expected)
Parameters:
actual - the actual value
expected - the expected value
据我了解,expected
值是已知值,因此是我们期望的值,actual
值是我们要验证的值。例如,假设我们要测试一个函数fooBar
,它总是必须返回56
。
在这种情况下,我会这样做:assertEquals(sth.fooBar(), 56)
。但是在GitHub 上快速搜索一下,似乎人们会反其道而行之,所以assertEquals(56, sth.fooBar())
。但是,当我们甚至不知道该值时,期望值怎么可能是sth.fooBar()
?似乎sth.fooBar()
是我们与我们已经知道的预期值进行比较的实际值。
我知道测试的正确性没有区别,但我想遵循“正确”的方式。
【问题讨论】:
可能他们只是匆匆忙忙,并没有像你一样关心命名顺序:) 【参考方案1】:大多数测试框架(xUnit 系列)都基于 JUnit 框架。 JUnit 中的Assert
系列函数具有(expected, actual)
格式;它成为了一种约定,而其他大多数框架都遵循该约定。
一些框架(如 TestNG 或 .NET 的 NUnit 2.4+)颠倒了该顺序(使用基于约束的 NUnit 模型)以提高可读性(“确保实际值为 56 em>”感觉比“确保 56 是实际值”更自然。
底线是:坚持框架的约定。如果您使用 JUnit,请将期望值放在首位。如果您使用TestNG,请将实际值放在第一位。你是对的,当你不小心颠倒了论点时,这对测试结果没有影响。但这会对您从失败的测试中获得的默认消息产生很大的影响。当您在 JUnit 中的 reversed assertEquals(ShouldBeTrueButReturnsFalse(), true)
失败时,默认消息会显示“expected [false] but found [true]”,它应该显示“expected [true] 但发现 [false]”。至少可以这么说,这令人困惑,您不必处理该消息的可能误导。
您提供的 Github 链接中的某些单元测试不遵循约定并且存在相同的问题。不要那样做。 遵守框架的约定。
【讨论】:
我正在使用(预期的,实际的)TestNG(来自 xUnit)。现在我必须更改所有的 assertEquals()。我会说颠倒顺序对 TestNG 来说是个坏主意 :( 并且 Java 不允许命名参数(我更喜欢 C# 的原因之一)【参考方案2】:答案很简单。 JUnit 具有相反的参数顺序。请参考以下示例:
JUnit:
void assertEquals(Object expected, Object actual)
测试NG:
void assertEquals(int actual, int expected)
【讨论】:
我不知道,但它实际上并没有回答我的问题。 (所以我从我的问题中删除了 JUnit) 答案仍然是相同的人学习如何使用 JUnit 并在切换到 TestNG 后使用相同的模式。反之亦然。但是这里不是问这种问题的地方,因为没有真正的答案,只有意见。【参考方案3】:我也有同样的困惑。
但是混淆是因为 Github 搜索返回了 TestNG 和 junit 的 assertEquals 语法。您的预期和实际理解是正确的。
TestNG: assertEquals(Object actual, Object expected)
junit: assertEquals(Object expected, Object actual)
例如,在下面代码的testNG结果中
int x=1+2;
assertEquals(x,2);
是:
java.lang.AssertionError: expected [2] but found [3]
Expected :2
Actual :3
【讨论】:
【参考方案4】:你可以使用:
String expectedTitles[] = "value-1", "value-2", "value-3". "value-14");
List<String> expectedTitlesList = Arrays.asList(expectedTitles);
Assert.assertTrue(expectedTitlesList.contains(("value-to-compare")));
使用 Maven:
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all -->
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</dependency>
【讨论】:
问题是解释在测试框架中使用预期和实际的正确方法。以上是关于assertEquals,啥是实际的,啥是预期的?的主要内容,如果未能解决你的问题,请参考以下文章