Отдельные тестовые примеры для нескольких файлов в тесте google
Я новичок в платформе С++ для тестирования Google. Он довольно прост в использовании, но мне интересно, как разделить случаи на несколько тестовых файлов. Каков наилучший способ?
Включение файлов .cpp напрямую - это опция. Использование заголовка кажется, что ничего не делает...
Любая помощь приветствуется
Ответы
Ответ 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
тестовые файлы.
Вот мой способ разделить тесты:
- Поместите тесты в файлы .h, возможно, с защитой заголовка, но не обязательно, если вы позаботитесь.
- Имейте одну основную программу, как определено ниже, которая включает тестовые заголовки
- 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.