<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 4.3 使用Google Test庫進行單元測試 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-04/recipe-03 中找到,包含一個C++的示例。該示例在CMake 3.11版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。在代碼庫中,有一個支持CMake 3.5的例子。* 本示例中,我們將演示如何在CMake的幫助下使用Google Test框架實現單元測試。與前一個配置相比,Google Test框架不僅僅是一個頭文件,也是一個庫,包含兩個需要構建和鏈接的文件。可以將它們與我們的代碼項目放在一起,但是為了使代碼項目更加輕量級,我們將選擇在配置時,下載一個定義良好的Google Test,然后構建框架并鏈接它。我們將使用較新的`FetchContent`模塊(從CMake版本3.11開始可用)。第8章中會繼續討論`FetchContent`,在這里將討論模塊在底層是如何工作的,并且還將演示如何使用`ExternalProject_Add`進行模擬。此示例的靈感來自(改編自) https://cmake.org/cmake/help/v3.11/module/FetchContent.html 示例。 ## 準備工作 `main.cpp`、`sum_integers.cpp`和`sum_integers.hpp`與之前相同,修改`test.cpp`: ```c++ #include "sum_integers.hpp" #include "gtest/gtest.h" #include <vector> int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } TEST(example, sum_zero) { auto integers = {1, -1, 2, -2, 3, -3}; auto result = sum_integers(integers); ASSERT_EQ(result, 0); } TEST(example, sum_five) { auto integers = {1, 2, 3, 4, 5}; auto result = sum_integers(integers); ASSERT_EQ(result, 15); } ``` 如上面的代碼所示,我們顯式地將`gtest.h`,而不將其他Google Test源放在代碼項目存儲庫中,會在配置時使用`FetchContent`模塊下載它們。 ## 具體實施 下面的步驟描述了如何設置`CMakeLists.txt`,使用GTest編譯可執行文件及其相應的測試: 1. 與前兩個示例相比,`CMakeLists.txt`的開頭基本沒有變化,CMake 3.11才能使用`FetchContent`模塊: ```cmake # set minimum cmake version cmake_minimum_required(VERSION 3.11 FATAL_ERROR) # project name and language project(recipe-03 LANGUAGES CXX) # require C++11 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # example library add_library(sum_integers sum_integers.cpp) # main code add_executable(sum_up main.cpp) target_link_libraries(sum_up sum_integers) ``` 2. 然后引入一個`if`,檢查`ENABLE_UNIT_TESTS`。默認情況下,它為`ON`,但有時需要設置為`OFF`,以免在沒有網絡連接時,也能使用Google Test: ```cmake option(ENABLE_UNIT_TESTS "Enable unit tests" ON) message(STATUS "Enable testing: ${ENABLE_UNIT_TESTS}") if(ENABLE_UNIT_TESTS) # all the remaining CMake code will be placed here endif() ``` 3. `if`內部包含`FetchContent`模塊,聲明要獲取的新內容,并查詢其屬性: ```cmake include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.8.0 ) FetchContent_GetProperties(googletest) ``` 4. 如果內容還沒有獲取到,將嘗試獲取并配置它。這需要添加幾個可以鏈接的目標。本例中,我們對`gtest_main`感興趣。該示例還包含一些變通方法,用于使用在Visual Studio下的編譯: ```cmake if(NOT googletest_POPULATED) FetchContent_Populate(googletest) # Prevent GoogleTest from overriding our compiler/linker options # when building with Visual Studio set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) # Prevent GoogleTest from using PThreads set(gtest_disable_pthreads ON CACHE BOOL "" FORCE) # adds the targers: gtest, gtest_main, gmock, gmock_main add_subdirectory( ${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} ) # Silence std::tr1 warning on MSVC if(MSVC) foreach(_tgt gtest gtest_main gmock gmock_main) target_compile_definitions(${_tgt} PRIVATE "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" ) endforeach() endif() endif() ``` 5. 然后,使用`target_sources`和`target_link_libraries`命令,定義`cpp_test`可執行目標并指定它的源文件: ```cmake add_executable(cpp_test "") target_sources(cpp_test PRIVATE test.cpp ) target_link_libraries(cpp_test PRIVATE sum_integers gtest_main ) ``` 6. 最后,使用`enable_test`和`add_test`命令來定義單元測試: ```cmake enable_testing() add_test( NAME google_test COMMAND $<TARGET_FILE:cpp_test> ) ``` 7. 現在,準備配置、構建和測試項目: ```shell $ mkdir -p build $ cd build $ cmake .. $ cmake --build . $ ctest Test project /home/user/cmake-cookbook/chapter-04/recipe-03/cxx-example/build Start 1: google_test 1/1 Test #1: google_test ...................... Passed 0.00 sec 100% tests passed, 0 tests failed out of 1 Total Test time (real) = 0.00 sec ``` 8. 可以直接運行`cpp_test`: ```shell $ ./cpp_test [==========] Running 2 tests from 1 test case. [----------] Global test environment set-up. [----------] 2 tests from example [ RUN ] example.sum_zero [ OK ] example.sum_zero (0 ms) [ RUN ] example.sum_five [ OK ] example.sum_five (0 ms) [----------] 2 tests from example (0 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (0 ms total) [ PASSED ] 2 tests. ``` ## 工作原理 `FetchContent`模塊支持通過`ExternalProject`模塊,在配置時填充內容,并在其3.11版本中成為CMake的標準部分。而`ExternalProject_Add()`在構建時(見第8章)進行下載操作,這樣`FetchContent`模塊使得構建可以立即進行,這樣獲取的主要項目和外部項目(在本例中為Google Test)僅在第一次執行CMake時調用,使用`add_subdirectory`可以嵌套。 為了獲取Google Test,首先聲明外部內容: ```cmake include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.8.0 ) ``` 本例中,我們獲取了一個帶有特定標記的Git庫(release-1.8.0),但是我們也可以從Subversion、Mercurial或HTTP(S)源獲取一個外部項目。有關可用選項,可參考相應的`ExternalProject_Add`命令的選項,網址是https://cmake.org/cmake/help/v3.11/module/ExternalProject.html 。 調用`FetchContent_Populate()`之前,檢查是否已經使用`FetchContent_GetProperties()`命令處理了內容填充;否則,調用`FetchContent_Populate()`超過一次后,就會拋出錯誤。 `FetchContent_Populate(googletest)`用于填充源并定義`googletest_SOURCE_DIR`和`googletest_BINARY_DIR`,可以使用它們來處理Google Test項目(使用`add_subdirectory()`,因為它恰好也是一個CMake項目): ```cmake add_subdirectory( ${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} ) ``` 前面定義了以下目標:`gtest`、`gtest_main`、`gmock`和`gmock_main`。這個配置中,作為單元測試示例的庫依賴項,我們只對`gtest_main`目標感興趣: ```cmake target_link_libraries(cpp_test PRIVATE sum_integers gtest_main ) ``` 構建代碼時,可以看到如何正確地對Google Test進行配置和構建。有時,我們希望升級到更新的Google Test版本,這時需要更改的唯一一行就是詳細說明`GIT_TAG`的那一行。 ## 更多信息 了解了`FetchContent`及其構建時的近親`ExternalProject_Add`,我們將在第8章中重新討論這些命令。有關可用選項的詳細討論,可參考https://cmake.org/cmake/help/v3.11/module/FetchContent.html 。 本示例中,我們在配置時獲取源代碼,也可以將它們安裝在系統環境中,并使用`FindGTest`模塊來檢測庫和頭文件(https://cmake.org/cmake/help/v3.5/module/FindTest.html )。從3.9版開始,CMake還提供了一個Google Test模塊(https://cmake.org/cmake/help/v3.9/module/GoogleTest.html ),它提供了一個`gtest_add_tests`函數。通過搜索Google Test宏的源代碼,可以使用此函數自動添加測試。 當然,Google Test有許多有趣的的特性,可在 https://github.com/google/googletest 查看。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看