Java 如何在参数化测试中对测试数据进行分组?

Java 如何在参数化测试中对测试数据进行分组?,java,junit4,parameterized-unit-test,Java,Junit4,Parameterized Unit Test,我正在开发一个应用程序,它有一个网格,只有网格的一些点被认为是有效的。我需要用所有可能的网格值或者至少用所有边界点广泛地测试这一点 我尝试过参数化测试。除了数据在一个点之后变得不可管理之外,它工作得很好。下面给出了3x3网格的样本测试 @RunWith(Parameterized.class) public class GridGameTest { @Parameters public static Collection<Object[]> data(){

我正在开发一个应用程序,它有一个网格,只有网格的一些点被认为是有效的。我需要用所有可能的网格值或者至少用所有边界点广泛地测试这一点

我尝试过参数化测试。除了数据在一个点之后变得不可管理之外,它工作得很好。下面给出了3x3网格的样本测试

@RunWith(Parameterized.class)
public class GridGameTest {

    @Parameters
    public static Collection<Object[]> data(){
        return Arrays.asList(new Object[][] {
                { 0, 0, false }, { 0, 1, false }, { 0, 2, false }, 
                { 1, 0, false }, { 1, 1, true }, { 1, 2, false },
                { 2, 0, false }, { 2, 1, false }, { 2, 2, false }
                                 } );
    }

    private final int x;
    private final int y;
    private final boolean isValid;

    public GridGameTest(int x, int y, boolean isValid){
        this.x = x;
        this.y = y;
        this.isValid = isValid;
    }

    @Test
    public void testParameterizedInput(){
        Grid grid = new Grid(3,3);
        assertEquals(isValid, grid.isPointValid(new Point(x,y)));
    }
}
@RunWith(参数化的.class)
公共类GridGameTest{
@参数
公共静态收集数据(){
返回Arrays.asList(新对象[][]{
{0,0,false},{0,1,false},{0,2,false},
{1,0,false},{1,1,true},{1,2,false},
{2,0,false},{2,1,false},{2,2,false}
} );
}
私人最终int x;
私人终审法院;
私有最终布尔值是有效的;
公共GridGameTest(整数x,整数y,布尔值有效){
这个.x=x;
这个。y=y;
this.isValid=isValid;
}
@试验
公共void testParameterizeInput(){
网格网格=新网格(3,3);
assertEquals(isValid,grid.isPointValid(新点(x,y)));
}
}

关于如何分组/管理数据的任何输入,以便我的测试保持简单易读???

我将创建一个数据生成器,而不必硬编码所有可能的值。比如:

public static Collection<Object[]> data(){
    Object[][] result = new Object[3][3];
    for (Boolean flag : new Boolean[]{Boolean.FALSE, Boolean.TRUE})
    {
      for (int i = 0; i < 3; i++)
      {
        for (int j = 0; j < 3; j++)
        {
          Object[] row = new Object[] {j, i, flag};
          result[i][j] = row;
        }
      }
    }
    return Arrays.asList(result);
}
公共静态采集数据(){
对象[][]结果=新对象[3][3];
for(布尔标志:新布尔[]{Boolean.FALSE,Boolean.TRUE})
{
对于(int i=0;i<3;i++)
{
对于(int j=0;j<3;j++)
{
Object[]行=新对象[]{j,i,flag};
结果[i][j]=行;
}
}
}
返回数组.asList(结果);
}

失败的测试都是打印参数。

我将测试分为两组。有效点和无效点。如果确实有很多点,那么使用
@Parameterized
生成它们,而不是列出它们。或者使用JunitParams从文件中读取它们。如果您希望保留源文件中的所有点,那么我建议使用:

导入静态java.lang.Integer.parseInt;
导入静态junit.framework.Assert.*;
导入org.junit.runner.RunWith;
导入com.googlecode.zohhak.api.compression;
导入com.googlecode.zohhak.api.TestWith;
导入com.googlecode.zohhak.api.runners.ZohhakRunner;
@RunWith(ZohhakRunner.class)
公共类MyTest{
网格网格=新网格(3,3);
@测试({
"1-1"
})
公共无效应为有效点(点){
assertTrue(grid.isPointValid(点));
}
@测试({
"0-0",
"1-0",
"2-0",
"2-1"
})
公共无效应为无效点(点){
assertFalse(grid.isPointValid(点));
}
@胁迫
公共点解析点(字符串输入){
String[]split=input.split(“-”);
返回新点(parseInt(split[0]),parseInt(split[1]);
}
}

使用数据生成器,我无法获得我在示例中给出的输入类型。这将给我两个数组,其中所有x和y值都为true和false。我只希望中间点是正确的。其余的应该是假的。