不管你是开发的老码农,还是新入职场菜鸟,只要你是项目里负责写代码的,都得多多少少写点单元测试代码。企业对质量也会有些要求,像单元测试的覆盖率达到100%这种要求。
其实单元测试达到60%左右可能效率上最高,发挥的作用最大。但硬性指标就是硬性指标,还是得想办法来满足指标要求。
推荐一项开源项目CPP-存根,专门为C单元测试打桩而设计的,使用简单的应用程序接口就能完成函数的替换,让你的覆盖率分分钟达到100%。
项目介绍
支持的操作系统: windows,linux支持的硬件平台: x86、x86-64、arm64、arm32、mips64支持的编译器: msvc,gcc,clang示例了各种获取函数的方法,像构造函数、虚函数、私有函数、模板函数、重载函数、仿函数、静态函数地址等基于gtest、catch2框架模板项目地址:https://github.com/coolxv/cpp-stub
打桩概念:用新实现的函数替换被测代码中的函数,当运行时原先执行函数1,当函数一被函数2替换(即打桩)时,就会运行函数2。
类成员函数例子
#包括牡蛎#使用命名空间标准包含“存根哈类{ int I;public : int foo(int A){ cout ' I是A _ foo ' endl返回0;}};int foo_stub(void* obj,int A){ A * o=(A *)obj;我是foo _ stub 'endl返回0;} int main(){ Stub Stub;stub.set(ADDR(A,foo),foo _ stub);aa。foo(1);返回0;}示例代码调用A:foo,但经过打桩后会变为调用foo_stub。
类的私有成员函数例子
//对于Linux # include I ostream # include ' stub。h ' # include ' addr _ pri。h使用命名空间stdA类{ int A;int foo(int x){ cout ' I是A _ foo ' A endl返回0;}静态int b;静态int bar(int x){ cout ' I是A _ bar ' b endl返回0;}};ACCESS_PRIVATE_FIELD(A,int,A);ACCESS_PRIVATE_FUN(A,int(int),foo);ACCESS_PRIVATE_STATIC_FIELD(A,int,b);ACCESS_PRIVATE_STATIC_FUN(A,int(int),bar);int foo_stub(void* obj,int x){ A * o=(A *)obj;我是foo _ stub 'endl返回0;} int bar _ stub(int x){ cout ' I am bar _ stub ' endl;返回0;} int main(){ A A;auto A _ A=access _ private _ field : aa(A);auto A _ b=access _ private _ static _ field : A : ab();a _ a=1;a _ b=10 call _ private _ fun : afoo(a,1);call _ private _ static _ fun :3360 a : abar(1);auto A _ foo=get _ private _ fun : afoo();auto _ A _ bar=get _ private _ static _ fun : A : abar();存根存根;stub.set(A_foo,foo _ stub);存根集(A_bar,bar _ stub);call _ private _ fun : AFO(a,1);call _ private _ static _ fun :3360 a : abar(1);返回0;}
类的构造函数例子
//对于linux # includeiostream #使用命名空间标准包含" stub.htemplate类Tvoid * get _ ctor _ addr(bool start=true){//start value able必须为没错,否则编译器将优化输出。如果(开始)转到开始;call _ constructor ://不会执行这一行代码。//代码的目的是允许编译器生成调用构造函数的汇编代码t();start ://由程序集char * p=(char*)调用_构造函数获得的代码行t()的地址;//https://gcc。GNU。组织/在线文档/gcc/标签作为值。html int offset=*(int *)(第8页);void * ret=p 12偏移量;返回ret} A类{ public : A(){ cout ' I是A _ constructor ' endl}};B类{ public : B(){ cout ' I是B _ constructor ' endl}};int main(){ 0存根;auto xa=get _ ctor _ addrA();auto XB=get _ ctor _ addrB();stub . set(XB xa);嗜酒者互诫协会级;返回0;}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153302.html