Я пытаюсь создать приложение, которое запускает некоторые модульные тесты с помощью GoogleTest, но тесты в тестовых файлах за пределами основного файла не обнаруживаются GoogleTest.
У меня есть 2 тестовых файла:
main_test.cpp:
#include <gtest/gtest.h>
TEST(MainTest, Test1) {
EXPECT_EQ(1,1);
}
int main(int argc, char* argv[]) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
external_test.cpp:
#include <gtest/gtest.h>
TEST(ExternalTest, Test1) {
EXPECT_EQ(1,1);
}
ExternalTest никогда не обнаруживается и не запускается, когда я пытаюсь выполнить сборку с помощью моей системы сборки.
Это команды, которые моя система сборки использует для создания этого приложения, и, по-видимому, она оптимизирует функции в external_test.cpp:
clang++ -c googletest/googletest/src/gtest-all.cc -o build/gtest -Igoogletest/googletest/include/ -Igoogletest/googletest/ -std=c++17
clang++ -c external_test.cpp -o build/external_test -Igoogletest/googletest/include/ -Igoogletest/googletest/ -std=c++17
clang++ -c main_test.cpp -o build/main_test -Igoogletest/googletest/include/ -Igoogletest/googletest/ -std=c++17
cd build
libtool -o test_app.lib main_test gtest external_test
clang++ test_app.lib
Результат:
./a.out
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from MainTest
[ RUN ] MainTest.Test1
[ OK ] MainTest.Test1 (0 ms)
[----------] 1 test from MainTest (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
Если я построю так:
clang++ -c googletest/googletest/src/gtest-all.cc -o build/gtest -Igoogletest/googletest/include/ -Igoogletest/googletest/ -std=c++17
clang++ -c external_test.cpp -o build/external_test -Igoogletest/googletest/include/ -Igoogletest/googletest/ -std=c++17
clang++ -c main_test.cpp -o build/main_test -Igoogletest/googletest/include/ -Igoogletest/googletest/ -std=c++17
cd build
clang++ external_test gtest main_test
Я получаю ожидаемый результат:
./a.out
[==========] Running 2 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 1 test from ExternalTest
[ RUN ] ExternalTest.Test1
[ OK ] ExternalTest.Test1 (0 ms)
[----------] 1 test from ExternalTest (0 ms total)
[----------] 1 test from MainTest
[ RUN ] MainTest.Test1
[ OK ] MainTest.Test1 (0 ms)
[----------] 1 test from MainTest (0 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 2 test suites ran. (0 ms total)
[ PASSED ] 2 tests.
Но наша система сборки должна сгенерировать файл lib, а затем связать его. Кроме того, если я создам некоторую функцию foo
в external_test.cpp, а затем объявлю эту функцию как extern
в main_test.cpp и вызову ее в основной функции, то все тесты будут обнаружены правильно.
Моя теория заключается в том, что libtool и clang++ каким-то образом выполняют некоторую оптимизацию времени компоновки и удаляют тесты. Я пытался добавить флаг -fno-lto
безрезультатно.
У кого-нибудь есть идеи? Любая помощь будет принята с благодарностью.
@ 273K: Я не думаю, что это libtool
виновато — это просто обычное поведение объекта за раз статических библиотек.
Попробуйте эту команду
clang++ -Wl,--whole-archive test_app.lib -Wl,--no-whole-archive
Это предотвратит отбрасывание глобальных инициализаторов, которые регистрируют наборы тестов.
Попробуйте это на macOS
clang++ -Wl,-all_load test_app.lib
Я получил следующую ошибку: ld: unknown option: --whole-archive
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Это ОС macOS?
Да, это макОС.
Ясно, к сожалению, мы хотим включить эти тесты в нашу существующую систему сборки без cmake — есть ли обходной путь?