国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

做外貿(mào)雨傘到什么網(wǎng)站合肥網(wǎng)絡(luò)seo推廣服務(wù)

做外貿(mào)雨傘到什么網(wǎng)站,合肥網(wǎng)絡(luò)seo推廣服務(wù),公司網(wǎng)站建設(shè)費(fèi)放什么科目,貴港做網(wǎng)站建設(shè)價(jià)格費(fèi)用前言 在ROS(Robot Operating System)中,gtest(Google Test)是一個(gè)廣泛使用的C測(cè)試框架,用于編寫和執(zhí)行單元測(cè)試。這些測(cè)試可以驗(yàn)證ROS節(jié)點(diǎn)、服務(wù)和消息等的正確性和性能。 如果我們需要在寫的包中添加測(cè)試&…

前言

????????在ROS(Robot Operating System)中,gtest(Google Test)是一個(gè)廣泛使用的C++測(cè)試框架,用于編寫和執(zhí)行單元測(cè)試。這些測(cè)試可以驗(yàn)證ROS節(jié)點(diǎn)、服務(wù)和消息等的正確性和性能。

??????? 如果我們需要在寫的包中添加測(cè)試,gtest是一個(gè)好的選擇。在ROS中使用gtest進(jìn)行單元測(cè)試的基本步驟如下:

  1. 編寫測(cè)試代碼:首先,我們需要編寫使用gtest框架的C++測(cè)試代碼。這些代碼通常位于一個(gè)單獨(dú)的ROS包中,并包含定義測(cè)試用例的TEST宏。
  2. 配置CMakeLists.txt:在我們的ROS包的CMakeLists.txt文件中,需要添加必要的gtest依賴項(xiàng)和編譯指令。這通常包括find_package(catkin REQUIRED COMPONENTS roscpp rospy gtest)來查找gtest包,以及catkin_add_gtest來添加gtest測(cè)試目標(biāo)。
  3. 構(gòu)建和運(yùn)行測(cè)試:使用ROS的構(gòu)建系統(tǒng)(如catkin或colcon)來構(gòu)建包。構(gòu)建完成后,可以使用rostestctest等命令來運(yùn)行g(shù)test測(cè)試。

?動(dòng)動(dòng)手

? ? ? ? 如果我們需要在一個(gè)基于ament_cmake的功能包中添加單元測(cè)試,可以借鑒如下方法流程。

功能包配置

源代碼

??????? 我們從test/tutorial_test.cpp里面的代碼開始。

#include <gtest/gtest.h>TEST(package_name, a_first_test)
{ASSERT_EQ(4, 2 + 2);
}int main(int argc, char** argv)
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
package.xml

??????? 添加下面的語句到package.xml

<test_depend>ament_cmake_gtest</test_depend>
CMakeLists.txt
if(BUILD_TESTING)find_package(ament_cmake_gtest REQUIRED)ament_add_gtest(${PROJECT_NAME}_tutorial_test test/tutorial_test.cpp)target_include_directories(${PROJECT_NAME}_tutorial_test PUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:include>)ament_target_dependencies(${PROJECT_NAME}_tutorial_teststd_msgs)target_link_libraries(${PROJECT_NAME}_tutorial_test name_of_local_library)
endif()

??????? 我們將測(cè)試代碼涵括在if/endif語句塊中,當(dāng)宏BUILD_TESTING為真時(shí),即編譯測(cè)試模塊。其中的ament_add_gtest函數(shù)很像add_executable,所以我們同樣需要調(diào)用target_include_directories,ament_target_dependencies和target_link_libraries來包括我們需要的文件。

構(gòu)建運(yùn)行

? ? ? ? 參見上一篇博文。其實(shí)在之前創(chuàng)建的ros2_ws工作空間路徑下(我們已經(jīng)在此空間下練習(xí)了很多例子),我們可以直接運(yùn)行colcon test命令,就會(huì)將該工作空間下的所有包都執(zhí)行了次單元測(cè)試(如果需要單獨(dú)測(cè)試某個(gè)包也可以colcon test --package-select <package_name>),也可以通過上一篇博文中的colcon test-result --all命令進(jìn)行查看結(jié)果。

? ? ? ? 在工作空間根路徑下的build文件夾下,對(duì)應(yīng)的包路徑下會(huì)生成Testing文件夾,里面包含了一些單元測(cè)試的結(jié)果或記錄文件。

?

? ? ? ? 本篇稍顯粗略,不夠詳實(shí)。一個(gè)完整的例子可以參考這里,將新包放入到工作空間src路徑下,依次執(zhí)行如下操作:

編譯構(gòu)建

$colcon build --package-select minimal_integration_test

運(yùn)行測(cè)試用例

$colcon test --packages-select minimal_integration_test

具體例子?

? ? ? ? 此例參考了cnblog上面的一篇博文。

? ? ? ? 我們?cè)谇懊娴慕坛讨幸呀?jīng)創(chuàng)建過tutorial_interfaces功能包及cpp_srvcli包,我們利用它來實(shí)現(xiàn)單元測(cè)試用例(基于客戶端/服務(wù)端的服務(wù)通信方式)。

創(chuàng)建service包?(可選)

? ? ? ? 如果之前的cpp_srvcli包還在的話,此service包可以不用再創(chuàng)建。

? ? ? ? 進(jìn)入工作空間src路徑下,執(zhí)行如下命令創(chuàng)建service包:

$ros2 pkg create --build-type ament_cmake --license Apache-2.0 service --dependencies rclcpp tutorial_interfaces

?src/service.cpp

? ? ? ? 在service包的src路徑下創(chuàng)建service.cpp文件,內(nèi)容如下:

#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/srv/add_three_ints.hpp"                                        // CHANGE#include <memory>void add(const std::shared_ptr<tutorial_interfaces::srv::AddThreeInts::Request> request,     // CHANGEstd::shared_ptr<tutorial_interfaces::srv::AddThreeInts::Response>       response)  // CHANGE
{response->sum = request->a + request->b + request->c;                                      // CHANGERCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld" " c: %ld",  // CHANGErequest->a, request->b, request->c);                                         // CHANGERCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);
}int main(int argc, char **argv)
{rclcpp::init(argc, argv);std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_three_ints_server");   // CHANGErclcpp::Service<tutorial_interfaces::srv::AddThreeInts>::SharedPtr service =               // CHANGEnode->create_service<tutorial_interfaces::srv::AddThreeInts>("add_three_ints",  &add);   // CHANGERCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add three ints.");                     // CHANGErclcpp::spin(node);rclcpp::shutdown();
}
?創(chuàng)建client包

? ? ? ? 進(jìn)入工作空間根路徑src,執(zhí)行如下命令創(chuàng)建client包:

$ros2 pkg create --build-type ament_cmake --license Apache-2.0 client --dependencies rclcpp tutorial_interfaces

?

include/client/client.h?

? ? ? ? 在client包的include路徑,創(chuàng)建client.h,內(nèi)容如下:

// client.h
#ifndef CLIENT_H
#define CLIENT_Hclass ClientHandler
{public:ClientHandler();~ClientHandler();bool sendParams(int argc, char **argv);
};
#endif
include/client/params.h?
// params.h
#ifndef PARAMS_H
#define PARAMS_Hextern int my_argc;
extern char** my_argv;#endif
src/client.cpp?
// client.cpp
#include "rclcpp/rclcpp.hpp"
#include "tutorial_interfaces/srv/add_three_ints.hpp"                                    
#include "../include/client/client.h"#include <chrono>
#include <cstdlib>
#include <memory>
#include<vector>
using namespace std;using namespace std::chrono_literals;// 構(gòu)造函數(shù)
ClientHandler::ClientHandler(){}// 析構(gòu)函數(shù)
ClientHandler::~ClientHandler(){}// 普通函數(shù)——發(fā)送參數(shù)
bool ClientHandler::sendParams(int argc, char **argv)
{rclcpp::init(argc, argv);if (argc != 4) {RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_three_ints_client X Y Z");      return false;}std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_three_ints_client");  rclcpp::Client<tutorial_interfaces::srv::AddThreeInts>::SharedPtr client =               node->create_client<tutorial_interfaces::srv::AddThreeInts>("add_three_ints");         auto request = std::make_shared<tutorial_interfaces::srv::AddThreeInts::Request>();      request->a = atoll(argv[1]);request->b = atoll(argv[2]);request->c = atoll(argv[3]);                                                             while (!client->wait_for_service(1s)) {if (!rclcpp::ok()) {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");return false;}RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");}auto result = client->async_send_request(request);// Wait for the result.if (rclcpp::spin_until_future_complete(node, result) ==rclcpp::FutureReturnCode::SUCCESS){RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Sum: %ld", result.get()->sum);} else {RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service add_three_ints");}rclcpp::shutdown();return true;
}
src/main.cpp
// main.cpp
#include "../include/client/client.h"int main(int argc, char **argv){// 注意這里: C++ 編譯器把不帶參數(shù)的構(gòu)造函數(shù)優(yōu)先認(rèn)為是一個(gè)函數(shù)聲明ClientHandler client{};client.sendParams(argc, argv);
}
單元測(cè)試文件
test/clientTest.cpp?

? ? ? ? client包根路徑下創(chuàng)建test文件夾。

// clientTest.cpp
#include "gtest/gtest.h"#include "../include/client/client.h"
#include "../include/client/params.h"TEST(ClientHandler, sendParams)
{// 測(cè)試的時(shí)候的交互方式也不能改變,既然client實(shí)際的效果是在命令行輸入?yún)?shù),// 那這里也是這樣的效果ClientHandler client{};EXPECT_EQ(true, client.sendParams(my_argc, my_argv));
}
test/main.cpp
// main.cpp
#include <gtest/gtest.h> 
// #include <gmock/gmock.h>int my_argc;
char** my_argv;int main(int argc, char** argv) {// ::testing::InitGoogleMock(&argc, argv);// 注意這里使用的是Gtest,不是Gmock::testing::InitGoogleTest(&argc, argv); // Runs all tests using Google Test.my_argc = argc;my_argv = argv;return RUN_ALL_TESTS();
}
CMakeLists.txt?
cmake_minimum_required(VERSION 3.8)
project(client)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tutorial_interfaces REQUIRED)set(SRCsrc/client.cppsrc/main.cpp
)add_executable(client ${SRC})
ament_target_dependencies(clientrclcpp tutorial_interfaces)# 5. 添加當(dāng)前項(xiàng)目中的頭文件 注意有順序的要求,不能亂
target_include_directories(clientPRIVATE ${PROJECT_SOURCE_DIR}/include
)# 如果是測(cè)試代碼
if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# 加入gtest包find_package(ament_cmake_gtest REQUIRED)# the following line skips the linter which checks for copyrights# uncomment the line when a copyright and license is not present in all source files# set(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# uncomment the line when this package is not in a git repo# set(ament_cmake_cpplint_FOUND TRUE)set(TESTtest/main.cpptest/clientTest.cpp)# 生成加入gtest的test執(zhí)行文件。${PROJECT_NAME}_test為自定義的test執(zhí)行文件名稱;test/demo_test.cpp為test源碼路徑# 注意這里導(dǎo)包的時(shí)候,不再需要將 .h 文件導(dǎo)入進(jìn)來,因?yàn)樵?client.cpp中已經(jīng)導(dǎo)入了我們需要使用到的.h文件# 另外,注意這里不能導(dǎo)入開發(fā)代碼中的 main.cpp,因?yàn)橐呀?jīng)有了一個(gè)測(cè)試的main.cppament_add_gtest(${PROJECT_NAME}_test ${TEST} src/client.cpp)# 務(wù)必注意這里需要添加的依賴包ament_target_dependencies(${PROJECT_NAME}_test rclcpp tutorial_interfaces)install(TARGETS${PROJECT_NAME}_test# 將生成的test執(zhí)行文件安裝到DESTINATION后的路徑下DESTINATION lib/${PROJECT_NAME})                                       ament_lint_auto_find_test_dependencies()
endif()install(TARGETSclientDESTINATION lib/${PROJECT_NAME})# 設(shè)置編譯構(gòu)建類型為 調(diào)試 模式
set(CMAKE_BUILD_TYPE Debug)   
# 生成覆蓋率文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")ament_package()
package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>client</name><version>0.0.0</version><description>client test</description><maintainer email="mike@qq.com">zhi</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><depend>rclcpp</depend><depend>tutorial_interfaces</depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>
構(gòu)建client包

? ? ? ? 回到工作空間根路徑,構(gòu)建client.

$colcon build --packages-select client

? ? ? ? ?在工作空間根路徑build/client路徑下(install/client/lib路徑下同樣生成),如果正常,會(huì)有client_test可執(zhí)行文件生成。

?運(yùn)行測(cè)試

? ? ? ? 我們可以直接運(yùn)行前面創(chuàng)建的cpp_srvcli包里的server節(jié)點(diǎn)作為服務(wù)端(或者構(gòu)建上面寫的service包)。另開一個(gè)終端,運(yùn)行之前記得配置下環(huán)境(source install/setup.bash)。

$ros2 run cpp_srvcli server

? ? ? ? ?再運(yùn)行client_test。

$./build/client/client_test 23 3 5

? ? ? ? 上圖右側(cè)的終端窗口可以看到測(cè)試PASSED,至此一個(gè)客戶端的單元測(cè)試完成。?

???????對(duì)于單元測(cè)試的知識(shí)點(diǎn)其實(shí)挺多的,一時(shí)確實(shí)無法都掌握,一篇內(nèi)容也不能都概括,當(dāng)前我們也只需了解一個(gè)基本的用法即可,后面隨著實(shí)際碰到的問題越來越多,再根據(jù)具體的問題鉆研下去,掌握到的知識(shí)點(diǎn)也就會(huì)水漲船高了。

本篇完。

http://www.aloenet.com.cn/news/32366.html

相關(guān)文章:

  • 網(wǎng)站在線客服系統(tǒng)搭建seo實(shí)戰(zhàn)培訓(xùn)視頻
  • php做電商網(wǎng)站app推廣接單平臺(tái)
  • 河南平臺(tái)網(wǎng)站建設(shè)找哪家怎樣進(jìn)行seo推廣
  • 網(wǎng)站開發(fā)公司云鯨互創(chuàng)怎么聯(lián)系百度搜索廣告投放
  • 免費(fèi)品牌網(wǎng)站制作百度網(wǎng)絡(luò)營(yíng)銷
  • 溫州網(wǎng)站建設(shè)首選龍誠(chéng)互聯(lián)網(wǎng)絡(luò)營(yíng)銷策略主要包括
  • 青島紀(jì)委網(wǎng)站廉政建設(shè)準(zhǔn)考證他達(dá)拉非片正確服用方法
  • 網(wǎng)站上的qq咨詢?cè)趺醋鏊阉饕嬖诰€觀看
  • 建設(shè)銀行面試通知網(wǎng)站2024最火的十大新聞?dòng)心男?/a>
  • 做惡搞網(wǎng)站軟件下載網(wǎng)絡(luò)營(yíng)銷課程學(xué)什么
  • 網(wǎng)牛網(wǎng)站建設(shè)東莞今天新增加的情況
  • 上海閔行天氣連云港seo優(yōu)化公司
  • 天津網(wǎng)站制作機(jī)玩法部百度指數(shù)的需求指數(shù)
  • 98同城招聘網(wǎng)信息seo課堂
  • 大連商城網(wǎng)站建設(shè)產(chǎn)品推廣網(wǎng)站
  • 網(wǎng)頁(yè)三劍客的網(wǎng)頁(yè)制作軟件是seo資料站
  • 免費(fèi)的中文logo網(wǎng)站sem投放
  • 網(wǎng)站開源系統(tǒng)免費(fèi)網(wǎng)站建設(shè)seo
  • 營(yíng)銷qq和企業(yè)qq區(qū)別深圳專門做seo的公司
  • 網(wǎng)站建設(shè)英文怎么說百度一下你就知道官網(wǎng)網(wǎng)址
  • 成都商城網(wǎng)站建設(shè)地址推廣網(wǎng)頁(yè)怎么做的
  • 西安網(wǎng)站制作公司排名口碑營(yíng)銷屬于什么營(yíng)銷
  • 西部數(shù)碼網(wǎng)站助手4.0運(yùn)營(yíng)商推廣5g技術(shù)
  • 初學(xué)網(wǎng)站開發(fā)書籍關(guān)鍵詞歌曲歌詞
  • 濟(jì)南網(wǎng)站建設(shè)培訓(xùn)學(xué)校百度首頁(yè)推薦關(guān)不掉嗎
  • 手機(jī)網(wǎng)站底部代碼北京seo網(wǎng)站管理
  • 網(wǎng)站開發(fā)z億瑪酷1流量訂制怎么做信息流廣告代理商
  • 海珠區(qū)建網(wǎng)站公司著名的網(wǎng)絡(luò)營(yíng)銷案例
  • 怎么用模板做網(wǎng)站云南seo
  • 做網(wǎng)站 圖片素材怎么找智能建站系統(tǒng)