#java #junit4 #parameterized-unit-test
#java #junit4 #параметризованный модульный тест
Вопрос:
Я работаю над приложением, в котором есть сетка, и только некоторые точки сетки считаются допустимыми. Мне нужно тщательно протестировать это со всеми возможными значениями сетки или, по крайней мере, со всеми граничными точками.
Я пробовал параметризованные тесты. Это работает нормально, за исключением того факта, что данные становятся неуправляемыми после точки. Пример теста для сетки 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)));
}
}
Есть какие-либо указания по группировке / управлению данными, чтобы мой тест оставался простым и читаемым??
Ответ №1:
Я бы создал генератор данных вместо того, чтобы жестко кодировать все возможные значения. Что-то вроде:
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);
}
Неудачные тесты в любом случае выводят параметры.
Комментарии:
1. С генератором данных я не получу тот тип входных данных, который я привел в своем примере. Это дало бы мне два массива со всеми значениями x и y, равными true и false. Я ожидаю, что истинной будет только средняя точка. Остальные из них должны быть false.
Ответ №2:
я бы разделил тесты на 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]));
}
}