gtest&gcovr&ccn

Posted sunnypoem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gtest&gcovr&ccn相关的知识,希望对你有一定的参考价值。

一.UT&FT

UT :

程序命名规范

1 测试类的命名

测试类的命名规则是:被测试类的类名 + Test

比如有一个类叫ConfigManager,那么它的测试类的命名就是ConfigManagerTest 。

2 测试用例的命名

测试用例的命名规则是: test + 用例方法名称

比如要测试的方法叫connectPointAdd,那么测试用例的命名就是testConnectPointAdd (说明:“用例方法”就是指被测试的类中所包含的方法,而“测试用例”就是指测试类中所包含的方法)

比如ConfigManager类中有一个方法叫做connectPointAdd,那么在ConfigManagerTest中对应的测试用例名称就是testConnectPointAdd。

保持测试的独立性

每项单元测试都必须独立于其他所有单元测试而运行,因为单元测试须能以任何顺序运行。

测试数据的覆盖率

测试时所准备的测试数据要覆盖程序中所有可能出现的CASE。

测试粒度

选择测试粒度的原则:

1、被测试类中所有public、protected方法都要测到。

2、对于简单的set和get方法没有必要做测试。

FT用例编写规范

FT自动化测试用例我们当前均采用junit编写实现,在测试用例编写中的规范与UT测试用例基本一致,除了参考UT规范外,还有以下的要求

FT用例的业务覆盖

FT用例当前是采用基于MainServiceBase基类的功能测试框架进行业务组件的功能测试,通过各个组件配合,实现的业务流程,测试用例需要穷尽各种业务的组合情况。

FT用例主要测试业务流程

FT用例是比UT用例高一个层级,主要测试组件间的功能配合,而不像UT用例主要关注接口、文件等.

 

工作心得:

能自动化实现的测试功能,就尝试用自动化。自动化的收益在后续整个开发过程中会体现出来。当然,自动化的代码也需要易维护,这样自动化也容易扩充。

FT的作用:版本迭代过程中,通过FT验证,减小新增代码引入bug的担心。

 

二.gtest

2.1 linux环境

库文件:lib库libgtest_main.a

头文件:inc中gtest

 技术分享图片

 

makefile中:链接需要-lgtest_main ; 头文件-I inc/gtest

makefile

#当前模块的配置

CURRENT_MODULE_PATH:=$(shell pwd)

#工程的公共配置

ROOT_PATH:=$(CURRENT_MODULE_PATH)/../..

PROJECT_COMMON_PATH:=$(ROOT_PATH)/common

 

INC_FLAGS:=-I$(CURRENT_MODULE_PATH)/inc  #加入模块头文件路径

INC_FLAGS+=-I$(PROJECT_COMMON_PATH)/inc

INC_FLAGS+=-I$(PROJECT_COMMON_PATH)/inc/test # gtest头文件

LIB_FLAGS:=-L$(PROJECT_COMMON_PATH)/lib #加入工程公共库文件路径 gtest mockcpp

#中间文件相关

CURRENT_MODULE_BUILD_PATH:=$(CURRENT_MODULE_PATH)/build

MODULE_SRC:=$(notdir $(wildcard $(CURRENT_MODULE_PATH)/src/*.cpp))

MODULE_DEBUG_OBJS:=$(addprefix $(CURRENT_MODULE_BUILD_PATH)/debug/,$(patsubst %.cpp,%.o,$(MODULE_SRC)))

 

TEST_SRC:=$(notdir $(wildcard $(CURRENT_MODULE_PATH)/test/*.cpp))

TEST_DEBUG_OBJS:=$(addprefix $(CURRENT_MODULE_BUILD_PATH)/debug/,$(patsubst %.cpp,%.o,$(TEST_SRC)))

#需要链接的库

TEST_LIBS:= -lgtest_main -lmockcpp -lpthread   #链接库

GCOVRFLAGS:= -fprofile-arcs -ftest-coverage  #覆盖率

 

#顶级目标

DEBUG_TARGET:=$(CURRENT_MODULE_BUILD_PATH)/Simulation

 

DEBUG_FLAGS:=-g -DDEBUG

 

CXXFLAGS+=-std=c++11

 

.PHONY:default release debug test clean pre_build

 

default:debug

 

pre_build:

         mkdir -p $(CURRENT_MODULE_BUILD_PATH)/debug

         rm -f $(CURRENT_MODULE_BUILD_PATH)/Simulation

 

#编译调试版本

debug:pre_build $(DEBUG_TARGET)

         ./build/Simulation

         #--gtest_output=xml:./build/gtest.xml

         #&&

         #gcovr -r . &&

         #lizard src -l cpp -C 8 -L 100 -a 6

 

$(DEBUG_TARGET): $(MODULE_DEBUG_OBJS) $(TEST_DEBUG_OBJS)

         $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LIB_FLAGS) $(TEST_LIBS)

 

#清除

clean:

         rm -rf $(CURRENT_MODULE_BUILD_PATH)

 

# debug 版本

$(CURRENT_MODULE_BUILD_PATH)/debug/%.o:$(CURRENT_MODULE_PATH)/src/%.cpp

         $(CXX) $(CXXFLAGS) $(DEBUG_FLAGS) $(INC_FLAGS)  -o [email protected] -c $^

$(CURRENT_MODULE_BUILD_PATH)/debug/%.o:$(CURRENT_MODULE_PATH)/test/%.cpp

         $(CXX) $(CXXFLAGS) $(DEBUG_FLAGS) $(INC_FLAGS)  -o [email protected] -c $^

示例代码:

#include <cassert>

#include <iostream>

#include <string>

#include <cstring>

#include <cmath>

 

#include <arpa/inet.h>

#include <test/gtest/gtest.h>

//#include <test/mockcpp/mockcpp.hpp>

#include "LcSimulation.hpp"

 

using std::cout;

using std::endl;

using std::string;

 

 

/*<说明>

 *

 *<说明>*/

 

namespace

{

 

}

 

/*测试用例类*/

class CaseEventHandle : public testing::Test

{

protected:

    static void SetUpTestCase()

    {

    }

    static void TearDownTestCase()

    {

    }

 

    virtual void SetUp()

    {

    }

    virtual void TearDown()

    {

 

    }

};

 

 

/***************************** 桩 *****************************/

int stubPub( const void* data, unsigned int dataLen)

{

    gPubInfoVec.emplace_back(data,dataLen);

    return 0;

}

 

void mockPubSuccess()

{

    #define pubFunc (ErrCode (*)(const void*,U32,const void*,U32))

    MOCKER(pubFunc pub)

        .stubs()

        .will(invoke(stubPub));

}

/***************************** 检查 *****************************/

 

 

/***************************** tests *****************************/

/* testing power on*/

TEST_F(CaseEventHandle,TestInitOK)

{

 

    Simulation* lc = Simulation::getInstance();

    ASSERT_EQ(1,lc->test());

}

 

2.2 gtest使用

转帖:http://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html

 

A. 断言 / 检查

ASSERT_* 检查点失败,退出当前函数

EXPECT_* 检查点失败,继续往下执行

输出相关信息

EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;

 

布尔值检查:ASSERT_TRUE(condition);

数值型数据检查:ASSERT_EQ(expected, actual);等

字符串检查:ASSERT_STRNE(str1, str2);

返回成功或失败:SUCCEED();FAIL();ADD_FAILURE();

异常检查:ASSERT_ANY_THROW(statement);

浮点型检查:ASSERT_FLOAT_EQ(expected, actual);

B. 事件机制 / 测试用例上下文

1. 全局的,所有案例执行前后。

2. TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。

3. TestCase级别的,每个TestCase前后。

C. 参数化(方便编写测试函数及遍历场景)

D. 死亡测试 (测试程序崩掉的场景)

E. 运行参数

http://www.cnblogs.com/coderzh/archive/2009/04/10/1432789.html

常用的:

1. --gtest_filter

2. --gtest_output=xml[:DIRECTORY_PATH|:FILE_PATH]

 

F. 深入理解gtest

三级事件,测试用例组织管理排序,执行等。

三.gcovr  测试覆盖率

http://gcovr.com/guide.pdf

http://blog.csdn.net/zhouzhaoxiong1227/article/details/50352944

gcovr是一个将单元测试中的代码覆盖率以多种方式(包括列表方式、XML文件方式、HTML网页方式等)展示出来的工具(3.2版本支持)

需要的编译条件:GCOVRFLAGS:= -fprofile-arcs -ftest-coverage  #覆盖率

3.1 使用命令gcovr

A. gcovr -r . 输出列表形式的代码覆盖率

B. gcovr -r . --branches 输出分支覆盖率

C. gcovr -r . --xml-pretty 输出展示覆盖率的xml文件

D. gcovr -r . -html -o xxx.html 以html文件输出覆盖率

E. gcovr -r . -html --html-details -o xxx.html 更详细的覆盖率

 

四.lizard 圈复杂度等检查

usage: lizard [options] [PATH or FILE] [PATH] ...

 

lizard is an extensible Cyclomatic Complexity Analyzer for many programming

languages including C/C++ (doesn‘t require all the header files). For more

information visit http://www.lizard.ws

 

示例:lizard src -l cpp -C 8 -L 100 -a 6

4.1 使用命令

positional arguments:

  paths                 list of the filename/paths.

 

optional arguments:

  -h, --help            show this help message and exit

  --version             show program‘s version number and exit

  -l LANGUAGES, --languages LANGUAGES

                        List the programming languages you want to analyze. if

                        left empty, it‘ll search for all languages it knows.

                        `lizard -l cpp -l java`searches for C++ and Java code.

                        The available languages are: cpp, java, csharp,

                        javascript, python, objectivec, ttcn, ruby, php,

                        swift, scala, GDScript

  -V, --verbose         Output in verbose mode (long function name)

  -C CCN, --CCN CCN     Threshold for cyclomatic complexity number warning.

                        The default value is 15. Functions with CCN bigger

                        than it will generate warning

  -f INPUT_FILE, --input_file INPUT_FILE

                        get a list of filenames from the given file

  -L LENGTH, --length LENGTH

                        Threshold for maximum function length warning. The

                        default value is 1000. Functions length bigger than it

                        will generate warning

  -a ARGUMENTS, --arguments ARGUMENTS

                        Limit for number of parameters

  -w, --warnings_only   Show warnings only, using clang/gcc‘s warning format

                        for printing warnings.

                        http://clang.llvm.org/docs/UsersManual.html#cmdoption-

                        fdiagnostics-format

  --warning-msvs        Show warnings only, using Visual Studio‘s warning

                        format for printing warnings.

                        https://msdn.microsoft.com/en-us/library/yxkt8b26.aspx

  -i NUMBER, --ignore_warnings NUMBER

                        If the number of warnings is equal or less than the

                        number, the tool will exit normally; otherwise, it

                        will generate error. If the number is negative, the

                        tool exits normally regardless of the number of

                        warnings. Useful in makefile for legacy code.

  -x EXCLUDE, --exclude EXCLUDE

                        Exclude files that match this pattern. * matches

                        everything, ? matches any single character,

                        "./folder/*" exclude everything in the folder

                        recursively. Multiple patterns can be specified. Don‘t

                        forget to add "" around the pattern.

  -t WORKING_THREADS, --working_threads WORKING_THREADS

                        number of working threads. The default value is 1.

                        Using a bigger number can fully utilize the CPU and

                        often faster.

  -X, --xml             Generate XML in cppncss style instead of the tabular

                        output. Useful to generate report in Jenkins server

  -H, --html            Output HTML report

  -m, --modified        Calculate modified cyclomatic complexity number

  -E EXTENSIONS, --extension EXTENSIONS

                        User the extensions. The available extensions are:

                        -Ecpre: it will ignore code in the #else branch.

                        -Ewordcount: count word frequencies and generate tag

                        cloud. -Eoutside: include the global code as one

                        function. -EIgnoreAssert: to ignore all code in

                        assert. -ENS: count nested control structures.

  -s SORTING, --sort SORTING

                        Sort the warning with field. The field can be nloc,

                        cyclomatic_complexity, token_count, p#arameter_count,

                        etc. Or an customized field.

  -T THRESHOLDS, --Threshold THRESHOLDS

                        Set the limit for a field. The field can be nloc,

                        cyclomatic_complexity, token_count, parameter_count,

                        etc. Or an customized file. Lizard will report warning

                        if a function exceed the limit

  -W WHITELIST, --whitelist WHITELIST

                        The path and file name to the whitelist file. It‘s

                        ‘./whitelizard.txt‘ by default. Find more information

                        in README.

以上是关于gtest&gcovr&ccn的主要内容,如果未能解决你的问题,请参考以下文章

gTest&gMock learning

PNaCl & gtest—pnacl-ld: 不兼容的目标文件 (X8664 != X8632)

linux gtest安装

解决用gcc7.3链接gtest1.7的问题

解决用gcc7.3链接gtest1.7的问题

解决用gcc7.3链接gtest1.7的问题