• 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.

  • 相关阅读:
    数学+高精度 ZOJ 2313 Chinese Girls' Amusement
    最短路(Bellman_Ford) POJ 1860 Currency Exchange
    贪心 Gym 100502E Opening Ceremony
    概率 Gym 100502D Dice Game
    判断 Gym 100502K Train Passengers
    BFS POJ 3278 Catch That Cow
    DFS POJ 2362 Square
    DFS ZOJ 1002/HDOJ 1045 Fire Net
    组合数学(全排列)+DFS CSU 1563 Lexicography
    stack UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/sunnypoem/p/9556597.html
Copyright © 2020-2023  润新知