2017-08-22 1 views

Répondre

11

La structure du projet est:

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

fichiers liés à Bazel + gtest

  • WORKSPACE

Il télécharger gtest de github:

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

Vous définissez un fichier BUILD gmock défini ci-dessous:

  • gmock.BUILD

Ce fichier BUILD est responsable de compilation 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/CONSTRUISONS

Ce fichier de construction générer des tests:

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

Le fichier test /de message_test.cpp est défini par:

#include "gtest/gtest.h" 

#include "MyLib/message.hpp" 

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

Et c'est tout! Les autres fichiers sont définis comme d'habitude:

fichiers pour l'exemple de soutien

  • MyLib/CONSTRUIRE

Crée le libMyLib.so et libMyLib.a bibliothèques .

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

avec un de base message.hpp

#include <string> 

std::string get_message(); 

et le message .cpp

#include "MyLib/message.hpp" 

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

exemple.

  • bin/CONSTRUISONS

Crée le bonjour exécutable.

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

qui est:

#include "MyLib/message.hpp" 

#include <iostream> 

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

    return EXIT_SUCCESS; 
} 

Utilisation:

  • Compile toutes les cibles:

Cela permettra également télécharger gtest de son repo et compiler github il

bazel build ... 
  • Vérifie la cible de bonjour:

Vous pouvez l'exécuter avec:

bazel run bin:hello 
  • Exécution de vos tests à l'aide gtest

qui a été le principal point de cette note:

bazel test ... --test_output=errors 

Vous devriez obtenir quelque chose comme:

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. 

Reproduire les résultats

Pour votre facilité, j'ai créé un github repo contenant cet exemple. J'espère que cela fonctionne hors de la boîte.

+0

Si vous avez également besoin de fichiers de données pour vos tests, https://stackoverflow.com/questions/46100906/c-bazel-project-with-a-data-repository explique comment gérer cela. –