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,啥是实际的,啥是预期的?的主要内容,如果未能解决你的问题,请参考以下文章

Azure SQL——实际上啥是 vCore

Android中,Context,啥是Context

LSTM Keras - 啥是正确的输入形状

究竟啥是 AWS 中的“承担”角色?

究竟啥是画布路径,ctx.closePath() 有啥用?

啥是佩奇排名算法