【问题标题】:How to assert that multiple variables have the same value?如何断言多个变量具有相同的值?
【发布时间】:2018-04-07 03:26:31
【问题描述】:

我正在为计算函数编写一个 jUnit 测试

double calculate(double val1, double val2);

如果输入被“翻转”,则该函数应该返回相同的结果,即哪个先出现无关紧要,它们是负数还是正数都无关紧要(只要它们相等标志)。

以下都应该产生相同的结果:

calculate(1.5, 4.7);
calculate(4.7, 1.5);
calculate(-1.5, -4.7);
calculate(-4.7, -1.5);

但这有一个缺点,当其中一个失败时终止测试方法。

我当前的测试只是做了 4 个单独的断言:

assertEquals( 9.472, result1, 0.001 );
assertEquals( 9.472, result2, 0.001 );
assertEquals( 9.472, result3, 0.001 );
assertEquals( 9.472, result4, 0.001 );

但这有一个缺点是当其中一个失败时终止测试方法。使用数组进行测试也是如此:

assertArrayEquals(
        new double[]{9.472, 9.472, 9.472, 9.472},
        new double[]{result1, result2, result3, result4},
        0.001);

我想出的另一个选择是简单地断言它们都是平等的,使用

assertTrue( result1 == result2 && result2 == result3 && result3 == result4 );

但这样做的缺点是在失败时不会告诉您实际值。

测试这种东西的最佳方法是什么?

【问题讨论】:

  • "...当其中一个测试方法失败时终止测试方法的缺点..." - 你能澄清为什么你认为这是一个缺点吗?断言的整个想法是它的失败使测试方法终止。如果您想分别查看哪些断言成功和哪些失败,并在第一次失败后让测试“继续”,您需要编写多个测试用例,每个测试用例中都有一个断言。根据 David Ehrmann 的回答,无论您是否使用“参数化测试”功能,都由您决定 - 我从未真正发现该功能有多大用处。

标签: java unit-testing junit android-junit


【解决方案1】:

这听起来正是parameterized tests 的用途。

你的测试方法就是

@Test
public void testCommutativity() {
    assertEquals(calculate(a, b), calculate(b, a), .001);
}

您的参数方法将类似于

@Parameters
public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][] {     
             { 1.5, 4.7 }, { -1.5, -4.7 }
       });
}

您甚至可以在返回参数之前以编程方式更改参数(使一个或两个为负数)。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2013-06-12
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多