【问题标题】:Junit parameterized tests using file input使用文件输入的 Junit 参数化测试
【发布时间】:2020-06-27 20:58:05
【问题描述】:

我有一个关于使用参数化测试对我的 API 进行单元测试的问题。现在而不是像

这样构建一个数组列表
Arrays.asList(new Object[]{
   {1},{2},{3}
});

我想一一读取文件中的行,将它们拆分空间并将它们填充到数组中。 这样一来,一切都将被概括。任何人都可以通过示例向我推荐任何这样的方法吗?

还有一种方法可以在不将各种参数声明为私有成员并在测试单元的构造函数中初始化它们的情况下进行测试?

编辑:邓肯要求的代码

@RunWith(Parameterized.class)
public class JunitTest2 {

    SqlSession session;
    Integer num;
    Boolean expectedResult;
    static BufferedInputStream buffer = null;

    public JunitTest2(Integer num, Boolean expected){
        this.num = num;
        this.expectedResult = expected;
    }

    @Before
    public void setup() throws IOException{
        session = SessionUtil.getSqlSessionFactory(0).openSession();
        SessionUtil.setSqlSession(session);
        buffer = new BufferedInputStream(getClass().getResourceAsStream("input.txt"));
        System.out.println("SETUP!");
    }

    @Test
    public void test() {
        assertEquals(expectedResult, num > 0);
        System.out.println("TESTED!");
    }

    @Parameterized.Parameters
    public static Collection getNum() throws IOException{
        //I want my code to read input.txt line by line and feed the input in an arraylist so that it returns an equivalent of the code below

        return Arrays.asList(new Object[][]{
            {2, true},
            {3, true},
            {-1, false}
        });
    }
    @After
    public void tearDown() throws IOException{
        session.close();
        buffer.close();
        System.out.println("TEARDOWN!");
    }
}

另外我的 input.txt 如下:

2 true
3 true
-1 false

【问题讨论】:

  • 所以你想要一个包含1 2 3 内容的文件并解析它?你能告诉我们你尝试了什么,这样我们就知道你到底卡在哪里了吗?关于第二个问题,如果您想使用参数化测试,答案是否定的。
  • 第二部分,你可以创建公共字段(不需要构造函数)并用@Parameter注释它们(见this sample
  • 请看我的代码。我是 Junit 的新手,所以只是一个初学者应用程序。
  • 参见stackoverflow.com/questions/63899534/…关于JUnit5内置的版本@ParameterizedTest

标签: java unit-testing junit junitparams


【解决方案1】:
@RunWith(JUnitParamsRunner.class)
public class FileParamsTest {

    @Test
    @FileParameters("src/test/resources/test.csv")
    public void loadParamsFromFileWithIdentityMapper(int age, String name) {
        assertTrue(age > 0);
    }

}

JUnitParams 支持从 CSV 文件加载数据。

CSV 文件将包含

1,true
2,false

【讨论】:

  • 我一定会试试这个。看起来很有希望,可能正是我需要的。谢谢:)
  • 是的,这个库非常有用,我经常使用它。它还解决了 Junit 的一些缺点。必须尝试数据驱动测试。
  • 太好了,我多年来一直在寻找这个。正如我们所看到的,DataDriven 测试应该非常简单(技术上),然后可以由业务/需求/测试规范 ppl 维护在 excel 中。
【解决方案2】:

看看junitparams 项目,尤其是this example。它将向您展示如何使用 CSV 文件进行参数输入。这是一个简短的例子:

我的 test.csv 文件:

1, one
2, two
3, three

我的测试:

package com.stackoverflow.sourabh.example;

import static org.junit.Assert.assertTrue;
import junitparams.FileParameters;
import junitparams.JUnitParamsRunner;

import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(JUnitParamsRunner.class)
public class FileReadingParameterizedTest {

    @Test
    @FileParameters("src/test/resources/test.csv")
    public void testWithCSV(int number, String name) {
        assertTrue(name + " is not at least two", number >= 2);
    }

}

显然第一个测试将失败,产生错误消息one is not at least two

【讨论】:

  • 不客气。我自己最近才发现这个库,它被证明非常有用。
【解决方案3】:

在Spring-boot Java框架中,可以方便地在类中使用Value注解,

@Component
public class MyRunner implements CommandLineRunner {

@Value("classpath:thermopylae.txt") //Annotation
private Resource res; // res will hold that value the `txt` player

@Autowired
private CountWords countWords;

@Override
public void run(String... args) throws Exception {

    Map<String, Integer> words =  countWords.getWordsCount(res);

    for (String key : words.keySet()) {

        System.out.println(key + ": " + words.get(key));
       }
   }
}

Source

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2015-01-19
    相关资源
    最近更新 更多