嵌入式平台使用gtest进行白盒测试
看了coderzh大神写的gtest(http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html)使用的帖子,觉得gtest这个工具比较好用。就想引入的现在的测试工作中,但是我从事的是嵌入式的的软件测试,使用的是嵌入式的linux系统,芯片是海思等芯片。无法直接使用gtest这个工具,用Google百度搜素了半天,也没有找到使用的案例。
但是这么好的工具,不能用实在是可惜,我偏不信这个邪。经过了多次尝试,下面的方法可行。
详细的过程如下:
总体思路是:
1、 使用嵌入式平台的交叉编译工具编译gtest,编译出libgtest.a或者libgtest.so
2、 编写测试代码
3、 使用libgtest库与测试代码一起交叉编译出目标平台的可执行程序
4、 在目标平台执行测试
一、编译Gtest
配置编译脚本
下载gtest代码,使用tar命令解压,进入gtest-1.6.0文件夹下,ls查看文件,里面有Makefile文件,但是我们不能使用它进行编译,必须使用对应平台的编译器。
使用configure配置文件来配置我们要使用的编译器(这里以我使用的海思编译器为例):
配置命令如下:
./configure--host=arm-hisiv100nptl-linux CC=/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-gcc CXX=/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-g++
解释下这个命令的的各个参数的意义:
l --host是指编译目标的平台名称,这里是:arm-hisiv1000nptl-linux,
l CC是指C语言的GCC交叉编译器的路径,这里=号后是编译器的绝对路径
l CXX是是C++语言的G++交叉编译器的路径,这里=号后是编译器的绝对路径
红色的字体是根据实际的需要进行修改,不同平台用不用的名称,编译器安装路径不同,也要修改路径。
配置命令执行时如果没有错误,就说明配置完成,可以进行下一步了。
编译GTEST
因google已经提供了Makefile文件,我们的编译工作就比较简单了。在配置好编译器路径后,直接使用make命令来编译。
不过建议在编译前先执行 make clean命令,先清理以前编译生成的文件。
执行make命令,等待编译完成,没有提示错误,编译完成。
到lib/.libs/目录下查看编译结果:

里面生成了我们需要的libgtest.a文件。
后续在进行测试时,不需要每次都编译gtest工程,生成libgtest.a文件,只需要编译一次即可。
备注说明:
编译生成的产物有libgtest.a和libgtest.so文件,具体使用哪个看个人喜好。本文以静态库libgtest.a为例。
二、编写测试代码
下面进入到测试代码编写阶段。
大家熟悉了gtest的使用方法,coderzh已经描述的很清楚了,这里不在详细描述了,我们直接看下面的例子,讲述如何来编写测试用例。
我们以下面的这个函数为例:
intBrdEthQueryInfo(TEthInfo *ptInfo)
我们以第一个函数BrdEthQueryInfo为例,来编写一个测试用例:

Main函数编写如下:

这里引入了两个头文件,作用是用来使用drvlib.a和libgtest.a两个库中的函数,用例的编写形式就是:
TEST(TestSuiteName,TestCaseName)
{
EXPECT_EQ();
}
第一个参数:TestSuiteName,即测试套名称,对于一个被测函数,我们认为是一个测试套,即TestSuite,里面可以包含多个测试用例,即Testcase。
例如被测函数int BrdEthQueryInfo(TEthInfo *ptInfo),它有两种返回值,0和-1,则我们设计两个测试用例:
TEST(Test_BrdEthQueryInfo,test_Eth_nomarl)
TEST(Test_BrdEthQueryInfo,test_Eth_fail)
在这两个测试用例中,Test_BrdEthQueryInfo的名称是不变的,而第二个参数的是变的,分别为test_Eth_nomarl和test_Eth_fail,即测试一个函数的两个返回值情况。
把编写的测试代码保持为文件:sample.c。准备下一步的编译。
三、编译测试文件
在执行编译之前,我们需要做一个事情,就是把libgtest.a和gtest的头文件复制到drvlib的测试代码目录下。同时,也需要把libdrv.a和头文件复制到对应的目录下。(不复制当前目录下也可以,需要在编译脚本中指定它们的路径)
复制完成后,就要执行最后一步编译了。编译命令如下:
/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-g++ \ 编译器路径
-o ethtest2 sample.c \ -o是编译参数,生成目标文件,sample.c是源代码文件
libgtest.a \ libdrv.a路径,是指定libdrv.a的路径。
libdrv.a \
-I. \ 链接到libgtest.a库,-I. 是指定gtest头文件的位置,因gtest的头文件在当前目录下,就使用-I.(记住有个点)
-I../../api \ -I../api是指定的drvlib的头文件路径,
-lpthread -lpthread是编译时使用多线程库。
执行命令,无错误,生成目标文件:ethtest2。
四、执行测试
把生成的目标程序复制到Hisi平台的设备上,可以使用ftp的方法。首先修改文件的权限,chmod a+x filename
./filename 来执行文件。查看执行结果:

执行结果显示,执行了一个testcase,包含了两个tests。测试结果都是PASSED。
五、测试原理说明
Gtest测试原理为:把被测试函数代码与gtest库联合编译,然后在测试平台上执行,判断函数的执行结果是否与预期结果相符,如果相符则PASS,否则FAIL。
Gtest白盒测试架构,不涉及源代码的修改,不影响原有代码结构,具有良好的扩展性和适应性。
编译生成文件为可执行文件,非常方便。
gtest使用详细的信息可以参考:
http://www.cnblogs.com/coderzh/archive/2009/03/31/1426758.html
里面有详细的使用介绍。
嵌入式平台使用gtest进行白盒测试的更多相关文章
- 嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导
在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率.函数覆盖率,分支覆盖率的数据. 便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效 ...
- QT4.8.5环境移植到嵌入式平台
QT4.8.5环境移植到嵌入式平台 参考:Qt移植到ARM Linux教程 http://www.veryarm.com/930.html 清除配置: sudo make confclean 配置: ...
- 嵌入式平台选择:树莓派 or BeagleBone Black(BBB)
原文链接: Michael Leonard 翻译: 极客范- 小道空空 译文链接: http://www.geekfan.net/5246/ 嵌入式平台选择:树莓派 or BeagleBone Bla ...
- 迅为7寸工业触摸屏嵌入式平台可用于ARM嵌入式一体机
7寸触摸屏介绍产品名称:7寸IPS高清屏幕分辨率:1280*800触摸屏类型:电容屏(五点触摸)接线方式: FPC 可应用于嵌入式一体机.自动售货机.广告机.智能自动终端.零售终端等 ARM平台处理器 ...
- opus在arm的嵌入式平台上的移植和开发
最近产品中要用到opus,圣上一声令下,把opus移植到我们平台上,什么?opus?opus是什么?在一脸 茫然中,我这特种兵码农就赤手空拳上战场了. 废话少说,赶紧在网站:https://opus- ...
- Netbeans配置Java SE嵌入式平台(树莓派)
1.配置平台 来源:http://www.cnblogs.com/xiaobo-Linux/p/7955769.html 2. 选择远程 3. 填写信息 JRE 路径是树莓派上的路径:how? sud ...
- [misc]如何在嵌入式平台使用printf功能
转自:http://www.cnblogs.com/liu_xf/archive/2011/04/14/2015726.html 摘要: 当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上, ...
- 如何移植sshserver到嵌入式平台
ssh解释说明 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是较可靠,专 ...
- [Ubuntu] 移植Ubuntu16.04根文件系统到嵌入式平台
CPU:RK3288 1.通过 ubuntu cdimage 下载 ubuntu16.04 内核,以下两种方式都可以 在 windows 系统网页中下载 http://cdimage.ubuntu.c ...
随机推荐
- HDU 1073 - Online Judge
模拟评测机判断答案 先判断有没有不一样的 有的话再提取出 有效子列 看看有没有错的 #include <iostream> #include <cstdio> #include ...
- HDU 1055 - Color a Tree
一棵树,结点树为n,根结点为r.每个结点都有一个权值ci,开始时间为0,每染色一个结点需要耗时1,每个结点的染色代价为ci*ti(ti为当前的时间),每个结点只有在父结点已经被染色的条件下才能被染色. ...
- auto 和 decltype (C++11 新增)
红色字体为个人推断,可信度自辨. 蓝色字体为重点. auto类型说明符:使用auto时,编译器会分析表达式,并自动推算出变量所属类型.*auto变量必须有初值 原理:编译器通过 初值 来判断auto变 ...
- 关于ajax提交的公共接口的一大用处
在项目框架搭建的时候,就写了ajax提交的公共接口,是想统一的日志和处理ajax返回的错误信息. 今天,却又帮我解决了另外一个问题:每次点开某个页面,有一个ajax请求总是会调用两次,于是打开chro ...
- linux 安装nodejs
首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源码,一种是编译后的文件. 我就是按照网上源码的安装方式去操作编译后的文件,结果坑了好久好久. 注意看好你下载的是什么 ...
- Vue.js 学习示例
本篇和大家分享的是学习Vuejs的总结和调用webapi的一个小示例:快到年底了争取和大家多分享点东西,希望能对各位有所帮助:本章内容希望大家喜欢,也希望各位多多扫码支持和推荐谢谢: » Vuejs ...
- js禁止中文输入 最简洁的【禁止输入中文】
方法一:禁止中文输入法 <input type="text" > 方法二:禁止黏贴,禁止拖拽,禁止中文输入法! 这种方法是最强的禁止 中文输入 <input t ...
- C语言--C语言程序
一.代码的编写 1.程序结构 1> C语言程序的结构:由函数构成 *任何一个c语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,我 ...
- QT:用QSet储存自定义结构体的问题——QSet和STL的set是有本质区别的,QSet是基于哈希算法的,要求提供自定义==和qHash函数
前几天要用QSet作为储存一个自定义的结构体(就像下面这个程序一样),结果死活不成功... 后来还跑到论坛上问人了,丢脸丢大了... 事先说明:以下这个例子是错误的 #include <QtCo ...
- 匿名方法和Lambda表达式
匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法. 规则: 1.匿名方法中不能使用跳转语句跳至次匿名方法的外部,反之亦然:匿名方法外部的跳转语句也不能跳转到匿名方法的内部: 2.在匿名方法 ...