注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

c++ 单元测试gtest  

2014-11-06 16:23:02|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
google的单元测试框架
http://code.google.com/p/googletest/

修改gtest的CMakeLists.txt, 把gtest_force_shared_crt 改为ON, 不然如果其他模块不是使用静态库的话,会出现链接是符号找不到的情况。注意一下gtest里面cmake的这几个设置。
 BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
# make it prominent in the GUI.
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)

# When other libraries are using a shared version of runtime libraries,
# Google Test also has to use one.
option(
  gtest_force_shared_crt
  "Use shared (DLL) run-time lib even when Google Test is built as static lib."
  ON)

要不可能就需要自己手工给自己的项目全部指定使用静态连接库了,方正MT和 MD的不能混用。


if (MSVC)
# 所有的lib和exe统一使用static linking
add_compile_options("/MT")
elseif (UNIX)
endif()



使用是很简单的:

#include "gtest/gtest.h"

#include <string>
#include <iostream>

#include "../ast.h"
#include "../cin_parser.h"
#include "test.h"


void print_and_free_node(std::string name, Node *node, std::string &error)
{
std::cout << "-------------------" << name << " ------------------\n";
if (node) {
print_ast(std::cout, node, false, 0);
std::cout << "\n";
node->func.Free(*node);
node = NULL;
} else {
std::cout << " parse error: " << error << "\n";
}
}

TEST(Message1, parse_cin_string) {
std::string error;
Node * node = NULL;
node = parse_cin_string(Message1_cin_, Message1_csz_, error);
ASSERT_TRUE(node != NULL);
EXPECT_EQ(node->aligned_size_ , sizeof(Message1));
print_and_free_node("Message1", node, error);
}

TEST(Interface, parse_cin_string) {
std::string error;
Node * node = NULL;
node = parse_cin_string(module1_TestItf_ici_, module1_TestItf_ics_, error);
EXPECT_TRUE(node != NULL);
print_and_free_node("Message1", node, error);
}

int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();

int pause;
std::cin >> pause;
return 0;
}


cmake_minimum_required(VERSION 2.8)

add_subdirectory(gtest)

set (unittest_source
"test.h"
"test.c"
"unit_test.cpp")

add_executable(unittest ${unittest_source})
target_link_libraries(unittest c:/opt/lib/my_dll.lib)
target_link_libraries(unittest protocol)
target_link_libraries(unittest gtest)
target_include_directories(unittest
PRIVATE "C:/opt/include"
PRIVATE "gtest/include"
)

gtest的几个宏
TEST(Interface, parse_cin_string)
定义了testcase的类别名字为Interface,test的名字为parse_cin_string。 任意定义自己想要的字符串就可以了。
最终的testcase的名字是 "Interface.parse_cin_string" ,这个可以用于后面命令行参数   --gtest_list_tests    --gtest_filter选择某些testcase来执行的过滤条件。
后面的测试代码放到大括号里面,然后使用 gtest内置的EXPECT_TRUE 等宏来做检测, 具体可以参考gtest的文档。
ASSERT 和 EXPECT宏 的区别在于错误的级别, assert宏错误了直接从函数返回跳过函数的后面部分,expect宏则会执行执行完整个函数里面其他测试。

ASSERT宏 EXPECT宏 功能
ASSERT_TRUE EXPECT_TRUE 判真
ASSERT_FALSE EXPECT_FALSE 判假
ASSERT_EQ EXPECT_EQ 相等
ASSERT_NE EXPECT_NE 不等
ASSERT_GT EXPECT_GT 大于
ASSERT_LT EXPECT_LT 小于
ASSERT_GE EXPECT_GE 大于或等于
ASSERT_LE EXPECT_LE 小于或等于
ASSERT_FLOAT_EQ EXPECT_FLOAT_EQ 单精度浮点值相等
ASSERT_DOUBLE_EQ EXPECT_DOUBLE_EQ 双精度浮点值相等
ASSERT_NEAR EXPECT_NEAR 浮点值接近(第3个参数为误差阈值)
ASSERT_STREQ EXPECT_STREQ C字符串相等
ASSERT_STRNE EXPECT_STRNE C字符串不等
ASSERT_STRCASEEQ EXPECT_STRCASEEQ C字符串相等(忽略大小写)
ASSERT_STRCASENE EXPECT_STRCASENE C字符串不等(忽略大小写)
ASSERT_PRED1 EXPECT_PRED1 自定义谓词函数,(pred, arg1)(还有_PRED2, ..., _PRED5)


执行test的代码如下, 


int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();

int pause;
std::cin >> pause;
return 0;
}

其实gtest自带了一个gtest_main.c的项目,只要链接他那个object或者库文件文件就可以了,不用自己写这 main函数都可以

testing::InitGoogleTest(&argc, argv); 这里可以从命令行参数初始化,可以选择某些testcase来运行,
甚至可以执行某个test的执行次数。

可以用下面这个命令行和正则表达式,只执行 case2 类别的test, case2 对应TEST 宏定义里面test case的名字。
--gtest_filter=case2.*  

用 /? 或者 -h 运行上面我们的测试程序,可以输出详细说明

This program contains tests written using Google Test. You can use the
following command line flags to control its behavior:

Test Selection:
--gtest_list_tests
List the names of all tests instead of running them. The name of
TEST(Foo, Bar) is "Foo.Bar".
--gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]
Run only the tests whose name matches one of the positive patterns but
none of the negative patterns. '?' matches any single character; '*'
matches any substring; ':' separates two patterns.
--gtest_also_run_disabled_tests
Run all disabled tests too.

Test Execution:
--gtest_repeat=[COUNT]
Run the tests repeatedly; use a negative count to repeat forever.
--gtest_shuffle
Randomize tests' orders on every iteration.
--gtest_random_seed=[NUMBER]
Random number seed to use for shuffling test orders (between 1 and
99999, or 0 to use a seed based on the current time).

Test Output:
--gtest_color=(yes|no|auto)
Enable/disable colored output. The default is auto.
--gtest_print_time=0
Don't print the elapsed time of each test.
--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]
Generate an XML report in the given directory or with the given file
name. FILE_PATH defaults to test_details.xml.

Assertion Behavior:
--gtest_break_on_failure
Turn assertion failures into debugger break-points.
--gtest_throw_on_failure
Turn assertion failures into C++ exceptions.
--gtest_catch_exceptions=0
Do not report exceptions as test failures. Instead, allow them
to crash the program or throw a pop-up (on Windows).


  评论这张
 
阅读(646)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017