首页 > 系统相关 >13、【ubuntu】【gitlab】【gtest】流水线添加第一个测试任务

13、【ubuntu】【gitlab】【gtest】流水线添加第一个测试任务

时间:2024-12-27 14:26:22浏览次数:7  
标签:13 -- gitlab Installing gtest usr include local

背景

基于之前wiki【gitlab搭建第一个流水线】https://blog.csdn.net/nobigdeal00/article/details/144623993
将在build阶段添加构建任务,并在test阶段添加一个测试任务
demo是一个C项目,这里选用googletest作为测试框架,googletest主要是为C++设计的,C和C++同属一脉,也可以用来测试C

安装googletest

从github克隆googletest项目

git clone https://github.com/google/googletest.git

进入googletest项目,创建构建目录,进入该目录

adminpc@adminpc:~$ cd googletest
adminpc@adminpc:~/googletest$ mkdir build
adminpc@adminpc:~/googletest$ cd build

运行CMake进行配置

adminpc@adminpc:~/googletest/build$ cmake ..
-- The C compiler identification is GNU 13.3.0
-- The CXX compiler identification is GNU 13.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE  
-- Configuring done (0.4s)
-- Generating done (0.0s)
-- Build files have been written to: /home/adminpc/googletest/build

编译源码

adminpc@adminpc:~/googletest/build$ cmake --build .
[ 12%] Building CXX object googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 25%] Linking CXX static library ../lib/libgtest.a
[ 25%] Built target gtest
[ 37%] Building CXX object googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o
[ 50%] Linking CXX static library ../lib/libgmock.a
[ 50%] Built target gmock
[ 62%] Building CXX object googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
[ 75%] Linking CXX static library ../lib/libgmock_main.a
[ 75%] Built target gmock_main
[ 87%] Building CXX object googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
[100%] Linking CXX static library ../lib/libgtest_main.a
[100%] Built target gtest_main

安装googletest到系统,可以看到主要的头文件(如gtest.h)已经添加到环境变量所在路径/usr/local/include,后续写测试用例时可以直接引用该头文件

adminpc@adminpc:~/googletest/build$ sudo cmake --install .
-- Install configuration: ""
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/gmock
-- Installing: /usr/local/include/gmock/gmock-function-mocker.h
-- Installing: /usr/local/include/gmock/gmock-more-actions.h
-- Installing: /usr/local/include/gmock/gmock-cardinalities.h
-- Installing: /usr/local/include/gmock/internal
-- Installing: /usr/local/include/gmock/internal/gmock-pp.h
-- Installing: /usr/local/include/gmock/internal/gmock-port.h
-- Installing: /usr/local/include/gmock/internal/custom
-- Installing: /usr/local/include/gmock/internal/custom/README.md
-- Installing: /usr/local/include/gmock/internal/custom/gmock-generated-actions.h
-- Installing: /usr/local/include/gmock/internal/custom/gmock-matchers.h
-- Installing: /usr/local/include/gmock/internal/custom/gmock-port.h
-- Installing: /usr/local/include/gmock/internal/gmock-internal-utils.h
-- Installing: /usr/local/include/gmock/gmock-nice-strict.h
-- Installing: /usr/local/include/gmock/gmock-actions.h
-- Installing: /usr/local/include/gmock/gmock.h
-- Installing: /usr/local/include/gmock/gmock-spec-builders.h
-- Installing: /usr/local/include/gmock/gmock-more-matchers.h
-- Installing: /usr/local/include/gmock/gmock-matchers.h
-- Installing: /usr/local/lib/libgmock.a
-- Installing: /usr/local/lib/libgmock_main.a
-- Installing: /usr/local/lib/pkgconfig/gmock.pc
-- Installing: /usr/local/lib/pkgconfig/gmock_main.pc
-- Installing: /usr/local/lib/cmake/GTest/GTestTargets.cmake
-- Installing: /usr/local/lib/cmake/GTest/GTestTargets-noconfig.cmake
-- Installing: /usr/local/lib/cmake/GTest/GTestConfigVersion.cmake
-- Installing: /usr/local/lib/cmake/GTest/GTestConfig.cmake
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/gtest
-- Installing: /usr/local/include/gtest/gtest_pred_impl.h
-- Installing: /usr/local/include/gtest/gtest-assertion-result.h
-- Installing: /usr/local/include/gtest/gtest-spi.h
-- Installing: /usr/local/include/gtest/gtest.h
-- Installing: /usr/local/include/gtest/gtest-param-test.h
-- Installing: /usr/local/include/gtest/gtest-test-part.h
-- Installing: /usr/local/include/gtest/gtest-death-test.h
-- Installing: /usr/local/include/gtest/internal
-- Installing: /usr/local/include/gtest/internal/gtest-type-util.h
-- Installing: /usr/local/include/gtest/internal/gtest-port-arch.h
-- Installing: /usr/local/include/gtest/internal/gtest-death-test-internal.h
-- Installing: /usr/local/include/gtest/internal/gtest-filepath.h
-- Installing: /usr/local/include/gtest/internal/gtest-string.h
-- Installing: /usr/local/include/gtest/internal/gtest-internal.h
-- Installing: /usr/local/include/gtest/internal/custom
-- Installing: /usr/local/include/gtest/internal/custom/README.md
-- Installing: /usr/local/include/gtest/internal/custom/gtest.h
-- Installing: /usr/local/include/gtest/internal/custom/gtest-printers.h
-- Installing: /usr/local/include/gtest/internal/custom/gtest-port.h
-- Installing: /usr/local/include/gtest/internal/gtest-port.h
-- Installing: /usr/local/include/gtest/internal/gtest-param-util.h
-- Installing: /usr/local/include/gtest/gtest_prod.h
-- Installing: /usr/local/include/gtest/gtest-matchers.h
-- Installing: /usr/local/include/gtest/gtest-printers.h
-- Installing: /usr/local/include/gtest/gtest-typed-test.h
-- Installing: /usr/local/include/gtest/gtest-message.h
-- Installing: /usr/local/lib/libgtest.a
-- Installing: /usr/local/lib/libgtest_main.a
-- Installing: /usr/local/lib/pkgconfig/gtest.pc
-- Installing: /usr/local/lib/pkgconfig/gtest_main.pc

编写测试用例

项目路径下有四个关键文件
/project/main.c
/project/hello_world_api.c
/project/my_test.cpp
/project/CMakeLists.txt

main.c

该文件用来构建出可执行文件

#include <stdbool.h>

int PrintfHelloWorld(bool needPrintf);

int main(void)
{
    return PrintfHelloWorld(true);
}

hello_world_api.c

该文件用来构建出静态库,其中提供的api可以用测试用例进行测试

#include <stdio.h>
#include <stdbool.h>

int PrintfHelloWorld(bool needPrintf)
{
    if (needPrintf) {
        printf("hello world\n");
        return 0;
    }
    return 1;
}

my_test.cpp

该文件为测试用例文件,使用googletest框架进行用例编写,输出测试结果

extern "C" {
    // 声明待测函数
    int PrintfHelloWorld(bool needPrintf);
}

#include <gtest/gtest.h>

// 测试用例
TEST(helloWorld, needPrint) {
    EXPECT_EQ(PrintfHelloWorld(true), 0);
    EXPECT_EQ(PrintfHelloWorld(false), 1);
}

CMakeLists.txt

与之前wiki【gitlab搭建第一个流水线】https://blog.csdn.net/nobigdeal00/article/details/144623993里面CMakeLists.txt不同的是,添加了测试任务构建

# CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)

# 项目名称和版本
project(HelloWorld VERSION 1.0)

# 查找GoogleTest
find_package(GTest REQUIRED) # 指定组件为GTest
if (NOT GTest_FOUND)
    message(FATAL_ERROR "GoogleTest not found!")
endif()

# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加库源文件并创建静态库
add_library(hello_world_lib STATIC hello_world_api.c)

# 添加项目源文件
add_executable(hello_world main.c)

# 将库链接到主程序
target_link_libraries(hello_world hello_world_lib)

# 添加测试源文件
add_executable(my_tests my_test.cpp)

# 链接GoogleTest库
target_link_libraries(my_tests GTest::GTest GTest::Main hello_world_lib)

# 启用测试
enable_testing()

# 添加测试命令
add_test(NAME MyTests COMMAND my_tests)

# 添加对hello_world的依赖,确保它在测试之前构建
add_dependencies(my_tests hello_world)

修改pipeline描述文件

pipeline描述文件可参考之前wiki【gitlab搭建第一个流水线】https://blog.csdn.net/nobigdeal00/article/details/144623993
这里只对构建任务build-job和测试任务unit-test-job做修改

build-job:       # This job runs in the build stage, which runs first.
  stage: build
  script:
    - echo "Compiling the code..."
    - mkdir -p build && cd build
    - cmake ..
    - make
    - echo "Compile complete."
  artifacts:
    paths:
      - build/
    expire_in: 1 week  # 设置工件过期时间
  tags:
    - test

unit-test-job:   # This job runs in the test stage.
  stage: test    # It only starts when the job in the build stage completes successfully.
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - cd build
    - ./my_tests
    - echo "Code coverage is 90%"
  dependencies:
    - build-job  # 明确指定依赖于build阶段,以确保获取其工件
  tags:
    - test

CI/CD流水线中的每个阶段(job)都是在独立的环境中运行的,默认情况下它们不会共享文件系统状态,所以这里比较关键的就是artifacts和dependencies
artifacts描述了build-job阶段构建的工件哪些要传递到下一阶段,这里指定了build目录
dependencies描述了unit-test-job阶段需要依赖哪个阶段,这里指定了build-job阶段

最终效果

提交MR,触发流水线,可看到流水线执行成功
在这里插入图片描述
进去看build-job详细任务,能明显看到项目的构建过程
在这里插入图片描述
查看unit-test-job,可以看到测试用例的执行情况,这里执行是ok的
在这里插入图片描述
稍微修改下hello_world_api.c里面的返回值为2,来看下测试用例失败的场景

// hello_world_api.c
#include <stdio.h>
#include <stdbool.h>

int PrintfHelloWorld(bool needPrintf)
{
    if (needPrintf) {
        printf("hello world\n");
        return 0;
    }
    return 2;
}

提交MR,流水线可看到为failed状态
在这里插入图片描述
查看unit-test-job,可看到测试用例失败
在这里插入图片描述

标签:13,--,gitlab,Installing,gtest,usr,include,local
From: https://blog.csdn.net/nobigdeal00/article/details/144644279

相关文章

  • DP1363F是一款高度集成的非接触读写芯片,高性能、多协议NFC读卡IC
    DP1363F是一款高度集成的非接触读写芯片,集强大的多协议支持、最高射频输出功率,以及突破性技术低功耗卡片检测等优势于一身,满足市场对更高集成度、更小外壳和互操作性的需求,适用于银行、电子政务、交通、移动支付等众多基础设施应用。DP1363F支持下列操作模式:•读写模式支持ISO/......
  • 12.13博客 备战java11
    今天学习单表的增删改查中的增,这是在期末考试中一定要拿到的分数首先通过DriverManager.getConnection方法根据配置信息建立与数据库的连接。构建INSERT语句的PreparedStatement对象,其中?是占位符,后续通过setString、setInt等方法按照顺序设置对应占位符的值,这样可以......
  • 12.15博客 备战java13
    今天学习单表的增删改查中的删除操作建立数据库连接。构建DELETE语句的PreparedStatement对象,通过占位符指定要删除记录的条件(这里以ID作为条件)。执行executeUpdate方法来执行删除操作,依据返回的受影响行数判断删除是否成功。关闭相关资源,完成整个删除操作流程。我写......
  • 2024-2025-1 20241329 《计算机基础与程序设计》第十四周学习总结
    作业信息作业归属课程:2024-2025-1-计算机基础与程序设计作业要求:2024-2025-1计算机基础与程序设计第十四周作业作业目标:《C语言程序设计》第13-14章作业正文:2024-2025-120241329《计算机基础与程序设计》第十四周学习总结教材学习内容总结《C语言程序设计》第13章二进制......
  • 13. OSGI(动态模型系统)
    OSGi(OpenServiceGatewayInitiative),是面向Java的动态模型系统,是Java动态化模块化系统的一系列规范。a)动态改变构造OSGi服务平台提供在多种网络设备上无需重启的动态改变构造的功能。为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些......
  • 2024-2025-1 20241316 《计算机基础与程序设计》第十四周学习总结
    2024-2025-120241316《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标《C语言程序设计》第13-14章并完成云班课测试作......
  • # 2024-2025-1 20241310 《计算机基础与程序设计》第十四周学习总结
    2024-2025-120241310《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第一周作业这个作业的目标自学教材《C语言程序设计》第13-14章并完成云班课测......
  • 2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结
    2024-2025-120241322《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标自学教材《C语言......
  • 130. 被围绕的区域
    题目链接解题思路:通常想法是,把哪些'O'变成'X',这种想法很难做。一个比较简单点是,「哪些'O'不能变成'X'」。其实就是与第一行,最后一行,第一列,最后一列,「相邻的这些」'O',不能变成'X',其他的都能变成'X'.具体来说,把第一行、最后一行、第一列、最后一列的'O',通过「感染」函数,变成......
  • 计算机毕业设计—51328 Springboot二手交易平台APP(源码免费领)
    摘要1绪论1.1开发背景1.2开发现状1.3springboot框架介绍1.4论文结构与章节安排2 Springboot二手交易平台APP系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3操作可行性分析2.2系统流程分析2.2.1数据流程2.2.2业务流程......