笛卡尔积数值计算程序测试报告
中国信息大学信息工程学院 李向函
本文以测试数值计算类程序“笛卡尔积计算”程序为例,来简单进行讨论软件测试的流程,及其需要注意的问题。
一、软件测试的目的及必要性
1.1为什么要进行软件测试
软件质量已成为开发商和用户共同关注的焦点。没有质量保证的软件产品,就没有市场竞争力。软件测试是否充分、有效,直接影响到软件产品的质量。
无论是工作还是生活中,我们长见到的,常用到的程序无非就两种功能,即数值计算和事务处理。本文在此以笛卡尔积运算程序为例简单讨论一下数值计算类程序的测试设计及实现。
1.2笛卡尔积简述
笛卡尔(Descartes)乘积又叫直积。设A、B是任意两个集合,在集合A中任意取一个元素x,在集合B中任意取一个元素y,组成一个有序对(x,y),把这样的有序对作为新的元素,他们的全体组成的集合称为集合A和集合B的直积,记为A×B,即A×B={(x,y)|x∈A且y∈B}。
笛卡尔积多用于数据库领域,在日常生活中,有许多事物是成对出现的,而且这种成对出现的事物,具有一定的顺序。例如,上,下;左,右;3〈4;张华高于李明;中国地处亚洲;平面上点的坐标等。一般地说,两个具有固定次序的客体组成一个序偶,它常常表达两个客体之间的关系。记作〈x,y〉。上述各例可分别表示为〈上,下〉;〈左,右〉;〈3,4〉;〈张华,李明〉;〈中国,亚洲〉;〈a,b〉等。
当设计数据库时多用于解决此类问题。
1.3数值计算类程序简介
有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科。数值计算主要研究如何利用计算机更好的解决各种数学问题,包括连续系统离散化和离散形方程的求解,并考虑误差、收敛性和稳定性等问题。从数学类型分,数值运算的研究领域包括数值逼近、数值微分和数值积分、数值代数、最优化方法、常微分方程数值解法、积分方程数值解法、偏微分方程数值解法、计算几何、计算概率统计等。随着计算机的广泛应用和发展,许多计算领域的问题,如计算物理、计算力学、计算化学、计算经济学等都可归结为数值计算问题。
由上述问题可以看出数值计算类程序在科研领域的作用,一个良好的程序离不开测试,那么我们进行数值计算类程序测试时需要注意哪些问题呢?
一般来讲进行数值计算类程序测试一般需要注意以下问题:
1.程序源代码的书写是否规范,是否按照某种指定标准进行书写;
2数组上下界是否定义,是否出现下标越界问题;
3.参数定义类型是否符合规范,参数调用是否方便;
4.程序输入输出的参数是否界定;
5.程序的使用是否方便,是否书写时使用方法;
6. 检查数字转换为其字符串表示形式的数值格式化方法, 是否完全地实现了软件所规定的内容,没有错误;
7. 检查以参数的形式传递对象的接口, 是否完全地实现了软件所规定的内容,没有错误;
8.检查参数以合法的方式提供格式化服务, 是否完全地实现了软件所规定的内容,没有错误;
9.检查数据库自动生成数值序列功能, 是否完全地实现了软件所规定的内容,没有错误;
10.检查布尔对象转换值,null、未定义、0、或false均转换成布尔对象的方法,是否完全地实现了软件所规定的内容,没有错误;
11. 检查数值函数对象是否完全地实现了软件所规定的内容,没有错误;
12.检查将非字母、数字字符转换成ASCII码编码函数, 是否完全地实现了软件所规定的内容,没有错误;
13.检查将ASCII码转换成字母、数字字符译码函数, 是否完全地实现了软件所规定的内容,没有错误;
14. 检查不同进制(二、八、十六)的数值转换成十进制整数转换函数 , 是否完全地实现了软件所规定的内容,没有错误;
15. 检查将数值字串转换成浮点数转换函数 , 是否完全地实现了软件所规定的内容,没有错误;
16.检查 / 除号、 <小于 、 <=小于等于 、 <> 不等于、 = 等于 、 > 大于 、 >= 大于等于、and 逻辑与 、 not 逻辑非 、or 逻辑或, 是否完全地实现了软件所规定的内容,没有错误。
基本上我们在进行数值计算类程序测试时掌握以上问题,就能够完成我们的测试工作,当然测试还需要根据实际来进行测试设计。
二、如何展开测试(测试计划制定及测试设计)
下面我们来开始讨论如何展开测试。
任何一个测试之前我们需要明确了解必须进行那些测试?测试在何时开始,希望何时通过以及测试日程安排?这就是我们所要讨论的测试计划和测试设计。
因本文只讨论笛卡尔积数值计算子程序设计,关于测试计划本文不予讨论,下面简单介绍本次程序测试设计。
测试设计是对每个测试用例进行详细的测试步骤设计,设计时力求覆盖所有功能点。设计的测试步骤,就是实施测试时的操作步骤。测试设计还包括选择检查点、设计检查位置、定义测试用例的条件和确定测试通过的标准。对于要求进行回归测试的软件用例的设计要考虑测试用例的复用性和扩展性。
本文笛卡尔积数值计算程序作为仅进行单元测试及功能测试。
在单元测试设计是需要注意要以最微小规模的测试;以测试某个功能或代码块。典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。这个工作不容易作好,除非应用系统有一个设计很好的体系结构; 还可能需要开发测试驱动器模块或测试套具。
功能测试设计是应注意用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)。
三、源程序代码及使用简介
测试开始前我们需要源程序及程序使用说明书。以下为源程序及其使用说明书。
根据测试进度及执行计划表,本文重点讨论单元测试及功能测试。
当我们拿到一个需要测试的程序时首先要明确该程序的目的,该程序实现的功能,以及如何使用该程序来进行计算等。
下面是笛卡尔积运算源程序及其说明文档。
======================================================================
一、目的
本程序对两个集合做笛卡尔积运算。
二、算法简介
有A,B两个集合,我们把一切有序对(x,y)所组成的集合(其中 ),叫做A,B的笛卡尔积。在算法上记着AxB。若A{ };B{ }则笛卡尔积有AxB={( ),( ),…,( ),( ),( ),…,( ),…( ),( ),…( )}
三、源程序:
void li_axb(int a[5],int b[5],int m,int n)
{
int i,j;
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
{
cout<<a[i]<<","<<b[j]<<endl;
}
}
}
}四、使用说明:
调用格式:li_axb(a,b,m,n)
参考说明:
输入参数:A——整型数组,A集合的全部元素;B——整型数组,B集合的全部元素;m——整型数,A集合的元素个数,n——整型数,B集合的元素个数。
结果在子函数中输出,无输出参数。
五、应用示例
已知:A={0,1,2},B={0,3,4,5},求AxB 的笛卡尔积。
主程序:
// 调用头文件
#include <iostream.h>
//笛卡尔积函数
void li_axb(int a[5],int b[5],int m,int n)
{
int i,j;
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
{
cout<<a[i]<<","<<b[j]<<endl;
}
}
}
//主函数开始
void main()
{
//定义变量 m,n 此处m,n 用来定义数组内存放数值的个数
int n,m;
int a[5]={0,1,2};
int b[5]={0,3,4,5};
m=2;
n=3;
//调用笛卡尔积函数
void li_axb(int a[5],int b[5],int m,int n);
li_axb(a,b,m,n);
}
计算结果:
AxB=
{<0,0>
<0,3>
<0,4>
<0,5>
<1,0>
<1,3>
<1,4>
<1,5>
<2,0>
<2,3>
<2,4>
<2,5>
}
======================================================================
以上为我们所得到的源程序及源程序说明文档。
四、测试实现和测试执行
测试在哪里进行?换句话说,就是测试将在何种软、硬件配置的环境下运行?这就是我们所要讨论的测试实现和测试执行。
(1)测试实现
测试实现是根据测试用例设计的测试步骤进行具体的测试准备,即通过对被测程序的操作,利用测试工具录制自动执行测试的脚本并修改脚本增强脚本的健壮性。对于不适合自动化测试的功能点我们采用编写手工测试用例进行补充。经过软件测试用例设计过程中被测软件中的部分缺陷可能被发现。
本文采用的是笛卡尔积计算程序为蓝本进行测试,测试前需要根据源码及其测试需求来实现测试的执行。
根据源码及其需求说明书我们得知,笛卡尔积子程序使用语言为C++语言,开发编译环境为VC++ 6.0。
本程序进行测试采用C++ Test 来进行单元测试及静态测试。本文假定单元测试已通过,单元测试报告说明书已完成。表1-2为单元测试报告说明书中单元测试表。
开发项目名称 | 数值计算类程序 | 开发项目编号 | 201001010001 |
单元名称: | 笛卡尔积函数 | 责任人: | XXX |
单元所属子系统: | 集合运算 | 开发周期: | 1个月 |
代码测试 |
测试内容 | 测试人员 | 测试结果 | 备注 |
路经测试 | XXX | 已通过 | |
循环测试 | XXX | 已通过 | |
边界测试 | XXX | 已通过 | |
接口测试 | XXX | 已通过 | |
界面测试 | XXX | 已通过 | |
数据确认测试 | XXX | 已通过 | |
代码走查 | XXX | 未通过 | 程序中代码书写不规范 |
测试结论 | 单元测试无已通过误 | 项目第一责任人 | XXX |
项目经理 | XXX | 测试经理 | XXX | 总工程师 | XXX |
测试日期: | 2010-03-01 | 备注: | |
| | | | | | | |
表1-1 单元测试报告表
看到以上单元测试报告,在此我们先来简单讨论以下单元测试的重要性。
一个程序里面没有单元测试没有任何说明文件也许你读得懂代码也明白其意思,但我怎么知道它的功能就是它应该具备的功能呢?我怎么知道开发他的人没有写出错误呢?
单元测试是程序员自己来进行测试的。程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。
以下为单元测试结束时应提交的单元测试报告中程序错误位置表 如表1-2 所示,及程序错误报告表 如表1-3 所示
程序错误位置 | 具体内容描述 | 测试人员 | 开发人员 | 测试时间 |
错误位置1 | 头文件 | XXXX | XXXX | 2010-03-10 |
错误位置2 | 数组定义 | XXXX | XXXXX | 2010-03-10 |
错误位置3 | 主函数类型 | XXXX | XXX | 2010-03-10 |
………… | ………… | ………… | ………… | ………… |
错误位置n | ………… | ………… | ………… | ………… |
表1-2程序错误报告表
系统名称:数值计算程序 |
测试项目 | 笛卡尔积计算 | 测试类型 | 功能测试 |
模块名称 | 模块名称 | 版本 | 1.0beat |
测试时间 | 2010-03-10 | 测试批次 | 1 |
序号 | 错误等级 | 错 误 描 述 | 修改情况 | 复 核 |
1 | 高 | 数组未定义大小 | 已修改 | XX |
2 | 中 | 头文件定义有误 | 已修改 | XX |
3 | 中 | 主函数未定义类型 | 已修改 | XX |
4 | 高 | 变量定义有问题 | 已修改 | XX |
5 | | | | |
6 | | | | |
7 | | | | |
测试人: | XXX | 备注: | 问题已修正程序可以正常使用 |
| | | | | |
表1-3 单元测试程序错误报告
表1-4 为C++Test 为我们生成的测试结果,其中包括测试的模块,测试中用到的测试用例及测试完成情况。
Unit Testing (Native) |
File: li_axb.cpp | [OK=3 FLD=8 ERR=0 / TST=11 TOT=11 of 11] |
GLOBAL SYMBOLS | [OK=3 FLD=8 ERR=0 / TST=11 TOT=11 of 11] |
Function: void li_axb(int [5], int [5], int, int) | [OK=3 FLD=7 ERR=0 / TST=10 TOT=10 of 10] |
AUTO_1_AF_0 | ARGS: a={0 (0x00000000),-1 (0xffffffff),-19324 (0xffffb484),-1 (0xffffffff),2 (0x00000002)}, b={-1000424 (0xfff0bc18),-2147483648 (0x80000000),2 (0x00000002),-1 (0xffffffff),-1 (0xffffffff)}, m=2 (0x00000002), n=0 (0x00000000) | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | |
AUTO_1_AF_1 | ARGS: a={2147483647 (0x7fffffff),0 (0x00000000),1 (0x00000001),-4737 (0xffffed7f),-1 (0xffffffff)}, b={2 (0x00000002),2 (0x00000002),-2147483648 (0x80000000),1 (0x00000001),2 (0x00000002)}, m=-2147483648 (0x80000000), n=2147483647 (0x7fffffff) | POSTARGS: a={2147483647 (0x7fffffff),0 (0x00000000),1 (0x00000001),-4737 (0xffffed7f),-1 (0xffffffff)}, b={2 (0x00000002),2 (0x00000002),-2147483648 (0x80000000),1 (0x00000001),2 (0x00000002)}, m=-2147483648 (0x80000000), n=2147483647 (0x7fffffff) | PRE: ::ostream_withassign() | POST: cout={::ios={...},::ostream={...}} | |
AUTO_1_AF_2 | ARGS: a={-5041461 (0xffb312cb),2 (0x00000002),-1 (0xffffffff),-1 (0xffffffff),2 (0x00000002)}, b={-601551 (0xfff6d231),15 (0x0000000f),-2147483648 (0x80000000),-175 (0xffffff51),555056 (0x00087830)}, m=0 (0x00000000), n=2 (0x00000002) | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | |
AUTO_1_AF_3 | ARGS: a={238 (0x000000ee),1 (0x00000001),2 (0x00000002),1 (0x00000001),2 (0x00000002)}, b={2147483647 (0x7fffffff),156 (0x0000009c),-1 (0xffffffff),2147483647 (0x7fffffff),-2147483648 (0x80000000)}, m=147 (0x00000093), n=-1 (0xffffffff) | POSTARGS: a={238 (0x000000ee),1 (0x00000001),2 (0x00000002),1 (0x00000001),2 (0x00000002)}, b={2147483647 (0x7fffffff),156 (0x0000009c),-1 (0xffffffff),2147483647 (0x7fffffff),-2147483648 (0x80000000)}, m=147 (0x00000093), n=-1 (0xffffffff) | PRE: ::ostream_withassign() | POST: cout={::ios={...},::ostream={...}} | |
AUTO_1_AF_4 | ARGS: a={1 (0x00000001),0 (0x00000000),32084884 (0x01e99394),-232459 (0xfffc73f5),1 (0x00000001)}, b={-32171 (0xffff8255),-2147483648 (0x80000000),-1 (0xffffffff),-1 (0xffffffff),718 (0x000002ce)}, m=1 (0x00000001), n=0 (0x00000000) | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | |
AUTO_1_AF_5 | ARGS: a={1 (0x00000001),0 (0x00000000),-1 (0xffffffff),1 (0x00000001),-1 (0xffffffff)}, b={1 (0x00000001),2147483647 (0x7fffffff),-2147483648 (0x80000000),2 (0x00000002),2147483647 (0x7fffffff)}, m=1 (0x00000001), n=1 (0x00000001) | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | |
AUTO_1_AF_6 | ARGS: a={2 (0x00000002),0 (0x00000000),1 (0x00000001),0 (0x00000000),1 (0x00000001)}, b={7227 (0x00001c3b),2 (0x00000002),0 (0x00000000),1 (0x00000001),-2147483648 (0x80000000)}, m=0 (0x00000000), n=2 (0x00000002) | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | |
AUTO_1_AF_7 | ARGS: a={2147483647 (0x7fffffff),282951334 (0x10dd7ea6),2118369534 (0x7e43c0fe),-2147483648 (0x80000000),0 (0x00000000)}, b={1 (0x00000001),-1 (0xffffffff),2147483647 (0x7fffffff),2 (0x00000002),1 (0x00000001)}, m=827 (0x0000033b), n=2147483647 (0x7fffffff) | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | |
AUTO_1_AF_8 | ARGS: a={2147483647 (0x7fffffff),-2147483648 (0x80000000),-1 (0xffffffff),2 (0x00000002),1 (0x00000001)}, b={2 (0x00000002),1 (0x00000001),2 (0x00000002),0 (0x00000000),-1 (0xffffffff)}, m=0 (0x00000000), n=2 (0x00000002) | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | |
AUTO_1_AF_9 | ARGS: a={-1 (0xffffffff),2 (0x00000002),-1 (0xffffffff),2147483647 (0x7fffffff),236 (0x000000ec)}, b={2147483647 (0x7fffffff),2 (0x00000002),-2147483648 (0x80000000),1 (0x00000001),2147483647 (0x7fffffff)}, m=0 (0x00000000), n=-152602 (0xfffdabe6) | POSTARGS: a={-1 (0xffffffff),2 (0x00000002),-1 (0xffffffff),2147483647 (0x7fffffff),236 (0x000000ec)}, b={2147483647 (0x7fffffff),2 (0x00000002),-2147483648 (0x80000000),1 (0x00000001),2147483647 (0x7fffffff)}, m=0 (0x00000000), n=-152602 (0xfffdabe6) | PRE: ::ostream_withassign() | POST: cout={::ios={...},::ostream={...}} | | |
Function: void main(void) | [OK=0 FLD=1 ERR=0 / TST=1 TOT=1 of 1] |
AUTO_1_BF_0 | PRE: ::ostream_withassign() | Post condition failed for execution result type: | expected type: Normal return | obtained type: Access violation exception | Access violation exception | at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | Stack trace: | 'ostream & flush(void)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 65 | 'ostream & flush(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 143 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'ostream & endl(ostream &)' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 144 | 'ostream & operator<<(ostream &(__cdecl *)(ostream &))' at C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/ostream.h : 112 | 'void li_axb(int [5], int [5], int, int)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 11 | 'void main(void)' at C:/Documents and Settings/Administrator/Cpp1.cpp : 26 | | |
表 1-4 C++Test 单元测试执行报告说明书
从结果中我们可以看到C++Test 为我们详细标明了生成的测试用例,测试执行情况,通过情况等等。如:红色用例名称为错误用例,绿色名称用例为已通过用例。
(2)测试执行
在测试执行过程中,利用测试工具针对被测软件自动回放测试用例脚本,经过多次回放自动化脚本,测试工具会自动记录测试信息。如果脚本在回放中出现问题,则将测试失败的信息及时记录到缺陷跟踪数据库中,并建立优先级。在执行测试过程中。主要是出现的问题进行验证、查错,从而确定缺陷发生发范围和缺陷发生的环境。
根据测试进度及执行计划表,此处主要针对功能测试来进行介绍。下面先来介绍以下功能测试。对测试对象的功能测试侧重于所有可直接追踪到用例或业务功能和业务规则的测试需求。功能测试的目标是核实数据的接受、处理和检索是否正确,以及业务规则的实施是否恰当。功能测试基于黑盒技术,该技术通过图形用户界面(GUI)与应用程序进行交互,并对交互的输出或结果进行分析,以此来核实应用程序及其内部进程。
源于此程序较短,比较容易实现对其功能测试,因此本文再次使用VC++ 6.0对其采用手工测试来进行功能测试。
表1-5为功能测试用用例及其结果报告。
用例编号 | IO-201003010001 | 测试优先级 | 1 | 用例级别 | 重要 |
用例设计者 | XXXX | 设计日期 | 20100301 | 对应需求编号 | RIO-201003010001 |
功能描述 | 计算笛卡尔积并输出 |
输入/动作 | 期望输出/响应 | 实际结果 |
A={0,1,2},B={0,3,4,5} | {<0,0><0,3><0,4><0,5><1,0><1,3><1,4><1,5><2,0><2,3><2,4><2,5>} | {<0,0><0,3><0,4><0,5><1,0><1,3><1,4><1,5><2,0><2,3><2,4><2,5>} |
A={0,0,0},B={0,0,0,0} | {<0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0>} | {<0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0><0,0>} |
A={a,b,c},B={d,e,f,g} | 源程序提示输入数值有误 | 未提示输入有误 |
测试日期 | 2010/3/22 |
结论 | 未通过 |
表1-5 功能测试用用例及其结果报告表
功能测试结束后下一步按照测试进度及计划说明书应依此进行性能测试、集成测试、确认测试、系统测试及验收测试。如果程序需要进行安装使用还应进行安装与反安装测试。
五、测试评估及测试报告的编写
测试执行结束后就需要立即对本次测试进行测试评估。
测试的评估是客户比较关心的地方,它是客户对整个测试的进行计测试的完成情况进行了解,用户依据测试评估对整个项目所产生缺陷的趋势进行分析。依据测试评估书写测试报告。用户依据测试报告了解整个测试活动中所用到的软硬件的测试、测试工具、测试人员、测试资源消耗、测试缺陷分类和描述、以及测试缺陷优先级和对被测软件的各模块和总体评价。
测试报告中程序错误报告包括3张表:程序错误位置报告表、程序错误严重性描述表、程序错误报告表。
其中测试程序错误位置报告表及程序错误报告表详见本文表1-3及表1-4。
以下为程序错误严重性描述表
问题严重性 | 内容描述 | 影响位置 | 测试员 |
高 | 数组未定义大小 | 函数初始化 | XXXX |
中 | 头文件定义有误 | 函数编译 | XXXX |
中 | 主函数未定义类型 | 函数编译 | XXXX |
低 | | | |
表1-6 程序错误严重性描述表
六、结束语
测试只是一种手段对软件质量状况进行验证和评估的一种有效手段,不管采取什么测试手段和采用什么样的测试工具不可能证明软件没有错、很难做到100%的覆盖软件,通过测试、通过建立规范的测试流程实现专业化的软件测试,对提高软件产品质量、降低软件生产成本是非常有用的。
本文至此以结束,作者希望借此抛砖引玉,希望更多朋友来进行讨论,让我们一起学习进步。