目录

目录

前言

一、单元测试是什么?

二、前置准备

 三、测试代码

 四、示例

 五:单元测试覆盖率




前言

单元测试的写法不固定,这里以我自己的一种写法为例,算是很简单的一种写法

 

一、单元测试是什么?

        单元测试其实就是写一些测试函数,测试代码的功能是否正常运行,一般如果还有覆盖率要求的话,则需要通过自己写的测试函数去走过每一个函数的每一个分支。

        覆盖率则是会通过检测你所写的测试代码,在全部源代码中走过的分支所占比例来定的。

二、前置准备

        在写单元测试之前,首先是要安装好环境,这里就不做环境安装说明了。

        首先要在代码中加上几个文件。

                a,首先要知道,在写单元测试时,只需要将所有.c和.h文件打包到一起就行,比如,我将所有.c放到src中,.h放在inc中,然后再src和inc放在一个路径下打开

                b, 然后在src(.c问价路径下)中加上main.c和testUnit.c(单元测试文件,名字可自定)两个文件,如下图:

java 单元测试覆盖率统计 单元测试代码覆盖率_开发语言


                main.c:

                        

java 单元测试覆盖率统计 单元测试代码覆盖率_开发语言_02

        main.c内容随便写,可以自己加上打印提示,但一定要调用单元测试函数。

                testUnit.c

                

java 单元测试覆盖率统计 单元测试代码覆盖率_代码覆盖率_03

         testUnit.c的内容如图,可以直接照用,唯一需要修改的是 增加组件 部分,这里是根据代码的文件来定的,例如:我的.c文件中有ip,tcp,udp等文件,则需要在每个.c文件中加上测试代码,然后将这个.c中的测试代码在此处(增加组件)调用(函数名自定)。

        CU_initialize_registry( )该函数成功返回枚举成员CUE_SUCCESS。(该枚举定于头文件<CUError.h>中),如果初始化函数执行失败,那么main函数可以返回宏定义CU_get_error()标识出错。

         c,还要在inc(.h文件路径下)加上testUnit.h,主要加上单元测试的一些固定头文件。

                testUnit.h

                        

java 单元测试覆盖率统计 单元测试代码覆盖率_java 单元测试覆盖率统计_04

        

 三、测试代码

        完成前面的准备后,就可以在每一个.c文件中开始写测试代码了,流程步骤如下图:

java 单元测试覆盖率统计 单元测试代码覆盖率_java 单元测试覆盖率统计_05

首先,最下方的函数,就是要在testUnit.c中增加组件处调用的函数,每个.c一个。

然后针对.c中不同的函数写不同的测试,比如图中tcptest1,tcptest2,tcptest3等等(函数名自定),无论写多少都可以,只需要在下方if语句中引用即可,注意最后一个后面不加 ||。

CU_ASSERT_EQUAL一个基本就可以全部解决。

     

java 单元测试覆盖率统计 单元测试代码覆盖率_单元测试_06

java 单元测试覆盖率统计 单元测试代码覆盖率_单元测试_07

当使用这些断言,满足一个断言情况下,最终的报告就会增加一个断言数,例如:

java 单元测试覆盖率统计 单元测试代码覆盖率_代码覆盖率_08

 使用CU_ASSERT_EQUAL,在上表可知是断言两个值是否相等。

具体示例代码如下:

        假如tcp函数如下,则需要测试每一个分支最终返回结果是否正确已经是否能走到每个分支,则只需要分别满足分支前置条件,然后利用断言查看返回是否正确,也可以利用打印看看返回是多少来确定断言正确。

java 单元测试覆盖率统计 单元测试代码覆盖率_java 单元测试覆盖率统计_09

 

 五:单元测试覆盖率

java 单元测试覆盖率统计 单元测试代码覆盖率_c#_10

当写完单元测试编译运行后,就会在终端出现上图打印,最左边三个分别表示写了测试函数的.c 文件数、测试函数总数、断言总数。

当完成这一步如果还有覆盖率要求,则使用如下指令:

            1, 编译:gcc -fprofile-arcs -ftest-coverage  -dumpbase '' -o main test.c func.c

                 参数:

                        -fprofile-arcs:使gcc创建一个程序的流图,执行生成.gcda文件

                        -ftest-coverage:编译生成.gcno文件,用于查代码覆盖率

                        -dumpbase '' 设置前缀名称

                ps:也可直接在makefile中加上 -fprofile-arcs -ftest-coverage  -dumpbase ''
            2, ./main   执行生成的执行文件
            3, lcov --directory . --capture --output-file app.info
           4, genhtml -o results app.info (会在路径下生成一个results文件夹,里面的内容就是覆盖率报告,html文件)