TA的每日心情 | 擦汗 3 天前 |
---|
签到天数: 1042 天 连续签到: 4 天 [LV.10]测试总司令
|
在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
- #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测试程序
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即可看见单元覆盖率测试报告。
|
|