Visual Unit (C/C++测试工具)

发布时间 2023-07-27 08:46:49作者: 芋圆院长

表格驱动

VU工程

软件的使用

工程的建立

一个项目可以建立任意数量的VU工程,建立第一个时先选择开发环境,再选择模板(语言及编码等信息);导入数据(这里导入的是什么数据?);设定“产品项目根目录”和“VU工程名称”,之后建立同一个项目的VU工程时只需要“VU工程名称”即可。可将任务简写、模块名称或负责该模块的开发或测试人演的姓名作为VU工程名称。

设定测试任务:

 需要测试的源文件设为T
 不需测试但可能要使用的底层或关联源文件设为N
 设为X的文件会被隔离,必要时自动打桩(打桩即生成桩代码)。能够设为N的源文件不要设为X,尽可能减少打桩。(可在代码菜单中单击屏蔽桩代码,临时屏蔽桩代码,利用链接错误找出本应链接的库和本应链接的源文件,以避免不当打桩。)
 头文件默认不测试,如果需要测试的函数位于头文件中,可点击“头文件”按钮,选择要测试的头文件。
 从工程菜单中打开工程属性可以重设源文件类别或指定新加入的源文件的类别。

指定头文件搜索目录:

分为“库头文件目录”和“常规头文件目录”,二者的区别是符号未定义时(分类类别)前者不打桩,后者打桩。头文件类别:H 常规头文件,源文件不存在自动生成桩;L库头文件,表示源代码在库中,不会生成桩;X 忽略的头文件。(如果难以确定需要哪些头文件目录,可以先采用缺省设置,解析过程中未找到的头文件会自动记录,以后可在工程属性打开头文件页,点击“搜索”,搜索并选择需要的目录。)
注意编译选项(与项目一致)和高级选项(可先全部缺省之后再调整)。

工程介绍

工程的建立和对应文件的功能介绍。
大工程模式与小工程模式:(在工程菜单可以切换)
小工程中的代码文件是建立VU工程时,系统根据用户的设置,自动从大工程中拷贝过来的,保留了原来的目录结构。VU会自动修改并自动更新测试。处于大工程模式时,如果修改了大工程中的代码文件,系统会自动刷新小工程下的相应文件。
差异:被测试的文件目录不同,且小工程目录下只存在被测和外围文件,被隔离的文件不会拷贝到小工程中。

执行测试

测试目标:函数、类、文件、整个工程
建立用例:用例数据窗口建立用例数据
执行测试:执行函数、类、文件、全体测试
自动执行测试

黑盒测试与白盒测试等

黑盒与白盒是根据测试方法来分的。单元测试、集成测试、系统测试、性能测试是根据测试标的来分的:以代码单元为测试标的的是单元测试,以模块接口为测试标的的是集成测试,以整个系统为测试标的的是系统测试,以系统性能为测试标的的是性能测试。
功能为主,关键在于是否实现了功能。【单元测试应以黑盒方法为主,测试员必须了解程序设计功能。如果文档比较模糊,那么通过阅读代码来确认设计功能是可行的,但绝不能完全依赖阅读代码来设计用例。单元测试要么由程序员进行,要么必须有代码文档,使测试员可以了解代码的设计功能,别无选择。】

白盒覆盖

通过统计测试对代码逻辑单位及其组合的执行状况来衡量测试完整性,已执行的逻辑单位(语句、条件、判定、分支、路径[路径本质是从函数入口到出口的代码组合,由于判定形成了跳转,不同输入下可能执行不同的代码组合,有多少种可能的代码组合,就有多少条路径。])统计为已覆盖。

函数插装

插装的意思是直接设置输出或跳过这个函数,不管内部是如何运行的。所以放在软件设置中就是点开函数直接设置返回值就实现了插装。
桩,或称桩代码,是指用来代替关联代码或者未实现代码的代码。如果函数func用func_stub来代替,那么,func称为原函数,func_stub称为桩函数。打桩就是编写或生成桩代码的过程。
打桩的目的主要有:隔离,隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且与测试任务相关的代码,用桩来代替,从而实现分离测试任务。例如函数func_a调用了函数func_b,函数func_b又调用了函数func_c和func_d,如果函数func_b用桩来代替,函数func_a就可以完全割断与函数func_c和func_d的关系。

注意事项

  1. 指针一定要赋值,EMPTY也是赋值,指针为空指针(NULL)就会报失败断言的错误。
  2. 代码中使用硬编码(嵌入式,测试时找不到值),也可能会报断言错误。【给函数插装的意思就是直接给一个返回值,或者跳过这个函数。直接在“测试输出”窗口设置有效性和是否初始化和对应选项。都试试总没错,实在不行就在源代码中注释掉。】
  3. 静态变量只能在指定文件中使用,如果跨文件使用无法调用,只能手动初始化。为二级指针赋值没有给一级指针赋值,所以有指针是空的会报错。
    a. 定位到报错语句在哪里
    b. 查看里边有没有指针,对应的是几级指针。
    c. 这些指针里有没有空的,为什么是空的?这里的理由是该指针定义在别的文件里,且是静态变量,不能调用值,所以必须在本地得到对应的值。即自己进行初始化。(初始化函数因为涉及到了硬编码,无法测试,所以直接打桩。省略了一些初始化步骤,导致有的变量没有被初始化。所以需要手动进行初始化。)
    d. 【复习一遍指针的用法,指针赋值用的是地址,使用&】
  4. 使用#if 和#endif可以有选择地保证某些代码不执行,便于定位错误。一行一行往下找,找到错误语句然后一步一步去分析。
  5. 代码可以正常运行后,就去观测这些代码中使用的变量,进行添加设计案例即可。
  6. 使用UV代码停留在哪一行不一定是这一行报错了,多往前看一看…
  7. 出现必须使用的静态变量时,不使用就会报错,但又不能直接使用。此时应该使用extern把变量从别的地方传过来,保证自己可以设置值。在什么文件,使用的是什么类型。
  8. 报断言错误一般有两种情况:指针为空指针,输入与预期不符导致错误。所以只要右下角没有报断言错误,你的案例就没有问题。