【问题标题】:How do I run the same test with multiple inputs?如何使用多个输入运行相同的测试?
【发布时间】:2015-07-28 21:57:39
【问题描述】:

我想做一个像下面这样的批量测试,但是如果有错误,它不会告诉我错误发生在i的哪个值。

@Test
public void simpleMovingAverageBatch() {
    for (int i = 1; i < 61; ++i) {
        simpleMovingAverage(i);
    }
}

public void simpleMovingAverage(int days) {
    double sma = -1;
    int size = stock.getCloses().size();

    stock.calcSMA(days); // <- code that I'm testing

    // first days should be -1
    for (int index = size - 1; index >= size - days + 1; --index) {
        assertEquals(-1, stock.getSMA(days, index), 0.001);
    }

    for (int index = size - days - 1; index >= 0; --index) {
        sma = 0.0;
        for (int i = 0; i < days; ++i) {
            sma += stock.getCloses().get(index + i);
        }
        sma /= days;
        assertEquals(sma, stock.getSMA(days, index), 0.001);
    }
}

这是一个例子,如果我按原样运行代码会发生什么:

这是我想要发生的事情的一个例子:

我已经查看了 Parameterized Tests in this tutorial,但是我不知道这是否是我想要采取的路线。

有什么建议吗?


我不认为这个问题与这些问题重复:

Running the same JUnit test case multiple time with different data

Java unit test for different input data

【问题讨论】:

  • 您的问题与您链接的第一个问题有何不同?
  • 为什么你只是 dont use assertEquals with message in front of it? It wont 产生你想要的图片,但会告诉你哪个“我”产生了错误。例如:assertEquals("This is i:" + i ,-1, stock.getSMA(days, index), 0.001);

标签: java junit


【解决方案1】:

进行此测试的正确方法是使用您在问题中描述的参数化测试。但是,你说你不想那样做。因此,您始终可以将字符串消息参数用于失败消息。

您似乎在这一行中使用了assertEquals(double, expected, double actual, double delta)

assertEquals(-1, stock.getSMA(days, index), 0.001);

相反,您可以使用assertEquals(String message, double expected, double actual, double delta) 为自己提供信息更丰富的错误消息,例如

assertEquals(String.format("For index %d,", index), -1, stock.getSMA(days, index), 0.001);

这会给你一个错误信息,比如:

java.lang.AssertionError: For index 15, expected:<-1.0> but was:<0.0>

【讨论】:

【解决方案2】:

Durron 的回答导致通过@Parameters 进行参数化 JUnit 测试。这是一个很好的答案,非常适合这个问题。然而,我一直在走这条路,发现它创建了复杂且难以阅读的测试。

理论是 JUnit 中的另一种选择:junit.org/apidocs/org/junit/experimental/theories/Theories.html

如果你愿意脱离 JUnit,testNG 的数据提供者非常多才多艺:testng.org/doc/documentation-main.html#parameters-dataproviders

【讨论】:

    【解决方案3】:

    试试JUnitParams。您的测试将如下所示:

    @RunWith(JUnitParamsRunner.class)
    public class ExampleTest {
    
        // this method provides parameters for simpleMovingAverage
        public static Iterable<Integer> parametersForSimpleMovingAverage() {
            return IntStream.rangeClosed(1, 61).boxed().collect(Collectors.toList());
        }
    
        @Parameters
        @Test
        public void simpleMovingAverage(int days) {
            double sma = -1;
            int size = stock.getCloses().size();
    
            stock.calcSMA(days); // <- code that I'm testing
    
            // first days should be -1
            for (int index = size - 1; index >= size - days + 1; --index) {
                assertEquals(-1, stock.getSMA(days, index), 0.001);
            }
    
            for (int index = size - days - 1; index >= 0; --index) {
                sma = 0.0;
                for (int i = 0; i < days; ++i) {
                    sma += stock.getCloses().get(index + i);
                }
                sma /= days;
                assertEquals(sma, stock.getSMA(days, index), 0.001);
            }
        }
    

    当您运行测试时,您将获得一份您想要的报告。更好的是,与标准的 JUnit 参数化运行器不同,JUnitPramsRunner 报告不仅包含测试用例索引,还包含每个案例的参数(抱歉,我没有足够的声誉来发布屏幕截图)。

    注意:你需要添加一个依赖:

    • 分级:

      testCompile 'pl.pragmatists:JUnitParams:1.0.2'
      
    • 马文:

      <dependency>
        <groupId>pl.pragmatists</groupId>
        <artifactId>JUnitParams</artifactId>
        <version>1.0.4</version>
        <scope>test</scope>
      </dependency>
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2014-11-25
      • 1970-01-01
      • 2014-02-19
      相关资源
      最近更新 更多