基于gtest/gmock/mockcpp的单元测试探索

这篇具有很好参考价值的文章主要介绍了基于gtest/gmock/mockcpp的单元测试探索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文整体内容参考https://www.cnblogs.com/heimianshusheng/p/13530672.html(后面统一称为"引文"),在实际调试中发现了一些问题并予以解决,记录一下方便自己和同道中人查阅。

目的

  • 通过实例演练学习使用gtest对C语言编写的程序进行单元测试
  • 学习如何用mockcpp对C语言的函数进行mock

准备工作

版本信息

admin@osu-2:~$ cat /etc/issue
Ubuntu 20.04 LTS \n \l

admin@osu-2:~$ 
admin@osu-2:~$ gcc -v
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 
admin@osu-2:~$ 
admin@osu-2:~$ g++ -v
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 
admin@osu-2:~$ 
admin@osu-2:~$ cmake --version
cmake version 3.16.3

安装gtest

*GitHub上的googletest有很多release的版本。最新的版本对编译器的版本1.12要求较高( 不低于C++14),所以选取v1.8.1文章来源地址https://www.toymoban.com/news/detail-419993.html

admin@osu-2:~$ mkdir try_gtest
admin@osu-2:~$ cd try_gtest/
admin@osu-2:~/try_gtest$ 
admin@osu-2:~/try_gtest$ git clone https://github.com/google/googletest 
admin@osu-2:~/try_gtest$ cd googletest/
admin@osu-2:~/try_gtest/googletest$ git checkout release-1.8.1
admin@osu-2:~/try_gtest/googletest$ git branch
* (HEAD detached at release-1.8.1)
  main
admin@osu-2:~/try_gtest/googletest$ 
  • 编译
admin@osu-2:~/try_gtest/googletest$ mkdir build
admin@osu-2:~/try_gtest/googletest$ cd build/
admin@osu-2:~/try_gtest/googletest/build$ cmake ..
admin@osu-2:~/try_gtest/googletest/build$ make
  • 确认编出了四个.a文件
admin@osu-2:~/try_gtest/googletest/build$ find . -name "*.a"
./googlemock/libgmock.a
./googlemock/libgmock_main.a
./googlemock/gtest/libgtest_main.a
./googlemock/gtest/libgtest.a
admin@osu-2:~/try_gtest/googletest/build$ 
  • 直接安装了,省的后面编译的时候还要指定这些.a文件的路径
admin@osu-2:~/try_gtest/googletest/build$ sudo make install

安装mockcpp

  • 下载后解压缩
admin@osu-2:~/try_gtest$ wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/mockcpp/mockcpp-2.6.tar.gz
admin@osu-2:~/try_gtest$ tar -zxvf mockcpp-2.6.tar.gz 
  • 为了编译成功,需要修改mockcpp.h,新加include typeinfo,注释掉template 相关内容
admin@osu-2:~/try_gtest/mockcpp$ cp include/mockcpp/mockcpp.h  include/mockcpp/mockcpp.h_bak 
admin@osu-2:~/try_gtest/mockcpp$ 
admin@osu-2:~/try_gtest/mockcpp$ vim  include/mockcpp/mockcpp.h  
admin@osu-2:~/try_gtest/mockcpp$ 
admin@osu-2:~/try_gtest/mockcpp$ 
admin@osu-2:~/try_gtest/mockcpp$ diff -ruN include/mockcpp/mockcpp.h_bak include/mockcpp/mockcpp.h
--- include/mockcpp/mockcpp.h_bak       2023-01-14 15:31:04.076954592 +0800
+++ include/mockcpp/mockcpp.h   2023-01-14 15:31:47.389499701 +0800
@@ -19,6 +19,7 @@
 #ifndef __MOCKCPP_H
 #define __MOCKCPP_H
 
+#include <typeinfo>
 
 #if !defined(MOCKCPP_NO_NAMESPACE) || (MOCKCPP_NO_NAMESPACE == 0)
 # define MOCKCPP_NS mockcpp
@@ -55,11 +56,11 @@
 
 #endif
 
-template <bool condition>
-struct static_assert
-{
-    typedef int static_assert_failure[condition ? 1 : -1];
-};
+//template <bool condition>
+//struct static_assert
+//{
+//    typedef int static_assert_failure[condition ? 1 : -1];
+//};
 
 
 #endif // __MOCKCPP_H
admin@osu-2:~/try_gtest/mockcpp$ 
  • 指定从mockcpp/src能够找到googoletest/include的路径
admin@osu-2:~/try_gtest/mockcpp/src$ ls -l ../../googletest/googletest/include/
total 4
drwxrwxr-x 3 admin admin 4096 1月  14 15:00 gtest
admin@osu-2:~/try_gtest/mockcpp/src$ xunit_home='../../googletest/googletest'
admin@osu-2:~/try_gtest/mockcpp/src$ cd ..
admin@osu-2:~/try_gtest/mockcpp$ 
  • 带参数执行cmake
 admin@osu-2:~/try_gtest/mockcpp$ cmake -DMOCKCPP_XUNIT=gtest -DMOCKCPP_XUNIT_HOME=$xunit_home ./
  • 如果make如下报错
 admin@osu-2:~/try_gtest/mockcpp$ make 
[  1%] Generating ../include/mockcpp/DelegatedMethodGetDef.h
Traceback (most recent call last):
  File "/home/admin/try_gtest/mockcpp/src/generate_vtbl_related_files.py", line 5, in <module>
    from get_long_opt import *
  File "/home/admin/try_gtest/mockcpp/src/get_long_opt.py", line 29
    print sys.argv[0], getUsageString(longOpts)
          ^
SyntaxError: invalid syntax
make[2]: *** [src/CMakeFiles/vtbl_related_headers.dir/build.make:65: include/mockcpp/DelegatedMethodGetDef.h] Error 1
make[1]: *** [CMakeFiles/Makefile2:123: src/CMakeFiles/vtbl_related_headers.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
admin@osu-2:~/try_gtest/mockcpp$ 
  • 可以看到报错的python print是按照python2的格式写的,Ubuntu20默认没有Python2,那就安装一下
admin@osu-2:~/try_gtest$ sudo apt install python -y

admin@osu-2:~/try_gtest$ sudo rm -f /usr/bin/python
admin@osu-2:~/try_gtest$ sudo ln -s /usr/bin/python2 /usr/bin/python
  • 删除 CMakeCache.txt后重新cmake
admin@osu-2:~/try_gtest/mockcpp$ rm CMakeCache.txt 
admin@osu-2:~/try_gtest/mockcpp$ 
admin@osu-2:~/try_gtest/mockcpp$ 
admin@osu-2:~/try_gtest/mockcpp$ cmake -DMOCKCPP_XUNIT=gtest -DMOCKCPP_XUNIT_HOME=$xunit_home ./
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PythonInterp: /usr/bin/python (found version "2.7.18") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/admin/try_gtest/mockcpp
admin@osu-2:~/try_gtest/mockcpp$ 
  • 编译应该就不会报错了,再安装一下
admin@osu-2:~/try_gtest/mockcpp$ make

admin@osu-2:~/try_gtest/mockcpp$ sudo make install

需要测试的C代码

  • 目录结构
admin@osu-2:~/try_gtest/GtestLearn$ tree
.
├── CMakeLists.txt
├── func.c
├── include
│   ├── ex_func.c
│   ├── ex_func.h
│   └── func.h
└── main.c

1 directory, 5 files
admin@osu-2:~/try_gtest/GtestLearn$ 
  • 代码内容(CMakeLists.txt的内容对比引文有删减)
admin@osu-2:~/try_gtest/GtestLearn$ cat CMakeLists.txt 
cmake_minimum_required(VERSION 3.15)
project(GtestLearn C)

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "${CAMKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/)
set(SOURCE_FILES
    main.c
    include/func.h
    func.c
    include/ex_func.h
    include/ex_func.c)

add_executable(GtestLearn ${SOURCE_FILES})
target_link_libraries(GtestLearn ${LIBRARIES})
admin@osu-2:~/try_gtest/GtestLearn$ 
admin@osu-2:~/try_gtest/GtestLearn$ 
============================================
admin@osu-2:~/try_gtest/GtestLearn$ cat func.c 
#include <stdio.h>
#include "ex_func.h"
#include "func.h"

int add(int a, int b)
{
    printf("start to compute the sum of a %d and b %d\n", a, b);
    return a + b;
}

int multi(int a, int b)
{
    printf("start to compute the multi of a %d and b %d\n", a, b);
    return a * b;
}

int add_struct(struct test_t *test)
{
    int sum;
    int multi_v;

    printf("start to compute the sum of a %d and b %d\n", test->a, test->b);

    sum = test->a + test->b;
    multi_v = multi(test->a, test->b);
    if (sum > multi_v) {
        return sum;
    }

    return multi_v;
}

int test_struct_func(struct test_t *test)
{
    if (test->p_func == NULL) {
        printf("get null func pointer\n");
        return 0xFFFF;
    }
    printf("start to run test_struct_func with a %d b %d\n", test->a, test->b);
    return test->p_func(test);
}

int test_stub_func()
{
    int ret;
    int a = 0;

    ret = ex_get_value(&a);
    if (ret == 0xFFFF) {
        printf("get extern value failed, ret %d\n", ret);
        return ret;
    }

    printf("get extern value succeed, ex value %d\n", a);
    return ret;
}
admin@osu-2:~/try_gtest/GtestLearn$ 
admin@osu-2:~/try_gtest/GtestLearn$ 
============================================
admin@osu-2:~/try_gtest/GtestLearn$ cat main.c 
#include <stdio.h>
#include "func.h"

int main(int argc, char **argv) {
    int ret = 0;
    struct test_t test;

    ret = add(1, 2);
    printf("Get add result: %d\n", ret);

    test.a = 10;
    test.b = 12;
    ret = add_struct(&test);
    printf("Get add struct result: %d\n", ret);

    test.p_func = NULL;
    ret = test_struct_func(&test);
    printf("Get test struct result: %d\n", ret);

    ret = test_stub_func();
    printf("Get test stub func result: %d\n", ret);

    return 0;
}
admin@osu-2:~/try_gtest/GtestLearn$ 
============================================
admin@osu-2:~/try_gtest/GtestLearn$ cat include/ex_func.h
#ifndef GTESTLEARN_EX_FUNC_H
#define GTESTLEARN_EX_FUNC_H
int ex_get_value(int *a);
#endif //GTESTLEARN_EX_FUNC_H
admin@osu-2:~/try_gtest/GtestLearn$ 
============================================
admin@osu-2:~/try_gtest/GtestLearn$ cat include/ex_func.c
#include "ex_func.h"

int ex_get_value(int *a)
{
    *a = 101010;
    return 0;
}
admin@osu-2:~/try_gtest/GtestLearn$ 
============================================
admin@osu-2:~/try_gtest/GtestLearn$ cat include/func.h
#ifndef GTESTLEARN_FUNC_H
#define GTESTLEARN_FUNC_H

struct test_t {
    int a;
    int b;
    int (*p_func)(struct test_t *test);
};

int add(int a, int b);
int multi(int a, int b);
int add_struct(struct test_t *test);
int test_struct_func(struct test_t *test);
int test_stub_func();

#endif //GTESTLEARN_FUNC_H
admin@osu-2:~/try_gtest/GtestLearn$ 
  • 编译并执行编译出的可执行文件
admin@osu-2:~/try_gtest/GtestLearn$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/admin/try_gtest/GtestLearn
admin@osu-2:~/try_gtest/GtestLearn$ 
admin@osu-2:~/try_gtest/GtestLearn$ 
admin@osu-2:~/try_gtest/GtestLearn$ make
Scanning dependencies of target GtestLearn
[ 25%] Building C object CMakeFiles/GtestLearn.dir/main.c.o
[ 50%] Building C object CMakeFiles/GtestLearn.dir/func.c.o
[ 75%] Building C object CMakeFiles/GtestLearn.dir/include/ex_func.c.o
[100%] Linking C executable GtestLearn
[100%] Built target GtestLearn
admin@osu-2:~/try_gtest/GtestLearn$ 
admin@osu-2:~/try_gtest/GtestLearn$ ./GtestLearn 
start to compute the sum of a 1 and b 2
Get add result: 3
start to compute the sum of a 10 and b 12
start to compute the multi of a 10 and b 12
Get add struct result: 120
get null func pointer
Get test struct result: 65535
get extern value succeed, ex value 101010
Get test stub func result: 0
admin@osu-2:~/try_gtest/GtestLearn$ 

单元测试

  • 针对上面的GtestLearn项目编写gtest/gmock测试用例并且编译执行(被测代码是C,测试用例是C++)
  • 目录架构
admin@osu-2:~/try_gtest$ cd GtestLearnLLT
admin@osu-2:~/try_gtest/GtestLearnLLT$ tree
.
├── CMakeLists.txt
├── gtest_ut.cpp
├── main.cpp
└── stubs
    └── my_stubs.c

1 directory, 4 files
admin@osu-2:~/try_gtest/GtestLearnLLT$ 
  • 文本内容如下
admin@osu-2:~/try_gtest/GtestLearnLLT$ cat CMakeLists.txt 
cmake_minimum_required(VERSION 3.15)
project(GtestLearnLLT)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 -pthread -fprofile-arcs -ftest-coverage")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCONFIG_LLT -fprofile-arcs -ftest-coverage")

include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/../GtestLearn/include/
        ${CMAKE_CURRENT_SOURCE_DIR}/stubs/)

set(SRC_FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/../GtestLearn/func.c
        ${CMAKE_CURRENT_SOURCE_DIR}/../GtestLearn/main.c
        ${CMAKE_CURRENT_SOURCE_DIR}/stubs/my_stubs.c
        gtest_ut.cpp
        main.cpp)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")

add_executable(GtestLearnLLT ${SRC_FILES})
target_link_libraries(GtestLearnLLT libmockcpp.a libgmock.a libgtest.a)
admin@osu-2:~/try_gtest/GtestLearnLLT$ 
============================================
admin@osu-2:~/try_gtest/GtestLearnLLT$ cat gtest_ut.cpp 
extern "C" {
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
}

#include <limits.h>
#include <mockcpp/mockcpp.hpp>
#include "gmock/gmock.h"
#include "gtest/gtest.h"

// using namespace std;
using namespace testing;

class GtestUt : public testing::Test
{
protected:
    void SetUp() override
    {
        std::cout << "--Gtest_Ut SetUP--" << std::endl;
    }

    void TearDown() override
    {
        std::cout << "--Gtest_Ut TearDown--" << std::endl;
    }
};

class Mock_FOO {
public:
    MOCK_METHOD1(mock_test_struct_func, int(struct test_t *test));
};

Mock_FOO mocker;

int mock_test_struct_func(struct test_t *test)
{
    return mocker.mock_test_struct_func(test);
}

TEST_F(GtestUt, ut_add_01)
{
    int ret;

    ret = add(1, 2);
    EXPECT_EQ(3, ret);
}

TEST_F(GtestUt, ut_add_02)
{
    int ret;
    struct test_t test;

    test.a = 5;
    test.b = 5;

    MOCKER(multi)
    .expects(atMost(20))
    .will(returnValue(8));
    ret = add_struct(&test);
    EXPECT_EQ(ret, 10);
    GlobalMockObject::verify();
}

TEST_F(GtestUt, ut_add_03)
{
    int ret;
    struct test_t test;

    test.a = 10;
    test.b = 11;

    MOCKER(multi)
    .expects(atMost(20))
    .will(returnValue(20));
    ret = add_struct(&test);
    EXPECT_EQ(ret, 21);
    GlobalMockObject::verify();
}

TEST_F(GtestUt, ut_add_04)
{
    int ret;
    int a, b;
    struct test_t test;

    test.a = 10;
    test.b = 11;
    test.p_func = mock_test_struct_func;
    EXPECT_CALL(mocker, mock_test_struct_func(&test)).WillRepeatedly(Return(10));

    ret = test_struct_func(&test);
    EXPECT_EQ(ret, 10);
    GlobalMockObject::verify();
}

TEST_F(GtestUt, ut_add_05)
{
    int ret;
    int ex_value;

    ret = test_stub_func();
    EXPECT_EQ(ret, 1011);
}
admin@osu-2:~/try_gtest/GtestLearnLLT$ 
admin@osu-2:~/try_gtest/GtestLearnLLT$ 
============================================
admin@osu-2:~/try_gtest/GtestLearnLLT$ cat main.cpp
#include <stdio.h>
#include "gtest/gtest.h"

GTEST_API_ int main(int argc, char **argv) {
    printf("Running main() from gtest_main.cc\n");
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
admin@osu-2:~/try_gtest/GtestLearnLLT$ 
admin@osu-2:~/try_gtest/GtestLearnLLT$ 
============================================
admin@osu-2:~/try_gtest/GtestLearnLLT$ cat stubs/my_stubs.c 
#include <stdio.h>
#include "ex_func.h"

int ex_get_value(int *a)
{
    if (a == NULL) {
        printf("get null pointer %p\n", a);
        return 0xFFFF;
    }
    *a = 1011;
    printf("run stub func, get value %d\n", *a);
    return *a;
}
admin@osu-2:~/try_gtest/GtestLearnLLT$ 
  • 标准编译流程
admin@osu-2:~/try_gtest/GtestLearnLLT$ mkdir build
admin@osu-2:~/try_gtest/GtestLearnLLT$ cd build/
admin@osu-2:~/try_gtest/GtestLearnLLT/build$ cmake ..
admin@osu-2:~/try_gtest/GtestLearnLLT/build$ make
  • 执行编出的可执行文件(先忽略最后的报错了)
admin@osu-2:~/try_gtest/GtestLearnLLT/build$ ../bin/GtestLearnLLT 
Running main() from gtest_main.cc
[==========] Running 5 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 5 tests from GtestUt
[ RUN      ] GtestUt.ut_add_01
--Gtest_Ut SetUP--
start to compute the sum of a 1 and b 2
--Gtest_Ut TearDown--
[       OK ] GtestUt.ut_add_01 (0 ms)
[ RUN      ] GtestUt.ut_add_02
--Gtest_Ut SetUP--
start to compute the sum of a 1 and b 1
--Gtest_Ut TearDown--
[       OK ] GtestUt.ut_add_02 (0 ms)
[ RUN      ] GtestUt.ut_add_03
--Gtest_Ut SetUP--
start to compute the sum of a 10 and b 11
--Gtest_Ut TearDown--
[       OK ] GtestUt.ut_add_03 (0 ms)
[ RUN      ] GtestUt.ut_add_04
--Gtest_Ut SetUP--
start to run test_struct_func with a 10 b 11
--Gtest_Ut TearDown--
[       OK ] GtestUt.ut_add_04 (0 ms)
[ RUN      ] GtestUt.ut_add_05
--Gtest_Ut SetUP--
run stub func, get value 1011
get extern value succeed, ex value 1011
--Gtest_Ut TearDown--
[       OK ] GtestUt.ut_add_05 (0 ms)
[----------] 5 tests from GtestUt (0 ms total)

[----------] Global test environment tear-down
[==========] 5 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 5 tests.

/home/admin/try_gtest/GtestLearnLLT/gtest_ut.cpp:90: ERROR: this mock object (used in test GtestUt.ut_add_04) should be deleted but never is. Its address is @0x5583cb6f00c0.
ERROR: 1 leaked mock object found at program exit. Expectations on a mock object is verified when the object is destructed. Leaking a mock means that its expectations aren't verified, which is usually a test bug. If you really intend to leak a mock, you can suppress this error using testing::Mock::AllowLeak(mock_object), or you may use a fake or stub instead of a mock.
admin@osu-2:~/try_gtest/GtestLearnLLT/build$ 

测试用例分析

ut_add_01(不需要mock的普通函数)

  • 测试步骤
TEST_F(GtestUt, ut_add_01)
{
    int ret;

    ret = add(1, 2);
    EXPECT_EQ(3, ret);
}
  • 不需要mock,就是验证func.c中的add函数,通过gtest的EXPECT_EQ来断言结果应该是3

ut_add_02(使用mockcpp来mock一般C函数)

  • 测试步骤
TEST_F(GtestUt, ut_add_02)
{
    int ret;
    struct test_t test;

    test.a = 5;
    test.b = 5;

    MOCKER(multi)
    .expects(atMost(20))
    .will(returnValue(8));
    ret = add_struct(&test);
    EXPECT_EQ(ret, 10);
    GlobalMockObject::verify();
}
  • 如果不mock
    • multi函数本来是做两个输入值的乘法5*5=25,
    • add_struct是比较两个数的和与积,然后返回和与积中较大的,5+5=10<25
    • 因此add_struct应该返回25
  • 通过mock
    • 将multi(5,5)的值人为替换为8,结果8<10
    • 这样add_struct的返回值就不是25,而应该是10了

到了这里,关于基于gtest/gmock/mockcpp的单元测试探索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 玩转单元测试之gtest

    程序开发的时候,往往需要编写一些测试样例来完成功能测试,以保证自己的代码在功能上符合预期,能考虑到一些异常边界问题等等。 1.引入gtest 2.编写第一个单测 2.1 待测试文件 2.2 单测文件 2.3 makefile文件 make ./hello_unit_test 编译并执行单测程序,执行结果如下: 1. 各种断

    2024年02月12日
    浏览(25)
  • Linux 单元测试学习过程 (1)——gtest

    软件开发完成后需要对代码进行测试,生成测试报告,因此开始学习单元测试。本文基于QT和Linux进行学习。学习目的就是生成测试报告。整个学习过程主要围绕“1.怎么进行单元测试”、“2.怎么生成测试过程的结果文件”、“3.怎么生成代码覆盖率报告”。 1.使用gtest进行单

    2024年02月05日
    浏览(71)
  • C++单元测试Gtest+Stub攻略

    笔者环境为linux环境(deepin),以下均在此环境进行 Gtest源码链接 Stub源码链接 StubExt源码链接 Stub的使用方法在cpp-stub/README_zh.md中有讲解 StubExt的使用方法在 cpp-stub-ext/ README.md中有讲解 StubExt可支持Lambda表达式进行打桩写Gtest时如果想获取一个固定的返回值或者出参十分好用 搭建环

    2024年02月10日
    浏览(34)
  • cmake应用:集成gtest进行单元测试

    编写代码有bug是很正常的,通过编写完备的单元测试,可以及时发现问题,并且在后续的代码改进中持续观测是否引入了新的bug。对于追求质量的程序员,为自己的代码编写全面的单元测试是必备的基础技能,在编写单元测试的时候也能复盘自己的代码设计,是提高代码质量

    2024年02月13日
    浏览(32)
  • CMake项目使用ctest+gtest进行单元测试

    随着CMake工具越来越强大便捷,越来越多的C/C++项目转而使用CMake来进行编译管理,它还提供了用于测试的ctest命令来执行项目中编写的单元测试。 本文就以一个实例来介绍如何使用ctest来进行单元测试。 本文实例环境VSCode+MinGW64+CMake+gtest。 需要在MinGW中安装gtest,如果没有安装

    2024年02月05日
    浏览(32)
  • C++中的断言机制与gtest单元测试

       这部分内容网上已经有很多人讲了,我就不做重复性工作,制造垃圾了,大家看看下面两个链接就可以了,因为我的专栏除了分享自己学习的知识,主要想为大家提供完整学习路线,让大家的知识体系更加完善! (1)参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (1)参考:

    2023年04月08日
    浏览(87)
  • 手把手教你使用gtest写单元测试

    开源框架:gtest,它主要用于写单元测试,检查真自己的程序是否符合预期行为。这不是QA(测试工程师)才学的,也是每个优秀后端开发codoer的必备技能。 本期博文内容及使用的demo,参考: Googletest Basic Guide[1] Googletest Samples [2] 构建依赖环境 按照惯例,先介绍下怎么基于

    2024年02月16日
    浏览(36)
  • 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

    目录 一、前言 二、从TEST宏开始 三、回过头看看TEST宏的定义 四、再来了解RUN_ALL_TESTS宏 四、总结 “深入解析”对我来说的确有些难度,所以我尽量将我学习到和观察到的gtest内部实现介绍给大家。本文算是抛砖引玉吧,只能是对gtest的整体结构的一些介绍,想要了解更多细节

    2024年02月11日
    浏览(40)
  • 单元测试gtest的安装与使用方法【结合官网的sample】

    gtest单元测试是Google的一套用于编写 C++测试的框架 ,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等。 好的测试应该有下面的这

    2024年02月10日
    浏览(30)
  • cmake + gtest安装使用 C++单元测试 gcov locv代码覆盖率

    CMakeLists.txt速查简单编写 打开–g3 选项,去掉-O2以上级别的代码优化选项;否则编译器会对代码做一些优化,例如行合并,从而影响行覆盖率结果; 这里我比较懒就没有加 加到test目录下的CMakeLists.txt即可 , 其中代码编译完之后会在test/CMakeFiles/test.dir/ 生成test.cpp.gcno文件, 在运

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包