导语
随着微服务、容器、云计算的发展,近些年 DevOps、CI/CD 等概念越来越多地映入大家的眼帘。许多开发团队都希望应用这些理念来提高软件质量和开发效率,工欲善其事必先利其器,什么样的工具才能够满足开发者的需求?TARS 作为一套优秀的开源微服务开发运营一体化平台,拥有多语言、高性能、敏捷研发、高可用等特点。那么 TARS 是否能够完美支持 DevOps 理念呢?在上一篇文章中,我们了解了如何将开源 CI 工具 Jenkins 与 TARS 集成实现 TARS 服务的自动化构建与部署。而软件测试是软件开发过程中必不可少的一步,本文将在上一篇文章的基础上,以一次完整的实践来展示如何通过 Jenkins 与 TARS 集成实现 TARS 服务的自动化单元测试。
随着微服务、容器、云计算的发展,近些年 DevOps、CI/CD 等概念越来越多地映入大家的眼帘。DevOps 是现在流行的一种软件开发方法,将持续开发、持续测试、持续集成、持续部署、持续监控等贯穿到软件开发的生命周期中,用于提高软件的开发质量,被当前几乎所有顶级公司采用。
TARS 作为一套优秀的开源微服务开发运营一体化平台,拥有多语言、高性能、敏捷研发、高可用等特点。通过将开源 CI 工具 Jenkins 与 TARS 集成即可实现针对 TARS 服务开发的自动化测试,减轻开发与测试人员的工作量。由于篇幅所限,本文仅针对自动化单元测试展开。
软件测试是软件开发过程中必不可少的一步,而单元测试是软件测试中最基础的一种形式。单元测试中,单元可以指代码中的一个模块、一个函数或者一个类;单元测试就是为每个单元编写测试用例,对该单元进行正确性检验,测试逻辑是否正确,确保每个单元的行为符合预期。因此单元测试的添加能够很大程度上降低软件或服务上线后出现问题的概率。
本文基于前文使用的 TarsCppCIDemo 项目,使用 GoogleTest 作为单元测试框架,实际项目中请根据需求选择测试框架。
GoogleTest 是 Google 开源的一套 C++ 测试框架,能够很方便的进行单元测试。接下来,我们在部署 Jenkins 的机器上安装这个框架。
GoogleTest 的 GitHub 仓库地址为: https://github.com/google/googletest,可以直接 clone
后构建安装。这里我们安装稳定版,在 GitHub 页面右侧点击 Release
可以查看历史发布的版本。本文截稿前最新版本为 1.10.0
,下载安装命令如下
wget https://github.com/google/googletest/archive/release-1.10.0.tar.gz
tar -zxvf release-1.10.0.tar.gz
cd googletest-release-1.10.0
mkdir build
cd build
cmake ..
make
make install
至此,GoogleTest 便安装完成了。
xUnit 是一个 Jenkins 平台的插件,可以用于读取单元测试的结果,支持多种测试框架,包括 GoogleTest。
打开 Jenkins 的管理页面,进入 系统管理->插件管理->可选插件
,在搜素框中搜索 xUnit
,在出现的结果中选择 xUnit plugin
,点击 直接安装
后,等待 Jenkins 安装重启即可。
现在回到我们之前创建的 Demo 项目,我们为项目的 HelloServer
添加几个接口和一个计数类,实现一个简单的计数服务。
服务的接口通过 tars
文件定义,我们编辑 Hello.tars
,为其添加三个接口,分别为增加计数、减少计数和获取当前的计数值,编辑后的 Hello.tars
如下
module TarsCppCIDemo
{
interface Hello
{
int test();
int increment(out int count);
int decrement(out int count);
int getCount(out int count);
};
};
可以看出,除了自动生成的 test
接口,我们添加了 increment
, decrement
, getCount
三个接口,三个接口均返回 count
,即计数的结果。在项目根目录 TarsCppCIDemo
中,进入 HelloServer/src
目录,我们运行脚本 tars2cpp
将 Hello.tars
转化为相应的头文件 Hello.h
。
cd HelloServer/src
/usr/local/tars/cpp/tools/tars2cpp Hello.tars
然后我们编辑接口实现文件的头文件 HelloImp.h
,在类 HelloImp
中添加三个接口的声明:
/**
* @param count out 返回计数值
* @return 服务状态码
*/
virtual int increment(int& count, tars::TarsCurrentPtr current);
/**
* @param count out 返回计数值
* @return 服务状态码
*/
virtual int decrement(int& count, tars::TarsCurrentPtr current);
/**
* @param count out 返回计数值
* @return 服务状态码
*/
virtual int getCount