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

发表于:2020-6-29 09:25

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:顾翔    来源:51Testing软件测试网原创

  在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,在安装的时候注意:
  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
  
    在当前目录下生成main_result子目录,进去打开index.html即可看见单元覆盖率测试报告。

      版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号