Как сгруппировать тестовые данные в параметризованный тест? - PullRequest
1 голос
/ 24 мая 2011

Я работаю над приложением, которое имеет сетку, и только некоторые точки сетки считаются действительными. Мне нужно тщательно проверить это со всеми возможными значениями сетки или, по крайней мере, со всеми граничными точками.

Я пробовал параметризованные тесты. Работает нормально, ожидая, что данные станут неуправляемыми после определенного момента. Пример теста для сетки 3х3 приведен ниже.

@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)));
    }
}

Любые входные данные о том, как группировать / управлять данными, чтобы мой тест оставался простым и читаемым ??

Ответы [ 2 ]

1 голос
/ 28 декабря 2014

Я бы разделил тесты на 2 группы. действительные и недействительные баллы. если точек действительно много, используйте @Parameterized для их генерации вместо перечисления. или используйте JunitParams, чтобы прочитать их из файла. если вы предпочитаете сохранить все точки в исходном файле, тогда я предлагаю использовать zohhak :

import static java.lang.Integer.parseInt;
import static junit.framework.Assert.*;
import org.junit.runner.RunWith;
import com.googlecode.zohhak.api.Coercion;
import com.googlecode.zohhak.api.TestWith;
import com.googlecode.zohhak.api.runners.ZohhakRunner;

@RunWith(ZohhakRunner.class)
public class MyTest {

    Grid grid = new Grid(3,3);

    @TestWith({
        "1-1"
    })
    public void should_be_valid_point(Point point) {
        assertTrue(grid.isPointValid(point));
    }

    @TestWith({
        "0-0",
        "1-0",
        "2-0",
        "2-1"
    })
    public void should_be_invalid_point(Point point) {
        assertFalse(grid.isPointValid(point));
    }

    @Coercion
    public Point parsePoint(String input) {
        String[] split = input.split("-");
        return new Point(parseInt(split[0]), parseInt(split[1]));
    }
}
1 голос
/ 24 мая 2011

Я бы создал генератор данных вместо того, чтобы жестко кодировать все возможные значения.Что-то вроде:

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

Неудачные тесты в любом случае являются параметрами печати. ​​

...