単体テスト用のgtestを使用してBazel C++プロジェクトを作成したいと思います。
最小セットアップとは何ですか?
(コンピュータに Bazel のみがインストールされていて、Linuxで実行しています)
プロジェクトの構造は次のとおりです。
.
├── 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ファイルを定義します。
この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"],
)
このビルドファイルはテストを生成します。
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!");
}
そしてそれだけです!他のファイルは通常どおりに定義されています。
サポート例のファイル
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!";
}
例。
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 ...
あなたはそれを実行することができます:
bazel run bin:hello
それがこのメモの要点でした:
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 を作成しました。箱から出してそのまま動作することを願っています。
GoogletestがBUILDファイルを提供するようになったため、これはさらに簡単になりました。
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()
],
)