51Testing软件测试论坛

标题: 在Windows 10下利用lcov进行C语言单元测试覆盖率检查 [打印本页]

作者: lsekfe    时间: 2020-12-14 09:48
标题: 在Windows 10下利用lcov进行C语言单元测试覆盖率检查
在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,在安装的时候注意:
[attach]131318[/attach]
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 ... .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
  1.   #include <stdio.h>

  2.   #include "process.h"




  3.   int process(int x, int y, int z){

  4.       int k=0;

  5.       int j=0;

  6.       if ((x>3) && (z<10)){

  7.           k=x*y-1;

  8.           j=k^2;

  9.       }

  10.       if((x==4) || (y>5)){

  11.           j=x*j+10;

  12.       }

  13.       j=j%3;

  14.       return k+j;

  15.   }

  16.   process.h

  17.   extern int process(int x, int y, int z);

  18.   test_main.c

  19.   #include <Basic.h>

  20.   #include <Console.h>

  21.   #include <CUnit.h>

  22.   #include <TestDB.h>

  23.   #include <stdlib.h>

  24.   #include "process.h"

  25.   

  26.   /* test cases */

  27.   

  28.   void test_process_1(void)

  29.   {

  30.       CU_ASSERT(process(4,6,9)==24);

  31.   }

  32.   

  33.   void test_process_2(void)

  34.   {

  35.       CU_ASSERT(process(4,5,10)==1);

  36.   }

  37.   

  38.   void test_process_3(void)

  39.   {

  40.       CU_ASSERT(process(5,4,9)==21);

  41.   }




  42.   void test_process_4(void)

  43.   {

  44.       CU_ASSERT(process(2,5,10)==0);

  45.   }

  46.   

  47.   CU_TestInfo tests[] = {

  48.       {"test 1", test_process_1 },

  49.       {"test 2", test_process_2 },

  50.       {"test 3", test_process_3 },

  51.       {"test 4", test_process_4 },

  52.       CU_TEST_INFO_NULL

  53.   };

  54.   

  55.   /* suite init */

  56.   int suite_init(void)

  57.   {

  58.       return 0;

  59.   }

  60.   

  61.   int suite_clean(void)

  62.   {

  63.       return 0;

  64.   }

  65.   

  66.   void suite_setup(void)

  67.   {




  68.   }

  69.   

  70.   void suite_teardown(void)

  71.   {




  72.   }

  73.   

  74.   CU_SuiteInfo suites[] = {

  75.       {"suite 1", suite_init, suite_clean, suite_setup, suite_teardown, tests},

  76.       CU_SUITE_INFO_NULL

  77.   };

  78.   

  79.   /* registry */

  80.   

  81.   int main(int argc, char* argv[])

  82.   {

  83.       CU_ErrorCode err;

  84.   

  85.       /* init */

  86.       printf("init\n");

  87.       err = CU_initialize_registry();

  88.       if( err ){

  89.           printf("CU_initialize_registry: %d\n", err);

  90.           return err;

  91.       }

  92.   

  93.       /* add suites and tests */

  94.       printf("add suites and tests\n");

  95.       err = CU_register_suites(suites);

  96.       if( err )

  97.       {

  98.           printf("CU_register_suites: %d\n", err);

  99.       }

  100.       CU_pTestRegistry reg = CU_get_registry();

  101.       printf("CU_get_registry: %d/%d/%u\n", reg->uiNumberOfSuites, reg->uiNumberOfTests, (long)reg->pSuite);

  102.   

  103.       /* run auto */

  104.       printf("run auto\n");

  105.       /**** Automated Mode *****************/

  106.       CU_set_output_filename("TestProcess");

  107.       CU_list_tests_to_file();

  108.       CU_automated_run_tests();

  109.       //************************************/

  110.   

  111.       printf("run basic\n");

  112.       /***** Basice Mode *******************/

  113.       CU_basic_set_mode(CU_BRM_VERBOSE);

  114.       CU_basic_run_tests();

  115.       //************************************/

  116.   

  117.       /*****Console Mode ********************

  118.       CU_console_run_tests();

  119.       /************************************/      

  120.      

  121.       /* end */

  122.       printf("end\n");

  123.       CU_cleanup_registry();

  124.       err = CU_get_error();

  125.       if( err )

  126.       {

  127.           printf("error: %d", err);

  128.       }

  129.       return err;

  130.   

  131.   }
复制代码
运行编译,注意在原先基础上加上参数-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测试程序
  1. test.exe
复制代码
 5 生成覆盖率测试报告  打开msys2目录下的msys.bat,用这个工具就可以执行Linux下的命令。首先进入被测文件目录,即process.c、process.h和test_main.c目录位置。运行:
  1. gcov -a process.c

  2.   lcov -c -o main.info --rc lcov_branch_coverage=1 -d .
复制代码
 然后运行下面命令生成HTML报告
  1. genhtml main.info --rc lcov_branch_coverage=1 -o main_result
复制代码
[attach]131319[/attach]
在当前目录下生成main_result子目录,进去打开index.html即可看见单元覆盖率测试报告。
[attach]131320[/attach]











欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2