web-dev-qa-db-ja.com

BazelとGTestを使用したC ++プロジェクト

単体テスト用のgtestを使用してBazel C++プロジェクトを作成したいと思います。

最小セットアップとは何ですか?

(コンピュータに Bazel のみがインストールされていて、Linuxで実行しています)

15
Picaud Vincent

プロジェクトの構造は次のとおりです。

.
├── bin
│   ├── BUILD
│   ├── hello.cpp
├── MyLib
│   ├── BUILD
│   ├── message.hpp
│   ├── message.cpp
│   ├── ... 
├── test
│   ├── BUILD
│   ├── message_test.cpp
│   ├── ... 
├── gmock.BUILD
└── WORKSPACE

Bazel + GTestに関連するファイル

  • [〜#〜]ワークスペース[〜#〜]

そこでgithubからgtestをダウンロードします:

new_git_repository(
    name = "googletest",
    build_file = "gmock.BUILD",
    remote = "https://github.com/google/googletest",
    tag = "release-1.8.0",
)

以下で定義するgmock BUILDファイルを定義します。

  • gmock.BUILD

このBUILDファイルは、gtest/gmockのコンパイルを担当します。

cc_library(
      name = "gtest",
      srcs = [
            "googletest/src/gtest-all.cc",
            "googlemock/src/gmock-all.cc",
      ],
      hdrs = glob([
          "**/*.h",
          "googletest/src/*.cc",
          "googlemock/src/*.cc",
      ]),
      includes = [
          "googlemock",
          "googletest",
          "googletest/include",
          "googlemock/include",
      ],
      linkopts = ["-pthread"],
      visibility = ["//visibility:public"],
  )

  cc_library(
      name = "gtest_main",
      srcs = ["googlemock/src/gmock_main.cc"],
      linkopts = ["-pthread"],
      visibility = ["//visibility:public"],
      deps = [":gtest"],
  )
  • test/BUILD

このビルドファイルはテストを生成します。

cc_test(
    name = "MyTest",
    srcs = glob(["**/*.cpp"]),
    deps = ["//MyLib:MyLib",
           "@googletest//:gtest_main"],
)

test/message_test.cppファイルは次のように定義されます:

#include "gtest/gtest.h"

#include "MyLib/message.hpp"

TEST(message_test,content)
{
  EXPECT_EQ(get_message(),"Hello World!");
}

そしてそれだけです!他のファイルは通常どおりに定義されています。

サポート例のファイル

  • MyLib/BUILD

libMyLib.soおよびlibMyLib.aライブラリを作成します。

cc_library(
    name="MyLib",
    hdrs=glob(["**/*.hpp"]),
    srcs=glob(["**/*.cpp"]),
    visibility = ["//visibility:public"],
)

基本的なmessage.hpp

#include <string>

std::string get_message();

およびmessage.cpp

#include "MyLib/message.hpp"

std::string get_message()
{
   return "Hello World!";
}

例。

  • bin/BUILD

hello実行可能ファイルを作成します。

cc_binary(
    name = "hello",
    srcs = ["hello.cpp"],
    deps = ["//MyLib:MyLib"],
)

それは:

#include "MyLib/message.hpp"

#include <iostream>

int main()
{
  std::cout << "\n" << get_message() << std::endl;

  return EXIT_SUCCESS;
}

用途:

  • すべてのターゲットをコンパイルします。

これにより、githubリポジトリからgtestもダウンロードされ、コンパイルされます

bazel build ...
  • Helloターゲットを確認します。

あなたはそれを実行することができます:

bazel run bin:hello
  • GTestを使用してテストを実行する

それがこのメモの要点でした:

bazel test ... --test_output=errors

あなたは次のようなものを得るはずです:

INFO: Analysed 3 targets (0 packages loaded).
INFO: Found 2 targets and 1 test target...
INFO: Elapsed time: 0.205s, Critical Path: 0.05s
INFO: Build completed successfully, 2 total actions
//test:MyTest   
PASSED in 0.0s
Executed 1 out of 1 test: 1 test passes.

結果を再現します

簡単にするために、この例を含む github repo を作成しました。箱から出してそのまま動作することを願っています。

19
Picaud Vincent

GoogletestがBUILDファイルを提供するようになったため、これはさらに簡単になりました。

WORKSPACE

git_repository(
    name = "gtest",
    remote = "https://github.com/google/googletest",
    commit = "3306848f697568aacf4bcca330f6bdd5ce671899",
)

構築中

cc_test (
    name = "hello_test",
    srcs = [
        "hello_test.cc",
    ],
    deps = [
        "@gtest//:gtest",
        "@gtest//:gtest_main" # Only if hello_test.cc has no main()
    ],
)
7
Phil