Должен ли я проверить точный результат алгоритма или просто проверить некоторые элементы результата? - PullRequest
1 голос
/ 22 октября 2019

Я написал алгоритм BFS, и я хотел бы протестировать алгоритм.

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

Проверка полного пути:

@Test
void traverse_UndirectedGraph_CommonTraverse() {
    BreadthFirstSearchTest<String> breadthFirstSearchTest= new BreadthFirstSearchTest<>(undirectedGraph);
    assertIterableEquals(Lists.newArrayList("A", "B", "E"), breathFirstSearch.traverse("A", "E"));
}

Проверка, содержит ли путь начальную вершину и конечную вершину:

@Test
void traverse_UndirectedGraph_CommonTraverse() {
    BreadthFirstSearchTest<String> breadthFirstSearchTest= new BreadthFirstSearchTest<>(undirectedGraph);
    List<String> path = breathFirstSearch.traverse("A", "E");
    assertEquals("A", path.get(0));
    assertEquals("E", path.get(path.size() - 1));
}

Является ли любой из этих двух подходов правильным? Если нет, то как бы вы проверили эти алгоритмы?

1 Ответ

1 голос
/ 22 октября 2019

Является ли любой из этих двух подходов правильным?

Возможно. Но это сложно сказать без точного понимания ваших полных требований и контекста, например, классов / структур данных, на которые опирается ваш поиск.

Если нет, как бы вы это проверили? алгоритмы?

Я бы следовал TDD.

Значение: вы начинаете с написания тестов сначала .

Чтобы быть точным:

  • вы пишете один простой тест
  • вы гарантируете, что тест не пройден
  • затем вы пишете достаточно «производственного» кода, чтобы ваш тест прошел
  • Вы можете реорганизовать свою кодовую базу (чтобы улучшить ее качество)
  • вернуться к шагу 1

Другими словами: вы разрабатываете свой алгоритм, постепенно переходя от малого,простые тесты, для более сложных сценариев.

Помимо этого, вы также можете взглянуть на это с точки зрения настоящего «тестера». Значение: вы полностью игнорируете реализацию. Вместо этого вы смотрите на проблему и на контракт , которому должен следовать производственный код. И тогда вы пытаетесь найти примеры для всех важных случаев, а самое главное: крайних случаев. Вы записываете их, а затем запускаете их для своей реализации.

(наиболее похоже: ваши два теста слишком просты, и вам понадобится гораздо больше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...