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://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的主要内容,如果未能解决你的问题,请参考以下文章