51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3551|回复: 0
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:07
  • 签到天数: 1020 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2020-12-14 09:48:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在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 ... .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
    复制代码

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







    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-19 06:36 , Processed in 0.065048 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表