Junit参数化测试使用文件输入

4

我有一个关于在单元测试中使用参数化测试的问题,现在我不想像这样构建一个数组列表:

Arrays.asList(new Object[]{
   {1},{2},{3}
});

我希望能够逐行读取文件并将其按空格分割填入数组中。这样一来,所有内容都会被泛化。有人能给我提供一个带有示例的方法吗?
此外,是否有一种方法可以在不将各种参数声明为私有成员并在测试单元的构造函数中初始化它们的情况下进行测试?
编辑:如Duncan所要求的代码
@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”内容的文件并解析它?你能展示一下你尝试过什么,这样我们就知道你卡在哪里了。关于你的第二个问题,如果你想使用参数化测试,答案是否定的。 - Duncan Jones
对于第二部分,您可以创建公共字段(无需构造函数),并使用@Parameter进行注释(请参见此示例)。 - user180100
请查看我的代码。 我是JUnit的新手,只是一个初学者应用程序。 - Sourabh
请参考 https://stackoverflow.com/questions/63899534/how-to-use-junit5-parametrized-test-csv-file-source 了解内置于 JUnit5 @ParameterizedTest 中的版本。 - Joshua Goldberg
3个回答

15
@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

我一定会试试看。看起来很有前途,可能正是我所需要的。谢谢 :) - Sourabh
是的,这个库非常有用,我经常使用它。它还解决了一些 Junit 的缺点。对于数据驱动测试来说,这是一个必试之选。 - Narendra Pathai
太好了,我寻找这个已经很多年了。正如我们所看到的,数据驱动测试应该非常简单(从技术上讲),然后可以由业务/需求/测试规范人员在Excel中进行维护。 - Bastl

3

请查看junitparams项目,特别是这个示例。它将向您展示如何使用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”。

非常欢迎。我自己最近才发现这个库,它证明非常有用。 - blalasaadri

2
在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));
       }
   }
}

来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接