• 1
  • 1
分享
  • 在Windows 10下利用lcov进行C语言单元测试覆盖率检查
  • 饭团🍙 2020-09-28 11:06:09 字数 4377 阅读 7194 收藏 1

  在Windows 10下利用lcov进行C语言单元测试覆盖率检查

  Lcov是Linux下的C语言覆盖率分析工具,在Widows下进行C语言开发的小伙伴可以使用吗?下面就来介绍一下如何在Windows 10下利用lcov进行C语言单元测试覆盖率检查。

  1、安装mingw-w64

  网上多处文章介绍下载mingw-get,由于现在网上大都数mingw-get均为32位的,所以不能用这个。所以大家需要下载https://sourceforge.net/projects/mingw-w64/files/下载mingw-w64-install.exe,在安装的时候注意:

图1.png

  i686为32位的,x86_64为64位的。所以这里我们选择x86_64。安装完毕配置环境变量。加入MINGW_HOME环境变量,我这里路径为:C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\。在PATH中设置%MinGW_HOME%\mingw64\bin\和%MinGW_HOME%\mingw64\include\。打开cmd,输入gcc,如果返回gcc: fatal error: no input files则说明配置正确。

  2、安装msys2

  msys2可以让你在Windows下编译Linux的代码,目前网站上有简易版和完全版,简易版下载以后还需要安装各个命令的插件,比较麻烦,所以建议安装完全版,完整版的文件名为msys+7za+wget+svn+git+mercurial+cvs-rev13.7z(这个文件比较大,下载需要1个多小时)。解压完毕请把文件夹msys全部拷贝到mingw的目录下,我这里为C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64。

  3、安装lcov

  在https://sourceforge.net/projects/ltp/files/Coverage%20Analysis/LCOV-1.14/lcov-1.14.tar.gz/download下载lcov-1.14.tar.gz。下载后解压,在bin目录下生成的五个文件lcov, gendesc, genhtml, geninfo, genpng复制到%MinGW_HOME%\mingw64\bin目录下。

  4、运行测试程序

  进入测试项目下,这里有3个文件,其中process.c是被测程序,process.h是运行进行CUNIT的调用头,test_main.c是CUNIT的测试文件,关于CUNIT更详细情况请参见我前几天写的文章《CUNIT简介》。

  process.c

   #include <stdio.h>
  #include "process.h"
  int process(int x, int y, int z){
      int k=0;
      int j=0;
      if ((x>3) && (z<10)){
          k=x*y-1;
          j=k^2; 
      }
      if((x==4) || (y>5)){
          j=x*j+10; 
      }
      j=j%3;
      return k+j;
  }
  process.h
  extern int process(int x, int y, int z);
  test_main.c
  #include <Basic.h>
  #include <Console.h>
  #include <CUnit.h>
  #include <TestDB.h>
  #include <stdlib.h> 
  #include "process.h"
   
  /* test cases */
   
  void test_process_1(void)
  {
      CU_ASSERT(process(4,6,9)==24);
  }
   
  void test_process_2(void)
  {
      CU_ASSERT(process(4,5,10)==1);
  }
   
  void test_process_3(void)
  {
      CU_ASSERT(process(5,4,9)==21);
  }
  void test_process_4(void)
  {
      CU_ASSERT(process(2,5,10)==0);
  }
   
  CU_TestInfo tests[] = {
      {"test 1", test_process_1 },
      {"test 2", test_process_2 },
      {"test 3", test_process_3 },
      {"test 4", test_process_4 },
      CU_TEST_INFO_NULL
  };
   
  /* suite init */
  int suite_init(void)
  {
      return 0;
  }
   
  int suite_clean(void)
  {
      return 0;
  }
   
  void suite_setup(void)
  {
  }
   
  void suite_teardown(void)
  {
  }
   
  CU_SuiteInfo suites[] = {
      {"suite 1", suite_init, suite_clean, suite_setup, suite_teardown, tests},
      CU_SUITE_INFO_NULL
  };
   
  /* registry */
   
  int main(int argc, char* argv[])
  {
      CU_ErrorCode err;
   
      /* init */
      printf("init\n");
      err = CU_initialize_registry();
      if( err ){
          printf("CU_initialize_registry: %d\n", err);
          return err;
      }
   
      /* add suites and tests */
      printf("add suites and tests\n");
      err = CU_register_suites(suites);
      if( err )
      {
          printf("CU_register_suites: %d\n", err);
      }
      CU_pTestRegistry reg = CU_get_registry();
      printf("CU_get_registry: %d/%d/%u\n", reg->uiNumberOfSuites, reg->uiNumberOfTests, (long)reg->pSuite);
   
      /* run auto */
      printf("run auto\n");
      /**** Automated Mode *****************/
      CU_set_output_filename("TestProcess");
      CU_list_tests_to_file();
      CU_automated_run_tests();
      //************************************/
   
      printf("run basic\n");
      /***** Basice Mode *******************/
      CU_basic_set_mode(CU_BRM_VERBOSE);
      CU_basic_run_tests();
      //************************************/
   
      /*****Console Mode ********************
      CU_console_run_tests();
      /************************************/      
      
      /* end */
      printf("end\n");
      CU_cleanup_registry();
      err = CU_get_error();
      if( err )
      {
          printf("error: %d", err);
      }
      return err;
   
  }

   运行编译,注意在原先基础上加上参数-fprofile-arcs -ftest-coverage

  gcc -fprofile-arcs -ftest-coverage process.c test_main.c -o test -I/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/include -L/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib -lcunit -static

  运行执行JUNIT测试程序

 test.exe

  5、生成覆盖率测试报告

  打开msys2目录下的msys.bat,用这个工具就可以执行Linux下的命令。首先进入被测文件目录,即process.c、process.h和test_main.c目录位置。运行:

   gcov -a process.c
  lcov -c -o main.info --rc lcov_branch_coverage=1 -d .

  然后运行下面命令生成HTML报告

 genhtml main.info --rc lcov_branch_coverage=1 -o main_result      

图2.png

  在当前目录下生成main_result子目录,进去打开index.html即可看见单元覆盖率测试报告。

图3.png


作者:顾翔   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   背景:  用jmeter录制或者书写接口或性能测试的脚本,用maven添加相关依赖,本地eclipse测试通过后,放到jenkins上执行反馈结果给测试负责人实时查看执行结果。  1、环境搭建  "下载安装 jdk1.7或jdk1.8并配置环境变量  "Eclipse v4.5  "下载安装jenkins.rpm安装到linux或本地tomcat搭建安装jenkins.war  "下载maven 3.1.x或3.2.x或3.3.x并进行解压,配置本地和jenkins环境变量  "下载jmeter3.1并解压  2、准备性能测试的脚本  1)...
            1 1 3047
            分享
          •   微软笑拉了!昨晚谷歌展示了新AI加持后的搜索引擎,毫无亮点,效果拉跨,甚至回答还被爆出存在事实性错误。发布会后,股价直接一泻千里。  谷歌和微软的搜索引擎大战,已经打到了第三天。  这几天,全世界的目光都聚焦于此。毕竟,上一次两家巨头发生如此激烈的酣战,还是在十多年前。  北京时间昨晚九点半,谷歌CEO抢先公布的“ChatGPT同款”Bard在巴黎首次亮相,同时还有一众基于AI的产品更新。  此前,微软已经先下一城,率先召开发布会,展示了“ChatGPT搜索引擎”必应。而这次,轮到谷歌大显身手了。  面对微软的重重暴击,谷歌会怎么打回去?带着这个悬念摩拳擦掌期待了一天的“瓜友”们,看完直播...
            0 0 641
            分享
          • 兼容性测试兼容性测试是指待测试项目在特定的硬件平台上,不同的应用软件之间,不同的操作系统平台上,在不同的网络等环境中能正常的运行的测试。兼容性测试的目的:待测试项目在不同的操作系统平台上正常运行,包括待测试项目能在同一操作系统平台的不同版本上正常运行;待测试项目能与相关的其他软件或系统的“和平共处”;待测试项目能在指定的硬件环境中正常运行;待测试项目能在不同的网络环境中正常运行。兼容性测试无法做到完全的质量保证,但对于一个项目来讲,兼容性测试是必不可少的一个步骤。Web兼容性测试的主要类型:Web兼容性测试主要是针对不同的操作系统平台,浏览器,以及分辨率进行的测试。1.1 平台测试-操作系统市...
            0 0 1247
            分享
          • 项目描述被测网址:www.sogou.com指标:相应时间以及错误率场景:线程数20、Ramp-UpPeriod(inseconds)10、循环次数10测试步骤打开jmeter工具,右击“测试计划”-->“添加”-->“线程组”,创建一个线程组。线程组设置(线程数20、Ramp-UpPeriod(inseconds)10、循环次数10):线程数:虚拟用户数。rampupperiod:设置的虚拟用户数需要多长时间全部启动。如果线程数为20,时间为10,也就是每秒钟启动2个线程。循环次数:每个线程发送请求的次数。如果线程数为20,循环次数为100,那么每个线程发送100次请求。总请求数...
            0 0 1445
            分享
          • Postman 是一款非常适合接口测试入门的工具,UI 精美,使用起来简单方便,功能强大,支持一定程度的 Javascripts 编程。与命令行工具 Newman 结合使用,可以实现与 Jenkins 等持续集成工具的集成使用达到接口自动化的目的。早期 Postman 是 Chrome 浏览器的一个插件,需要从 Chrome 应用市场下载,不过现在已经独立成一个客户端软件,支持多平台。首先安装 Postman,直接安装即可。安装好后,我们来看看界面。创建一个账号,也可以不注册,直接点右上角 x 关掉即可。不注册并不影响正常使用,只有当你需要分享用例和团队协作才需要注册账号。关掉注册后的界面如下...
            0 0 1103
            分享
      • 51testing软件测试圈微信