zoukankan      html  css  js  c++  java
  • 嵌入式平台使用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

    里面有详细的使用介绍。

  • 相关阅读:
    【移动自动化】【三】控件定位
    【移动自动化】【二】Appium
    【自动化测试:笔记一】adb命令
    mysql api
    计算经纬度的正方形边界
    转 高效的多维空间点索引算法 — Geohash 和 Google S2
    转 为什么geometry+GIST 比 geohash+BTREE更适合空间搜索
    转 HBase GC日志
    转 HBase最佳实践-CMS GC调优
    转:HBase最佳实践-内存规划
  • 原文地址:https://www.cnblogs.com/StitchSun/p/4430362.html
Copyright © 2011-2022 走看看