Через некоторое время мне удалось заставить это работать, для Bazel 0.16.1 и Catch2 2.4.0.
Сначала давайте создадим каталог test/
рядом с src/
, чтобы держать там наши тесты.
Чтобы использовать Catch2, нам нужно скачать catch.hpp
.Catch2 - это библиотека только для заголовков, что означает, что нам нужен только один файл.Я положил его в test/vendor/catch2/
.
Затем нам нужно определить, как его использовать.В test/vendor/catch2
мы создаем следующий файл BUILD:
cc_library(
name = "catch2",
hdrs = ["catch.hpp"],
visibility = ["//test:__pkg__"]
)
Теперь Bazel распознает Catch2 как библиотеку.Мы добавили атрибут видимости, чтобы его можно было использовать из пакета //test
(который определен BUILD в каталоге /test
).
Далее, Catch2 требует от нас определить одну единицу перевода с правильно определенным основнымметод.Следуя их инструкциям, мы создаем test/main.cpp
файл:
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
Теперь мы напишем наш тест в test/Money.test.cpp
:
#include "catch.hpp"
#include "Money.hpp"
TEST_CASE("Money works.") {
...
}
Наконец, нам нужно объяснить Bazel, какпостроить все это.Обратите внимание, что мы напрямую включили Money.hpp и catch.hpp в наши файлы без указания относительного пути, так что это также необходимо учитывать.Мы создаем следующий test/BUILD
файл:
# We describe to Bazel how to build main.cpp.
# It includes "catch.hpp" directly, so we need to add
# "-Itest/vendor/catch2" compiler option.
cc_library(
name = "catch-main",
srcs = ["main.cpp"],
copts = ["-Itest/vendor/catch2"],
deps = [
"//test/vendor/catch2"
]
)
# Here we define our test. It needs to build together with the catch2
# main that we defined above, so we add it to deps. We directly
# include src/Money.hpp and test/vendor/catch2/catch.hpp in
# Money.test.cpp, so we need to add their parent directories as copts.
# We also add Money and catch2 as dependencies.
cc_test(
name = "Money",
srcs = ["Money.test.cpp"],
copts = ["-Itest/vendor/catch2/", "-Isrc/"],
deps = [
# Or "//test/vendor/catch2:catch2", it is the same.
"//test/vendor/catch2",
"catch-main",
"//src:Money"
]
)
# Test suite that runs all the tests.
test_suite(
name = "all-tests",
tests = [
"Money"
]
)
Наконец, нам просто нужно добавить атрибут visibility
к src/BUILD
, чтобы к нему можно было получить доступ из тестов.Мы модифицируем src/BUILD
, чтобы он выглядел так:
cc_library(
name = "Money",
srcs = ["Money.cpp"],
hdrs = ["Money.hpp"],
visibility = ["//test:__pkg__"]
)
Окончательная структура файла выглядит следующим образом:
WORKSPACE
src/
Money.hpp
Money.cpp
BUILD
test/
BUILD
main.cpp
Money.test.cpp
vendor/
catch2/
catch.hpp
BUILD
Теперь вы можете запускать свои тесты с помощью bazel test //test:all-tests
!
Я создал репозиторий Github на этом примере, вы можете проверить его здесь .Я также превратил это в сообщение в блоге .