Как настроить Catch2 в проекте Bazel - PullRequest
0 голосов
/ 03 октября 2018

Я запустил простой проект на C ++, который использует Bazel в качестве системы сборки и хотел бы добавить Catch2 к нему в качестве тестовой среды.

Вот так выглядит мой проект:

WORKSPACE -> empty file
src/
  Money.hpp
  Money.cpp
BUILD

где BUILD просто

cc_library(
  name = "Money",
  srcs = ["Money.cpp"],
  hdrs = ["Money.hpp"]
)

Я хотел бы иметь возможность создавать тесты для каждой библиотеки cc_library, в данном случае для денег.Я попытался настроить его, но запутался с Catch2 main.Любой совет о том, как сделать это лучше всего ценится!

1 Ответ

0 голосов
/ 03 октября 2018

Через некоторое время мне удалось заставить это работать, для 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 на этом примере, вы можете проверить его здесь .Я также превратил это в сообщение в блоге .

...