2016-10-27 4 views
0

Предположим, что мы имеем следующий класс:Как проверить методы работы с тяжелыми структурами данных с помощью Google Test?

class Graph { 
public: 

    Graph(int num_vertices, int num_edges, const EdgeList& edge_list) 
    : num_vertices_(num_vertices), num_edges_(num_edges), edge_list_(edge_list) { } 

    int GetNumberOfComponents() { ... } 

private: 
    int num_vertices_; 
    int num_edges_; 
    EdgeList edge_list; 
} 

В файле gtest.cpp у меня есть что-то вроде этого:

#include "gtest/gtest.h" 

TEST(Test, NumberOfComponentsTest) { 
    Graph graph(4, 3, {{1, 2}, {2, 3}, {1, 3}}); 
    EXPECT_EQ(2, graph.GetNumberOfComponents()); 
} 

int main(int argc, char **argv) { 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

Цель заключается в том, что проверить GetNumberOfComponents() корректно работает с использованием фреймворка тестирования Google.

Но рассмотрим большой тестовый пример, например, если num_vertices = 1000, number_edges = 100000. Как написать такой тест в этом случае, если я не хочу жестко кодировать все ребра? ;)

+0

Похоже, вы хотите, чтобы мы написали вам код. Хотя многие пользователи готовы создавать код для кодера, терпящего бедствие, они обычно помогают только тогда, когда плакат уже попытался решить проблему самостоятельно. Хорошим способом продемонстрировать это усилие является включение кода, который вы написали до сих пор, пример ввода (если есть), ожидаемого результата и выход, который вы фактически получаете (вывод консоли, трассировка и т. Д.). Чем больше деталей вы предоставляете, тем больше ответов вы получите. Проверьте [FAQ] и [ask]. –

+0

Извините, что вы правы! Я отредактирую свой вопрос. – user3524337

ответ

1

вопрос на самом деле скрывает два вопроса:

  1. Что я действительно тестирование?
  2. Предполагая, что я решил, что мне действительно нужен, чтобы протестировать края 100K, что это лучший способ сделать это?

С моей точки зрения и опыта, наиболее важным является вопрос 1:

  • ли я тестирование производительности? Тогда да, мне нужно протестировать кейс размером 100 КБ (и измерить время или использование других ресурсов).
  • Я проверяю граничные условия, и я знаю, что реализация имеет условный код вокруг краев 100 КБ? Тогда да, мне нужно проверить этот случай.
  • Я тестирую надежность или безопасность, и у меня есть причины думать, что я могу сломать тестируемую систему с краями 100 КБ? Тогда да, мне нужно проверить этот случай.
  • С другой стороны, если я «правильно» тестирую правильность, почему у меня возникает ощущение, что тестирования на, скажем, 10 ребер недостаточно, чтобы убедить себя, что реализация также будет работать для краев 100 КБ? Мне нужно ответить на этот вопрос, прежде чем продолжить.

Чтобы сделать сравнение: скажем, я тестирую функцию, которая возвращает сумму списка чисел. Скажем, у меня есть тест на списки из 0,1 и 5 элементов. Почему я должен думать, что 5 элементов не являются достаточно хорошим представителем родового случая?

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

На вопрос 2, я думаю, ответ Роббер прав, я могу только перефразировать его. Вам нужно написать как можно проще вспомогательную функцию для генерации графика во время выполнения.

Но глядя на коде, это выглядит как есть конструктивные проблемы Graph класса, которые должны быть решены до того:

  • Поскольку конструктор требует списка краев, почему он также требующего размер такого списка в параметре num_edges? Реализация может легко получить размер списка из самого списка.
  • Также факт, что требуется количество вершин, является проблематичным, всегда по той же причине, что он принимает список ребер. Количество вершин должно быть вычислено из списка ребер, иначе что произойдет, если есть противоречие между num_vertices и числом вершин, вычисленным из списка краев?

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

1

Если вы не хотите жестко закодировать большой график, вам нужен детерминированный способ генерации его во время выполнения. Чтение из файла создает зависимость файловой системы и замедляет тест.

+0

Я предполагаю, что есть подходящий способ сделать это с помощью Google Test. – user3524337