assertEquals,什么是实际的和预期的?

时间:2014-09-29 14:57:45

标签: java unit-testing testing testng junit4

我总是想知道像TestNG这样的库assertEquals中实际和预期的含义究竟是什么。

如果我们阅读Java Docs,我们会看到:

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()是我们与我们已经知道的预期值进行比较的实际值。

我知道测试的正确性没有区别,但我想遵循“正确”的方式。

4 个答案:

答案 0 :(得分:14)

大多数测试框架(xUnit系列)都基于JUnit框架。 JUnit中的Assert函数族具有(expected, actual)格式;它成为一种惯例,大多数其他框架都遵循该惯例。

某些框架(如TestNG或NUnit 2.4+ for .NET)颠倒了该顺序(使用基于约束的NUnit模型)以提高可读性(“确保实际值为56 “感觉比”更自然“确保56是实际值”)。

底线是:坚持框架的惯例。如果使用JUnit,请将期望值放在第一位。如果您使用TestNG,请先将实际值放入。你是对的,当你意外地反转参数时,测试结果没有任何区别。但它会对您从失败的测试中获得的默认消息产生重大影响。当JUnit中的颠倒 assertEquals(ShouldBeTrueButReturnsFalse(), true)失败时,默认消息显示“ expected [false]但找到[true] ”,它应该说“期望[true]但发现[false] “。至少可以说这是令人困惑的,你不应该处理可能误导的消息。

您提供的Github链接中的某些单元测试不符合约定并且具有相同的问题。不要那样做。 坚持框架惯例

答案 1 :(得分:5)

答案很简单。 JUnit具有相反的参数顺序。请参考以下示例:

JUnit的:

void assertEquals(Object expected, Object actual)

TestNG的:

void assertEquals(int actual, int expected)

答案 2 :(得分: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

答案 3 :(得分:-3)

您可以使用:

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>