zoukankan      html  css  js  c++  java
  • 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 $@ $^ $(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 $@ -c $^

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

             $(CXX) $(CXXFLAGS) $(DEBUG_FLAGS) $(INC_FLAGS)  -o $@ -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.

  • 相关阅读:
    ios7--UIImageView
    ios6--UILabel
    ios5--计算器
    ios4--UIView的常见属性(尺寸和位置)
    ios2--UIView的常见属性
    PG数据库获取最近四个小时 使用产品的用户审计信息
    可添加头部尾部RecyclerView,很帅哦~
    http请求及缓存框架 GalHttprequest
    据说年薪30万的Android程序员必须知道的帖子
    Android显示GIF动画 GifView
  • 原文地址:https://www.cnblogs.com/sunnypoem/p/9556597.html
Copyright © 2011-2022 走看看