#java #junit
#java #junit
Вопрос:
У меня есть класс, который я тестирую с использованием тестовых модулей JUnitCore для запуска теста. Программа, по сути, удаляет каждое n-е значение из связанного списка, это очень просто. Я тестирую:
1) Посмотрите, соответствует ли размер нового списка тому размеру, который я ожидаю. 2) Посмотрите, был ли удален элемент, который, как я знаю, должен был быть. Например, ниже я знаю, что «Элемент 1» был удален.
Мне было поручено убедиться, что 1) пройдет и 2) завершится неудачей, и все это работает, но при запуске моего кода мои проблемы заключаются в:
1) Это не очень эффективный тест, и его можно улучшить. 2) Когда 1) равно True, а 2) равно false (как в коде ниже), вывод просто «False», и я не уверен, правильно ли это.
Я пробовал, когда оба класса имеют значение true, и это возвращает True.
-
Код для тестирования
import org.junit.Test; import org.junit.Ignore; import static org.junit.Assert.*; import java.util.LinkedList; public class PruneTest { @Test public void testListSize() { LinkedList <String> linkedlist = new LinkedList<String>(); linkedlist.add("Item 0"); linkedlist.add("Item 1"); linkedlist.add("Item 2"); linkedlist.add("Item 3"); linkedlist.add("Item 4"); linkedlist.add("Item 5"); linkedlist.add("Item 6"); linkedlist.add("Item 7"); linkedlist.add("Item 8"); linkedlist.add("Item 9"); Pruner prunes = new Pruner(); prunes.prune(linkedlist, 2); assertEquals(5, linkedlist.size()); } @Test public void testItemRemoved(){ LinkedList <String> linkedlist = new LinkedList<String>(); linkedlist.add("Item 0"); linkedlist.add("Item 1"); linkedlist.add("Item 2"); linkedlist.add("Item 3"); linkedlist.add("Item 4"); linkedlist.add("Item 5"); linkedlist.add("Item 6"); linkedlist.add("Item 7"); linkedlist.add("Item 8"); linkedlist.add("Item 9"); Pruner prunes = new Pruner(); prunes.prune(linkedlist, 2); assertTrue(linkedlist.contains("Item 1")); } }
-
Код для создания тестового модуля
import org.junit.runner.JUnitCore; import org.junit.runner.Resu< import org.junit.runner.notification.Failure; public class PruneTestTwo { public static void main() { Result result = JUnitCore.runClasses(PruneTest.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Ответ №1:
Вы можете получить более подробный и полезный результат из своих тестов, используя альтернативный assertThat
метод с сопоставителями, а не более старый assertEquals
/ assertTrue
Например, вы могли бы объединить два ваших теста выше и получить значимый вывод о том, что не удается, например, так:
@Test
public void testListSize() {
LinkedList <String> linkedlist = new LinkedList<String>();
linkedlist.add("Item 0");
linkedlist.add("Item 1");
linkedlist.add("Item 2");
linkedlist.add("Item 3");
linkedlist.add("Item 4");
linkedlist.add("Item 5");
linkedlist.add("Item 6");
linkedlist.add("Item 7");
linkedlist.add("Item 8");
linkedlist.add("Item 9");
Pruner prunes = new Pruner();
prunes.prune(linkedlist, 2);
assertThat(linkedlist.size(), is(5));
assertThat(linkedlist, hasItem("Item 1"));
}
Затем, когда второе утверждение завершится неудачей, вы получите результат, подобный этому (который намного легче понять, чем одинокий false
):
java.lang.AssertionError:
Expected: a collection containing "x"
but: was "Item 0", was "Item 1", was "Item 2", was "Item 3", was "Item 4", was "Item 5", was "Item 6", was "Item 7", was "Item 8", was "Item 9"
Вы могли бы улучшить это еще больше, убедившись, что сокращенный список именно такой, какой вы ожидаете — вместо проверки размера и одного элемента в нем, вы можете проверить размер и каждый элемент (вместе с порядком в списке) с помощью contains
средства сопоставления:
assertThat(linkedlist, contains("Item 0", "Item 2", "Item 4", "Item 6", "Item 8"));
Комментарии:
1. Спасибо! Так будет разумнее, я обновлю свой код и отмечу как ответивший.