Подтвердить что ты не робот

Отдельные тестовые примеры для нескольких файлов в тесте google

Я новичок в платформе С++ для тестирования Google. Он довольно прост в использовании, но мне интересно, как разделить случаи на несколько тестовых файлов. Каков наилучший способ?

Включение файлов .cpp напрямую - это опция. Использование заголовка кажется, что ничего не делает...

Любая помощь приветствуется

4b9b3361

Ответ 1

Создайте один файл, который содержит только основной для запуска тестов.

// AllTests.cpp
#include "gtest/gtest.h"

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

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

// SubtractTest.cpp
#include "subtract.h"
#include "gtest/gtest.h"

TEST(SubtractTest, SubtractTwoNumbers)
{
    EXPECT_EQ(5, subtract(6, 1));
}

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

Ответ 2

Я думаю, что основной недостаток в другом ответе заключается в том, что вам нужно #include тестовые файлы.

Вот мой способ разделить тесты:

  1. Поместите тесты в файлы .h, возможно, с защитой заголовка, но не обязательно, если вы позаботитесь.
  2. Имейте одну основную программу, как определено ниже, которая включает тестовые заголовки
  3. Makefile, который компилирует + ссылки на основную тестовую программу.

Не используйте одно и то же имя для теста дважды для всех файлов!

// main_test.cc
#include <gtest/gtest.h>

#include "test_a.h"
#include "test_b.h"
#include "test_c.h"

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

Используйте Makefile из googletest и добавьте правила:

#  compiles main test program
main_test.o : main_test.cc test_a.h test_b.h test_c.h $(GTEST_HEADERS)
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o [email protected]
# links test program
main_test : main_test.o
    $(CXX) $(LDFLAGS) -L$(GTEST_LIB_DIR) $^ -lgtest_main -lpthread -o [email protected]

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

// test_a.h
#include "some_class.h"

TEST(SomeClass, aName)
{
  library::SomeClass a("v", {5,4});
  EXPECT_EQ(a.name(), "v");
}

TEST(SomeClass, bSize)
{
  library::SomeClass a("v", {5,4});
  EXPECT_EQ(a.size(0), 5);
  EXPECT_EQ(a.size(1), 4);
}

Затем вы можете запускать отдельные тесты с помощью

./main_test --gtest_filter=SomeClass.a*

Ответ 3

Я недавно столкнулся с той же проблемой.

Я заархивировал свои test_cases.o и main.o в статическую библиотеку (test_main.a), а затем связал их с другими библиотеками для окончательного выполнения.

Я заметил, что он не может найти тестовые случаи, если я связываю test_main.a.

g++ -o test test_main.a -lgtest -lpthread -lXXX

Однако, если я связываю объекты отдельно, это работает!

g++ -o test test_cases.o main.o -lgtest -lpthread -lXXX

И я нашел ответ в этом посте. Зачем создавать файл .a из .o для статических ссылок?

Есть одно важное отличие в последнем шаге ссылки. Любые объектные файлы, которые вы связали, будут включены в финальную программу. Объектные файлы, находящиеся в библиотеках, включаются только в том случае, если они помогают разрешать любые неопределенные символы в других объектных файлах. Если они этого не сделают, они не будут связаны в окончательный исполняемый файл.

Я подозревал, что это связано с дизайном Google Test.

Макрос RUN_ALL_TESTS() динамически запускает все экземпляры тестового класса, что означает, что он получил тестовые примеры во время выполнения.

В результате нет необходимости связывать экземпляры тестового класса, поэтому компоновщик не будет связывать test_case.o.