• 1
  • 1
分享
  • 在Windows 10下利用lcov进行C语言单元测试覆盖率检查
  • 饭团🍙 2020-09-28 11:06:09 字数 4377 阅读 7615 收藏 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软件测试网原创

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • polita3.0的框架接口如何编写测试用例如何运行测试用例在利用caster平台进行接口管理以后,我们可以将所有的中心放在编写测试用例case。这个教程可以帮助大家快速上手添加测试用例。1、polita3.0的框架接口```python ├── bin                   这里定义了怎么生成open-api ├── ci    &...
            0 0 2158
            分享
          • 部门最近的H5相关项目挺多的,由于团队之前接触的大多是Web项目,很少涉及H5,想着给团队成员培训下,减少漏测率,于是整理了一个文档。别说,效果还挺不错的,连着上线6个版本,都没有收到业务方反馈Bug,好东西不能独享,分享给大家,希望对大家有所启发。一、功能测试1、业务逻辑与Web测试一样,参照产品原型,把业务逻辑都覆盖一遍即可。H5页面也能在PC端访问,Chrome对H5支持最好,功能相关的测试可以在PC端Chrome下先测试,也可以直接在手机上测试。2、登录授权浏览器打开时,需要登录;客户端内打开时,如果已经登录,则无需再登录,如果未登录,则需要登录授权。3、翻页需要测试1页或多页的场景,...
            0 0 1299
            分享
          •   随着开发的逐渐深入,从节省时间、资源和提高测试效率的角度来说,自动化用例必然会成为一个大众型选择。并且,几乎大大小小的软件公司,都在朝着测试自动化的脚步迈进。  那么,我们应该如何有效地利用自动化测试结果挖掘问题,或者说如何通过自动化测试结果分析出一些问题呢?当然,这里的问题不全指代码故障,也可能包括测试脚本问题。  首先,让我们来看看,软件公司常用的将自动化测试嵌入开发流程方法。提及此,不得不提到DevOps(开发运营一体化)。  传统DevOps流程包括:设计——>开发——>测试——>部署,如下图所示。  构建DevOps流程需要一个持续化集成工具,如Jenkins,...
            11 12 1311
            分享
          •  我们的研发团队最需要应对的就是各种新需求。软件越来越快的更新速度也让整个系统也变得越来越复杂,这让 测试 工作面临着巨大的挑战。测试人员必须与开发人员沟通,确定测试范围,并及时获取最新的接口用例数据来验证功能。但是,由于需求变化太频繁,测试范围不能及时跟上接口的更新速度,导致很多潜在的问题被漏掉,影响了软件的质量。传统的静态测试模式非常影响工作体验。作为一个专业的 API 接口管理平台,Apifox 提供了一系列可视化和自动化的功能,能够有效地帮助测试人员应对这些挑战。举个例子,我们正在开发一个在线医疗问答平台,该平台提供了数百个服务接口。为了完整地测试所有功能...
            0 0 918
            分享
          • 跨浏览器测试是一种测试,需要大量的精力和时间。通过不同的浏览器,操作系统,设备,屏幕分辨率测试Web应用程序,以评估针对各种受众的Web内容呈现的过程是一项活动。特别是如果手动处理。使用Selenium进行的自动跨浏览器测试可以帮助您节省例行测试活动的时间,并帮助您缩短回归测试的时间。但是,人们很少喜欢变化。如果手动测试在您的组织中很流行,那么当您要求他们实施测试自动化时,管理层显然会提出问题。测试自动化虽然非常有益,但通常可能会证明是昂贵的,但值得吗?在说服高层管理人员的同时,您可能会发现这是一个难题。在开发Web应用程序时,将需要您提供使用Selenium进行测试自动化的有效ROI,并通过...
            0 2 2353
            分享
      • 51testing软件测试圈微信