目录
1. 测试概述
1.1. 测试的意义
-
参考
-
TDD
Test-Driven Development, 测试驱动开发, 是敏捷开发的一项核心实践和技术,也是一种设计方法论。TDD原理是开发功能代码之前,先编写测试用例代码,然后针对测试用例编写功能代码,使其能够通过。由于TDD对开发人员要求非常高,跟传统开发思维不一样,因此实施起来相当困难。
1.2. 常见测试
在软件测试中UT,IT,ST,UAT指单元测试,集成测试,系统测试 ,用户接受测试。
-
UT(单元测试,Unit Test):
单元测试任务包括:
1、模块接口测试;
2、模块局部数据结构测试;
3、模块边界条件测试;
4、模块中所有独立执行通路测试;
5、模块的各条错误处理通路测试。- 单元测试(又称为模块测试, Unit Testing)
- 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。
程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等; - 对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
- 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。
- 单元测试(又称为模块测试, Unit Testing)
-
IT(集成测试,Integration Test):
也称系统集成测试(System Integration Test)或结合测试,集成测试阶段是以黑盒法为主,在自底向上集成的早期,白盒法测试占一定的比例,随着集成测试的不断深入,这种比例在测试过程中将越来越少,渐渐地,黑盒法测试占据主导地位。
-
ST(系统测试,System Test):
从技术角度看,系统测试是整个测试阶段的最后一步,所有的开发和测试在这一点上集中表现为生成一个具有一定功能的软件系统。该阶段主要对系统的准确性及完整性等方面进行测试。
-
主要进行:
功能确认测试、运行测试、强度测试、恢复测试、安全性测试等。系统测试的测试人员由测试组成员(或质量保证人员)或测试组成员与用户共同测试。在整个系统开发完成,即将交付用户使用前进行。在这一阶段,完全采用黑盒法对整个系统进行测试。
-
-
UAT(验收测试,User Acceptance Test):
验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。
参考:
1.3. 测试原则
1.3.1. 单元测试
1.4. 测试工具
1.4.1. C++ 测试
- TestNG++
- mockC++
2. C++ 单元测试 --TestNG++
---->TestNG++
2.1. 准备
2.1.1. 头文件 & 目录配置
- 头文件
-
testngpp 工具
#inslude <testngpp/testngpp.hpp>
-
测试的文件的头文件
#include "*****.h"
-
2.2. 函数 类型
2.2.1. fixture(fixtureID, fixture name)
- 参数解释:
- 任何 C/C++ 标识符; --表明测试的东西;
- 可选参数;任何宏参数 允许的字符;
2.2.2. Test(test name)
- test name满足宏参数语法约束,可以使用编译器支持的任意字符;
2.2.3. ASSERTION 断言
2.2.4. SETUP & TEARDOWN
同一个 fixture
中的实例对象,可以定义在 SETUP
中,在 TEARDOWN
中删除;
- 实例
// == 格式 == #inslude <testngpp/testngpp.hpp> #include "xxx.h" FIXTURE() { DLM *dlm; SETUP() { dlm = new DLM(); } TEARDOWN() { delete dlm; } TEST() { } TEST() { } }
- 运行过程:
- 每个
TEST
均执行一次SETUP
和TEARDOWN
;
- 每个
2.2.5. Annotation
-
概述
- C/C++本身没有Annotation;
- TestNG++ 利用注释实现;最后生成测试代码框架;
-
语法
# 格式: // @annotation //@fixture -- 表示下面紧跟的方法是一个测试用例; //@test(id=startup, arg="ut te") --键值列表, 空格的要加 ""; # 其他注释 ///、 、/**/ -- 普通注释;
-
Tags
给测试做标记的一种方式; -
Annotation 用途
- 用于测试依赖,可避免重复编写测试;
- 用法:
# 使用key-list //@ test(id=a) //@ test(depends=a)
2.2.6. 兼容性
-
cxxtest
-
testcpp
2.3. 构建、运行、高级
2.3.1. 构建
2.3.2. 运行
2.3.2.1. 模式
-
Flat模式
一个测试崩溃,整个测试终止; -
Sandbox 模式
- 概述
- 每个测试运行在独立的地址空间中;
- 可以并发测试;
- 概述
注:
- 多线程调试困难,建议使用Flat进行测试;
2.3.2.2. 运行参数
3. C++单元测试–Mockcpp
mock工具:
- 指定函数的行为;
- 入参校验;
- 出参设定;
- 指定函数的返回值;
3.1. 概念
- mock 规范
3.2. 详解
3.2.1. mocker样式
TEST(mockcpp detail sample)
{
MOCKER(function) / MOCK_METHOD(mocker, method)
.stubs() / defaults() / expects(never() | once() | exactly(3) | atLeast(3) | atMost(3) )
[.before("some-mocker-id")]
[.with( any() | eq(3) | neq(3) | gt(3) | lt(3) | spy(var_out) | check(check_func)
| outBound(var_out) | outBoundP(var_out_addr, var_size) | mirror(var_in_addr, var_size)
| smirror(string) | contains(string) | startWith(string) | endWith(string) )]
[.after("some-mocker-id")]
.will( returnValue(1) | repeat(1, 20) | returnObjectList(r1, r2)
| invoke(func_stub) | ignoreReturnValue()
| increase(from, to) | increase(from) | throws(exception) | die(3))
[.then(returnValue(2))]
[.id("some-mocker-id")]
}
3.2.2. 核心关键字
-
关键字
-
NO.1: Matcher 匹配关键字
- subs: 可以指定函数的行为,不校验次数;
- expects: 校验次数;
.expects(once()) .expects(never()) .expects(exactly(123))
- defaults: 默认的mock规范,优先级低;subs/expects可重新指定函数行为;
-
NO.2: with 约束关键字
-
with
-
约束关键字:
eq neq lt gt check
-
-
NO.3:Strb 桩关键字
- will: 指定函数的返回值;
# 20次调用都返回1 .will(repeat(1,20)); # 第1次 返回1; 第2次 返回2; 第3次 返回3; .will(return(1)) .then(return(2)) .then(return(3))
- will: 指定函数的返回值;
-
-
优先级
MOCKER/MOCK_METHOD 之后:- subs/defaults/expects: 必须包含一个;
- before
- will/then
- after 在will后;
id
在整个mock规范的后面;