1. 目的
本方案主要实施
NC
产品程序代码的白盒测试。使界面符合设计规范,适用于用户;保证程序创建的类与接口的完整与正确,以及程序模块单独正常运行。保证局部模块功能完备性,运行正确性与稳定性。
2. 测试项
所要测试的类。如:
nc.ui.bd.*
nc.bs.bd.*
nc.vo.bd.*
3. 测试依据
1.
NC产品需求报告;
需求规格说明书、用例描述清单
2.
设计文档;(OOA、OOD、CRC卡)
如:AOM(
Analysis Object Model
)表示类间的静态关系,是多个相关的用例共用的。
ASD(
Analysis Sequence Diagram)
是按业务工作的顺序表示每一工作步骤执行时类间的动态关系。一个用例对应一个
ASD
。
CRC (
Collaborators & Responsibilities Card
)卡是一个类的完整表述
3.
界面规范
4.
编码规范
5.
开发命名标准
4. 通过的准则
1.
界面测试通过的标准:界面的样式、大小、颜色、整体布局的设置;各种标签控件的使用及主题描述以及事件源控件的使用、快捷键使用都应符合《
NC
系统应用框架需求报告》和《设计文档的相关规范》。
2.
程序代码通过的标准:创建的类、接口、方法、属性应与《设计文档》保持一致;程序的各种命名、注释、代码行的格式等应符合《程序开发命名标准》和《编码规范》;程序模块能独立稳定运行。
5. 测试环境配置
1
测试工具:
2
软件环境:
Client
端:
操作系统:中文
WINNT/2000
开发环境:
VA3.5
专业版
待测试的源码包
Server
端:
操作系统:
WIN NT4.0
开发环境:
VA3.5
专业版
通讯环境:
Servlet
3
DB Server
端:
DBMS
:
SQL SERVER
4
资源文件
6. 白盒测试总流程
测试流程依据,请参见《代码层次结构规范》。
NC
系统中的对象主要分为如下几种:
·
界面对象
(UIObject)
·
数值对象
VO(ValueObject)
·
业务对象
BO(BusinessObject)
·
数据管理对象
DMO(DataManageObject)
测试流程可按二种方式,其优缺点对照:
BO
DB
DMO
UI
VO VO
DB
UI
BO
DMO
前者:优点是便于测试者从界面层直观地录入数据,缺点是做回归测试时,录入数据需重复
后者:
原则是从底层测试,底层测试通过了,再依次往上一层测试;否则不需往上层测试
缺点:需给中间层做一测试小程序:根据程序中类的对象构造输入数据及将结果输出到控制台上,(可通过自行设计测试工具来改善,测试工具需求另附)
优点:做回归测试时,不用再构造输入数据,只要再执行一遍小测试程序
7. 测试步骤:
需要列出所测试类的调用关系和关键方法的调用关系(依据为数据流)。
(
1
) 类关系图。
(2)
方法的功能调用关系图:只需要列出一些调用关系较复杂的方法。
1. 配置好测试环境;
2. 编写测试用例;
另附
3. 静态测试,走查代码;
代码走查使用测试用例启发检测错误,沿程序逻辑走一遍
,
检测程序结构和实现上是否有问题
4. 动态测试
·
界面初始化状态测试;
·
界面控件功能测试;(正反用例);
·
业务功能测试(正反用例);
·
数据流关联测试(涉及多表的增、删、改),并结合数据库表的
字段、外键、字段类型、精度、小数位数、非空、默认值、备注、数据对象等。
·
数据传递和接收一致,数据计算或处理后状态正确;
·
组合模块整体运行稳定,不出现死机;
1. 确定问题属性:
分为四类:错误、缺陷、失效、故障
错误是指计算值、观测值、测量值之间,或条件与真值之间,不符合规定的或理论上的正确值或条件
缺陷是指与期望值或特征值的偏差
故障是指功能部件不能执行所要求的功能。故障可能由错误、缺陷或失效引起。
失效是指功能部件执行其功能的能力丧失,系统或系统部件丧失了在规定限度内执行所要求功能的能力
2. 确定问题类别:
问题类别分为以下几大类
:
1.
各层公用问题
|
2.JAVA
语言规范
|
3.
数据类型
|
4.SQL
语句规范
|
5
界面
UI
|
6.VO
数值对象
|
7.BO
业务对象
|
8.DMO
数据管理对象
|
9.
业务逻辑重点
|
10.
事务处理与隔离级别测试(详见总体技术部相关文档)
|
11
.效率测试(详见总体技术部相关文档)
|
1. 填写测试报告
测试记录需详细填写具体实施方法中的相关列表;
上交的测试报告只需填写未通过的项。
(
详见第
10
节
)
8. 具体实施方法:
8.1). 各层公用问题:
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
T1
|
代码与设计对照
|
按需求、
UI,CRC
设计文档与编码对照
,
看是否完全地实现了所有的
UI
设计文档和
CRC
卡中规定的内容?
|
完备性
|
错误
|
|
T2
|
代码与设计对照
|
按需求、
UI,CRC
设计文档与编码对照
,
看是否创建了所需的数据库或其他初始化数据文件?
|
完备性
|
错误
|
|
T3
|
参数
返回值
|
方法中被传递参数的类型、个数、顺序及返回值是否正确?以符合
UI
设计文档和
CRC
卡为准。
|
正确性
|
错误
|
|
T5
|
参数的传递
|
当方法需要调用其它方法时,调用的参数是否正确?(
UI
设计文档和
CRC
卡中有调用说明)
|
正确性
|
错误
|
|
T6
|
命名
|
是否按《命名规范》进行了类、方法、变量、属性的命名?
|
正确性
|
错误
|
|
T7
|
公式
|
代码中的公式是否使用了设计文档中的相应数学公式。
|
正确性
|
错误
|
|
T8
|
注释
|
注释是否使用简洁明了的语言对每一个方法都进行了充分必要的描述?是否对复杂的代码进行了注释?当程序的运行是受某些特殊因素限制时,是否做了限制注释?是否列出限制模块运行特性的全部特殊因素?
|
易理解性
|
缺陷
|
|
T9
|
冗余语句和变量
|
是否存在永远执行不到的语句和变量,而降低了程序的可理解性?
|
易理解性
|
缺陷
|
|
T10
|
程序是否冗余
|
对于程序中的大量重复内容,是否使用了专门的类来实现?
|
可验证性
|
缺陷
|
|
T11
|
代码整体规范
|
是否自始至终使用了《程序员开发手册》和《编码规范》中要求的格式、调用约定、结构等?
|
一致性
|
缺陷
|
|
T12
|
代码与书写注释
|
在一个函数内代码的长度不允许超过
100
行。建议如果一个函数的代码长度超过一个屏幕,那么或许这个函数太长了。
使用统一的格式化代码。将
‘
{
’
放在所有者的后面,并且在下一行代码前加入
TAB
键缩进;(
TAB
键比用若干个空格更容易控制使用统一的缩进距离)
类的注释;
接口的注释;
函数的注释;
类属性的注释;
局部变量的注释;
请详见:《代码与注释书写风格规范》
|
易理解性
|
缺陷
|
|
TT13
|
包
|
命名是否符合程序包命名规范
|
|
|
|
TT14
|
类
|
1.
创建的属性(字段)是否完整,类型与命名是否规范,注释是否清楚合理。
2.
创建的方法是否完整;命名是否规范;修辞是否正确;参数,参数类型,返回类型是否正确。
3.
调用的方法和传递的参数是否正确。
1.
参数传递、返回值是否正确
2.
特殊校验、处理是否有注释
|
|
|
|
TT15
|
类命名
|
第一个字母大写的英文正常语序
每个功能点的主程序(通常继承系统管理框架)统一采用
ClientUI
类名称。
业务逻辑代码类以
BO
结尾,如:
GeneralLedgerBO
数值对象类以
VO
结尾,如:
EmployeeVO
数据管理对象类以
DMO
结尾,如:
EmployeeDMO
查询对象类以
QO
结尾,如:
EmployeeQO
非参照对话框类以
Dlg
结尾,如:
EditEmployeeDlg
参照对话框类以
Ref
结尾,如:
WorkCenterRef
面板类以
Panel
结尾,如:
GeneralLedgerPanel
|
|
|
|
TT16
|
接口
|
接口名的开头加上字母
‘
I
’
前缀
从第二个字母起,用首字母大写的英文单词描述
|
|
|
|
TT17
|
方法
|
1
.是否正确定义了此方法(包括修辞词、返回类型、参数、参数类型)
2
.注释是否清楚
3
.命名是否正确:
·
方法函数名的第一个单词小写,后面的单词第一个字母大写;
·
第一个单词必须是动词,使函数的意义清晰明了;
·
存取对象的属性使用
setXXX()
和
getXXX()
函数形式
·
访问布尔类型的属性可以使用
isXXX
()函数
|
|
|
|
TT18
|
类属性
|
·
所有类属性全部以
m_
开头,同其它变量区分开。
·
集合类型的域,如数组、向量,必须使用复数形式来指出它们多值特性。
·
所有的域都是私有的,用并且仅用
getXXX
和
setXXX
等的存取函数去访问域
,
。
·
存取函数的可见性尽量为
protected
属性的,
getter
函数可以是
public
属性的
·
存取函数的命名规则是:
getter
函数
= get +
域名
(非布尔类型域)
is +
域名
(布尔类型域)
setter
函数
= set +
域名
|
|
|
|
TT19
|
常量
|
常量的命名全部使用大写。用下划线来分隔单词。
MAX_VALUE
START_DATE
MINIMUM_BALANCE
|
|
|
|
TT20
|
类所实现的功能
|
是否实现了要求的所有功能
|
|
|
|
TT21
|
类中的校验方法
|
1
界面级的校验是否齐全
2
业务级的校验是否齐全
|
完备性
|
错误
|
|
TT22
|
继承性
封装性
多态性
|
面向对象程序是否体现继承、封装和多态的特性?
|
|
|
|
TT23
|
面向对象特性
|
面向对象程序中,编写类的方法时,是否同时考虑基类方法(
Base::Function()
)的行为和继承类方法(
Derived::Function()
)的行为
|
|
|
|
TT24
|
数据封装性
|
数据成员是否满足数据封装的要求。
有时强制的类型转换会破坏数据的封装特性。例如:
class Hiden
{private:
int a=1;
char *p= "hiden";}
class Visible
{public:
int b=2;
char *s= "visible";}
…
..
…
..
Hiden pp;
Visible *qq=(Visible *)&pp;
在上面的程序段中,
pp
的数据成员可以通过
qq
被随意访问
|
|
|
|
TT25
|
类中成员方法
|
以
OOD
为依据,类中成员方法是否实现了设计中所要求的功能;如通过
OOD
仍不清楚,则还应依据
OOA
、及需求报告说明书
|
|
|
|
|
|
|
|
|
|
8.2). JAVA语言规范走查内容
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
J1
|
下标
|
是否有下标变量越界错误?
|
健壮性
|
错误
|
|
J2
|
除数
|
是否包含有除零错误的可能?
|
健壮性
|
错误
|
|
J4
|
Get
方法
|
当对一个不知是否为空的对象取其属性值会引起空指针异常。如果空指针异常没有被接收程序将终止。例如:
BusinessData1.getBusinessDate2.getOid()
当
BusinessData1.getBusinessDate2
为
null
时,
BusinessData1.getBusinessDate2.getOid()
将发生异常
|
健壮性
|
错误
|
|
J5
|
字符串
|
在字符串比较和将字符串写入数据表前应
Trim()
掉它的前后空格。
|
健壮性
|
错误
|
|
J6
|
字符串连结符
"+"
|
将字符串连结操作中的
+
操作符同加法运算中的
+
操作混淆将导致奇怪的结果。例如:
y
为
int
类型,
y
的值为
5
,
g.drawString("y+2="+y+2,30,30);
将显示
y+2=52
|
正确性
|
错误
|
|
J7
|
Float
double
|
不要用等于或不等于来比较浮点值,而应该判断其差别是否小于某一指定小的值。例如:
89.6
实际可能为
89.59999232458
|
正确性
|
错误
|
|
J8
|
Float
double
|
不要对浮点值用做计数循环,应用整型值。
|
正确性
|
错误
|
|
J9
|
Float
double
|
不要使用类型
float
或者
double
的变量执行精确的金融计算。浮点数的不精确会导致引起不正确金融计算的错误。可定义若干类来完成不同的金融计算。
|
正确性
|
错误
|
|
J10
|
switch
|
switch
语句的末尾如果没有
defaul
语句将会不利于处理异常。
|
健壮性
|
缺陷
|
|
J11
|
switch
|
是否在
switch
结构中的每一个
case
语句体结束时都有
break
语句?
|
正确性
|
错误
|
|
J12
|
if
语句
|
在
if
语句体右括号后紧跟一个分号常常是一个错误,会使
if
语句成为顺序语句。
|
正确性
|
错误
|
|
J13
|
循环语句
|
通过循环语句对一
Vector
型变量赋值时
,
其
Vector
变量的实例化语句是否被错误地包含在循环体内?
|
正确性
|
错误
|
|
J14
|
循环语句
|
注意循环的条件中是否有差
1
的现象?
|
正确性
|
错误
|
|
J15
|
循环语句
|
代码是否有无穷循环的可能?
(
循环条件永远为真
)
|
可预测性
|
错误
|
|
J16
|
数值范围
|
是否存在溢出错误
|
|
|
|
J17
|
This
Super
|
This
和
Super
的用法是否正确
|
|
|
|
J18
|
构造子
|
是否缺少构造子方法
|
|
|
|
J19
|
方法声明、参数、
返回值
|
方法声明错误
参数错误
返回值错误
|
|
|
|
J20
|
计算
|
计算错误
|
|
|
|
J21
|
比较
|
比较错误
|
|
|
|
J22
|
控制流
|
控制流错误
|
|
|
|
J23
|
类的修饰符
|
修饰符是否符合以下原则:
Public
用于对所有的类可见,
Private
用于对本类可见
Protected
不仅用于对子类可见,也用于对同一个包的其它所有类可见
|
|
|
|
|
|
|
|
|
|
8.3). 数据类型:
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
D1
|
Null
转化
|
在设置值对象
VO
时,在
VO
内部是否将空串
""
将转化
null
,数值型数据
(
整数、浮点数
)null
转为
0
。
*
|
|
|
|
D2
|
Null
转化
|
在取得
VO
元素放到界面时(如放到
UITextField
)是否根据需要将
null
转化为
""
或
"0"
或
”
0.0”
。
|
|
|
|
D4
|
控件数据类型的转换
|
编辑控件数据类型是否与表中对应字段数据类型一致
1
.
UITextField
文本域数据类型在
nc.ui.pub.beans.textfield
包的
UITextType
接口中定义了
TextStr
、
TextInt
、
TextDbl
、
TextDate
和
TextDateTime
等
5
类,但布尔型使用
UICheckBox
或
UIRadioButton
控件,故没有定义布尔型。
|
|
|
|
D5
|
UFDouble
的使用
|
去掉原
UFCurrency
类型,重新封装
UFDouble
,所有的数值型及运算是否采用
UFDouble
。
|
|
|
|
D6
|
UFDateTime
的使用
|
去掉原
UFTime
类型,重新封装
UFDateTime
。
|
|
|
|
D7
|
某些数据封装类型的禁用
|
禁止使用的数据封装类型,如
Boolean
、
Short
、
Long
、
Float
、
Double
、
Date
。
|
|
|
|
D9
|
双精度型
控件的范围控制
|
对双精度型控件是否控制最大长度范围:
如:对双精度型,数据库表中字段设为
Decimal
类型,
pricision
为
20
位,
Scale
为
8
位
则需加入语句:
ivjtxtShipUnitNum.setMaxLength(
20
);
ivjtxtShipUnitNum.setNumPoint(
8
);
|
|
|
|
D11
|
最大长度的设置
|
设置最大长度
MaxLength(
默认
20
位、对
TextDate
与
TextDateTime
无效
)
,
|
|
|
|
D12
|
小数位数的设置
|
设置小数位数
NumPoint(
默认
4
位、只对
TextDbl
有效
)
|
|
|
|
D13
|
禁止输入字符的设置
|
设置禁止输入的字符
DelStr
,整数和浮点数也可设置禁止字符串
,
如
:
//
禁止输入负数
setTextType("TextStr");
setDelStr("-");
//
只输入数字型字符
setTextType("TextDbl");
setDelStr("-.");
|
|
|
|
D14
|
对齐方式
|
整数和浮点数默认右对齐,其它左对齐,可以改变
|
|
|
|
D15
|
左边字符锁定的设置
|
设置左边字符锁定
(1)setFixText(String)--
设置串并锁定和字符串相同的长度
(2)setFixText(String
,
int)--
设置串并锁定参数给定的长度
(3)setFixTextLen(int)--
锁定参数给定的长度
(4)setText(String)--
设置串并取消锁定
任何设置都会修改以前设定的锁定长度
|
|
|
|
8.4). SQL语句规范:(详见数据库处理规范)
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
S1
|
书写规范
|
语句全部用小写
|
|
|
|
S2
|
SQL
语法
|
·
禁止使用
“
select * from ”
语法。
·
禁止使用
“
insert into table_name values(?,?,……)”
语法,
·
统一使用
“
insert into table_name (col1,col2,……) values(?,?,…...)”
。
|
|
|
|
S3
|
SQL
语法
|
如果在语句中有
not in
(
in
)操作,是否考虑用
not exists
(
exists
)来重写。
|
|
|
|
S4
|
类型转换
|
避免显式或隐含的类型转换。例如在
where
子句中
numeric
型和
int
型的列的比较
|
|
|
|
S5
|
|
当
SQL
语句含有运算符时,运算符需与其他字符串用空格区分。否则容易导致以下类似问题。在语句
select a–b from table
中,
a
,
b
均为变量。拼写该语句时,如果
a=6
,
b= -3
,则语句变为
select 6--3 from table
。
--
变为
Sql
的注释,语句报错
|
|
|
|
S6
|
查询优化
|
为提高索引的效率,查询路径优化(尤其是要尽力减少查询嵌套)。
|
|
|
|
S7
|
视图
|
使用静态视图,不允许动态创建视图,索引,存储过程等数据库对象
|
|
|
|
S8
|
Null
|
不能将
Null
与
空串
“”
视为相同
|
|
|
|
S9
|
多表连接
|
1.SQL
语句包含多表连接时,是否加上表的别名。
3.
子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询。
例如:
select name from customer where customer_id in ( select customer_id from order where money>1000)
。应该用如下语句代替:
select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100
。
3.
多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下
select sum
(
table1.je
)
from table1 table1, table2 table2, table3 table3 where (table1
的等值条件(
=
)
) and (table1
的非等值条件
) and (table2
与
table1
的关联条件
) and (table2
的等值条件
) and (table2
的非等值条件
) and (table3
与
table2
的关联条件
) and (table3
的等值条件
) and (table3
的非等值条件
)
。
|
|
|
|
S10
|
复杂
SQL
语句
|
对复杂
SQL
语句必须单独测试:如多表查询拚写语句是否符合业务要求
|
|
|
|
S11
|
多数据库适配
|
1.Sql
语句转换类。调用方法:
SqlTranslator trans = new SqlTranslator(); destSql = trans.getSql(sourceSql, databaseType)
。
2
.提供
SQLException
信息转换。同一个
SQL
在不同数据库操作,
JDBC
返回的错误号以及错误信息不同。
SQLException
信息转换器将不同
JDBC
返回的错误号统一为以
Sql Server7.0
为准,错误信息仍以不同
JDBC
返回的错误信息为主
|
|
|
|
S11
|
多数据库适配
|
3
.
SQL
语法限制
1
字符串连接必须用
“
||”
符号。例如:
select f1 || f2 from test
:而不是:
select f1 + f2 from test
;
如果用
“
+”
号,则
Oracle
不支持。
2
左连接的写法必须带
“
outer”
关键字。例如:
select f1 from t1 left outer t2 on t1.f1 = t2.f1
;而不是:
select f1 from t1 left t2 on t1.f1 = t2.f1
。
3
参与左连接的列不能为常量例如,不允许如下语句:
select * from t1 left outer join t2 on t1.f1='A'
。
4
在
Case when
语句中只能出现
=
、
>=
、
<=
以及
is null
运算符,不能出现
<
、
>
、
<>
、
!=
、以及
is not null
运算符。
否则在
Oracle
的
decode
函数无法表达。
5
在
Case when
语句中参与比较的列只能有一个。例如不能使用如下
case……when
语句:
case when f1 > 1 then …...when f2 > 1 then ……end
。
6
在对
char
类型比较时,要对列加上
rtrim()
函数,否则在
Oracle
中不会得到正确结果。
7
在
Delete
、
Update
、
Insert
、
Select
语句中
char
类型的数值引用使用单引,
例如语句:
Insert into t vlaues(“book”,5)
在
SQL Server
中可以使用,而在
Oracle
、
DB2
中不支持。应为:
Insert into t vlaues(‘book’,5)
。
8
通配符不能使用
‘
[a-c]%’
这种形式,应写成如:
select * from table_name where col1 like ‘[a]%’ OR col1 like ‘[b]%’ OR col1 like ‘[c]%’
。
9
不能通过来
top n/percent
限制查询结果集的记录数,
oracle
不支持
10
Union
、
order by
、
Group by
、
having
、
between…and
、
in
、
exists
、
is null
用法一致
|
|
|
|
S12
|
函数
|
不允许动态创建函数。
|
|
|
|
8.5). 界面UI层:
为提高测试效率
,
界面
UI
层测试可将黑盒测试技术和白盒测试技术结合起来进行测试
1. 代码规范:
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
UI1
|
继承类
|
1
.从
ToftPanel
继承一个类。每个界面类都要继承
ToftPanel
:
public class myUI extends ToftPanel{…}
|
|
|
|
UI2
|
添加按钮
|
2.
是否为界面类添加它需要的按钮。
a)
添加按钮属性。
b)
添加按钮组属性
c)
将按钮设置到界面上。在构造方法中是否添加如下语句:
setButtons(m_aryButtonGroup);
|
|
|
|
UI3
|
响应按钮
|
3.
响应按钮。在
onButtonClicked(ButtonObject bo)
方法中,处理按钮事件:
public void onButtonClicked(ButtonObject bo) {
if (bo == m_boNormalButton) {
onNormalButtonClicked();
} else if (bo == m_boXxxButton) {
// other button disposing
}
|
|
|
|
UI4
|
界面标题
|
4.
设置界面标题。在
getTitle()
方法中,返回界面的标题:
public String getTitle() { return "
我的标题
"; }
|
|
|
|
UI5
|
其他业务代码
|
5.
完成其他业务代码。
在完成业务代码时,可能需要用到帐套编码、单位编码、用户编码等信息,这些信息保存在
ClientEnvironment
类中。你可以在
ToftPanel
的继承类中使用方法
getClinetEnvironment()
获得一个
ClientEnvironment
|
|
|
|
UI6
|
客户端调用
BO
对象
|
对在客户端用到的每个
BO
类
XxxBO
,都要生成一个客户端的代理类
XxxBO_Client
。
XxxBO_Client
和
XxxBO
的方法一一对应,
XxxBO_Client
实际上是
XxxBO
对象在客户端的一个包装。在
UI
层中,只使用
XxxBO_Client
访问
BS
层。例如:如果你要调用
XxxBO
类中的一个
update(MyVO vo)
方法,那么在客户端的代码是:
XxxBO_Client.update(vo);
|
|
|
|
UI7
|
对话框须继承和使用的类
|
对话框继承
nc.ui.pub.beans.UIDialog
对于提供消息的对话框,使用
nc.ui.pub.beans.MessageDialog
,不允许使用
javax.swing.JOptionPane
,因为
JOptionPane
在浏览器中运行时存在问题
|
|
|
|
UI8
|
表格模型须继承和使用的类
|
表格模型继承
nc.ui.pub.beans.table.VOTableModel
或使用
NCTableModel
|
|
|
|
1. UI功能测试
分为两个主要手段:
·
非正常用例手段:此阶段主要是采用不合法的输入数据和非正常的操作手段。测试系统的错误控制与处理能力。保证系统不死机,能正常稳定运行。
·
正常用例手段:此阶段主要采用合法的业务数据,正常的操作手段。保证
UI
符合设计要求和操作习惯,能正常稳定运行,能正确处理业务数据。
1
、界面规范测试
|
2.
界面初始化测试
|
3
、编辑控件(除功能按钮以外的控件)应用测试;
|
4
、通用对话框测试
|
5
、参照框测试;
|
6
、状态栏测试
|
7
、业务功能测试(新建、保存、删除、查询、浏览、退出)
|
8.
界面级校验测试
|
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
| |
UI20
|
界面规范测试
|
1
同一界面,不能同时在同一屏上打开多个。
2
菜单、控件的一致性测试:与设计文档相比较。主要查看菜单与控件是否齐全,控件的类型是否正确。
3
界面的整体布局测试:控件的整体布局是否协调,颜色,尺寸是否合理。具有操作逻辑的控件,其摆放的先后位置是否合理。
4
图标、标题、标签测试:各种图标使用是否符合规范;标题文本、标签文本是否正确合理。
5
控件的鼠标提示文本测试:是否有鼠标提示,提示文本是否正确合理(针对重要的控件)。
|
|
|
| |
UI21
|
界面初始化测试
|
1.
“
增加
”
、
“
退出
”
、
“
浏览
”
按钮是否被激活,
“
取消
”
按钮是否变灰。
2.
界面是否自动列示最后(或最前)一条记录
?(
如在列表
/
卡片型界面中的卡片中
)
3.
各种标签文本和图标提示文本是否正确
|
|
|
| |
UI22
|
界面控件功能测试
|
1.
最小化、最大化、关闭按钮是否有效。
2.
菜单各种功能按钮是否有效。
3.
按增加按钮是否刷新界面,处于待输入状态。增加按钮、删除变灰,并激活取消、确定按钮。光标是否定位于第一个文本域内。
4.
文本域内是否能输入正常长度、数据类型的数据(各提示键显示的内容是否正确);可根据前面已知文本自动显示关联的文本是否自动显示。
5.
输入非正常的数据,系统是否有相应的错误提示,术语是否正确
6.
在增加状态下按取消按钮,是否放弃当前操作,返回前一界面,并激活增加按钮。
7.
按删除按钮是否能删除选中的记录。
8.
状态栏显示是否正确。
9
.是否响应键盘事件(
Enter,Delete,Tab
)
10
。按退出按钮是否能正常终止主应用程序。
|
|
|
| |
UI23
|
编辑控件的应用测试:
|
1
. 显示控件和编辑控件应该加以区分
2
.
.
属性是否齐全
3
. 控件的应用是否合理
4
. 能否正常接收数据,对非法类型数据是否进行了控制。
5
. 允许输入的数据长度是否符合要求。
6
. 控件的边界状态是否设定。如文本框的滚动条等。
7
. 是否有快捷键,快捷键是否有效。
8
. 主要的功能按钮是否响应键盘事件。(
Esc:
退出;
:
前删;
delete
:删除选定的项;
F1:
调出帮助;
F5:
调出定位或查找界面;
Enter:
确定和光标移动;
alt+F4:
调出参照框;键盘上的
4
个浏览按钮适用于树的扩展与伸收,及控件内部的光标移动,其中向下的箭头用于下拉框;
Tab:
用于控件的焦点移动;
Alt-
浏览按钮
:
用于选定菜单功能)
|
|
|
| |
UI24
|
通用对话框测试:
|
1
图标,标题是否正确。
2
标签,提示文本是否正确合理。
3
功能按钮是否齐全,是否合理有效。(包括关闭小按钮:
X
,相当于取消对话框的功能。)
|
|
|
| |
UI25
|
参照框测试:
|
参照:分树型、树表、列表型参照:
·
对于树型参照,是否应只显示末级记录,而不是所有记录
·
可选择参照编码,名称或者助记码
·
模糊参照和预过滤的功能
·
参照可以设置栏目
·
可以对参照记录进行快速匹配定位,且该定位记录自动显示在当前屏(目前存在此问题)
·
可以对参照记录进行主,次关键字排序,或者通过单击表头对任一列排序
·
参照的自动检查
·
参照文本框获得焦点时显示编码,离开显示名称
·
模糊参照:输入
01*
再按参照按钮,将只显示以
01
开头的记录
·
输入
0101????
显示编码为
8
为且以
0101
开头的记录
·
参照预定位,输入
01
,再按参照按钮,光标停在
01
开头的记录
·
双击参照表格的一行,结束参照并返回
·
对应参照返回的数据,在保存数据库时也要进行业务合法性检查,因为参照返回的数据不一定是数据库中存在的,可能在写数据库前基础数据已发生改变,
|
|
|
| |
UI26
|
状态栏测试
|
1
. 增加,修改,保存,删除等操作应在状态栏显示其操作状态(成功、失败等)。
2
. 随操作不同,状态应做相应的变化。
3
. 在查询大数据量时,是否有提示用户等待窗口。
|
|
|
| |
UI27
|
界面级校验测试
|
如.起始日期不能大于截止日期,如果大于是否有错误提示,提示文本是否正确。
|
|
|
| |
UI28
|
业务功能测试
|
系统初始化状态测试
|
1
. 系统初始化分为两种,初次使用本系统时各界面的初始化和再次使用本系统时各界面的初始化。主要测试各菜单和功能按扭的缺省状态(变灰与激活)是否合理;各种控件的缺省值是否正确。
2
.对于母子表的界面,注意母子表是否能同步显示,显示的明细记录是否正确。
|
|
|
|
UI29
|
新增:
|
·
操作逻辑是否合理(包括业务数据输入的先后顺序)。比如应先定位树节点,再按新增按钮;
·
按下新增按钮后,各功能按钮和菜单状态变化是否正确;界面的编辑框是否刷新(注意合理的保留值不应刷新);光标定位是否合理。
·
能否输入合法的数据;能否正常地调出参照框,并导入所需的数据(包括下拉框,参照对话框,右键菜单等)。能否正常修改或清除数据(需要注意参照框的此项要求)。
·
在没保存所编辑的记录时,进行其他操作,系统是否提示保存新增记录,对话框文本是否正确合理。
·
按保存按钮后,是否进行全面的逻辑校验(与设计文档相符),与正常的业务逻辑保持一致;提示文本是否正确合理,对话框能否正常操作(见非正常用例阶段的通用对话框测试描述)。退出对话框后光标定位是否合理。
·
能否正常保存数据。界面数据显示是否正确。菜单、其它功能按钮及控件状态变化是否合理。
·
能否查询到此记录,查询到的结果是否与输入的一致。
|
|
|
| |
UI30
|
修改:
|
·
能否正常修改数据。
·
不应该修改的编辑框是否锁死。
·
在没保存所编辑的记录时,进行其他操作,系统是否提示保存新增记录,对话框文本是否正确合理。
·
按保存按钮后,是否进行全面的逻辑校验(与设计文档相符),与正常的业务逻辑保持一致;提示文本是否正确合理,对话框能否正常操作(见非正常用例阶段的通用对话框测试描述)。退出对话框后光标定位是否合理。
·
能否正常保存修改数据,界面数据显示是否正确。菜单、其它功能按钮及控件状态变化是否合理。
·
能否查询到此记录,查询到的结果是否与输入的一致。
|
|
|
| |
UI31
|
删除:
|
·
删除分为记录删除和行删除两种。
·
删除操作逻辑是否合理。如先定位后删除,一次性删除多条等。
·
按删除按钮是否有提示,提示文本是否正确合理。
·
具有业务逻辑时,是否遵循逻辑删除规则,是否有提示,提示文本是否正确。
·
记录是否从界面上清除。是否显示上一条记录,菜单、功能按钮、各种编辑控件状态是否正确。
·
通过查询,验证是否正常删除。
|
|
|
| |
UI32
|
保存
|
·
按保存后是否进行所有的业务逻辑校验。是否有提示,提示文本是否正确。
·
保存后,记录是否从界面上清除。是否显示上一条记录,菜单、功能按钮、各种编辑控件状态是否正确。
|
|
|
| |
UI33
|
查找
|
·
输入正常的匹配值能否查询到合适的记录。
·
对于较长时间的查询是否有等待提示窗口。
·
注意条件为时间段的查询。
·
如果没有缺省条件,直接按查询按钮是否能查出所有的记录。
·
对于组合查询,应进行互相匹配验证查询。
·
注意通过双击记录带出明细的操作模式。
·
所有条件是否能单独和组合查询,列表框数据刷新是否正确。
|
|
|
| |
UI34
|
定位
|
输入合理的值,光标能否定位在适当的位置。
|
|
|
| |
UI35
|
退出
|
·
在新增或修改状态直接退出,系统是否提示保存,提示文本是否正确。
·
能否正常退出操作界面。
|
|
|
|
8.6). ValubleObject:数值对象
一个VO类包装一组代表业务含义的数据,负责在系统各层之间传递业务数据。通常一个VO对应一个数据库表,但也可以对应多个数据库表,或对应一个数据库表的部分字段。
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
VO1
|
继承性
|
该类是否继承于
VO
类
|
正确性
|
错误
|
|
VO2
|
get()
和
set()
方法是否齐全
|
VO
类是否包含每个需要持久化属性的
setXXX
和
getXXX
方法。
在
set
方法中是否对属性进行合法性校验,校验失败抛出
ValidationException
异常
|
正确性
|
错误
|
|
VO3
|
构造子
|
该类应包含无参构造子、只含参数
OID
的构造子
|
正确性
|
错误
|
|
VO5
|
参数
|
全参构造子中参数的顺序是否与
set
语句的顺序一致
?
(去掉)
|
正确性
|
错误
|
|
VO6
|
语句体
|
在每个set方法中是否有修改对应属性的语句体?
|
正确性
|
错误
|
|
VO7
|
语句体
|
在每个get方法中是否有返回对应属性的语句体?
|
正确性
|
错误
|
|
VO8
|
空值问题
|
所有为保存操作员的录入数据而创建VO对象的类属性应初始化为null,直到操作员录入数据时才为相应属性分配空间和赋值。在保存到数据库时,把空属性(null)映射为数据库相应字段的null。
|
|
|
|
VO9
|
Integer、Double包装类型
|
由于Java的Primitive Type类型(如int、double)不是对象,所以不能使用它们作为类属性类型,应该采用对应的Integer、Double等相应的包装类型。
|
|
|
|
8.7). BO业务对象层:
每个
BO
类都继承
BusinessObject
类。
BO
对象通过操纵
DMO
对象和其他
BO
对象完成业务逻辑。
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
BO1
|
BO
类中是否存在名称相同且参数个数相同的方法
|
一个
BO
类中不能有名称相同且参数个数相同的两个方法同时存在。因为目前中间件生成工具处理此情况存在问题
|
|
|
|
BO3
|
事件监听器和处理事件
|
不建议使用可视化进行事件处理,请手工注册事件监听器和处理事件
因为可以减少不必要的代码
|
|
|
|
B4
|
打印异常
|
所有异常应打印出来,可使用下述语句:
e.printStackTrace(System.err);
|
|
|
|
B5
|
抛出异常
|
BO
的所有业务方法都必须抛出异常:
java.rmi.RemoteException;
否则将不能生成
EJB
辅助代码
|
|
|
|
B6
|
BO对象中使用其它BO对象或环境变量时
|
在BO对象中如要使用其它BO对象或环境变量,必须使用getBeanHome()和getEnvProperty()方法获得,不要直接使用JNDI查询。使用其它BO对象的方法代码示例如下:
BO2Home home = getBeanHome(
“
BO2Name
”
, BO2Home.class);
BO2 bo2 = BO2Home.create();
|
|
|
|
B7
|
EJB
规范
|
基类BusinessObject包含了SessionBean接口中的setSessionContext()、ejbCreate()、ejbActivate()、ejbPassivate()、ejbRemove()方法。这是提供给EJB Server的调用接口,不要在你的BO类中调用这几个方法。
|
|
|
|
B8
|
工具生成代码是否可用
|
在CodeSeed为一个数据库表生成代码时,你可以选择包含BO类以及home、remote接口、BO_Client(客户端代理)。所有这些代码演示系统各层之间的调用关系,这些类是否根据业务要求加以调整
|
|
|
|
B9
|
BO类的设计要遵循大粒度(coarse-grained)的原则
|
即尽量将一项业务的所有方法放入同一个BO类中。这是设计EJB(尤其是Stateless Session Bean)的一项原则,它能有效的提高对系统资源的利用。具体到我们的编码实践中,虽然CodeSeed针对每个DMO类生成了一个BO类,但我们要将相关的BO类整合成一个BO类。
|
|
|
|
B10
|
BO类中方法的命名是否反映该方法的业务含义
|
虽然CodeSeed生成的代码中将方法命名为insert()、update()等,还应将它们更名为addBill()、auditBill()等业务名称
|
|
|
|
B11
|
BO
类是否生成
供客户端调用
BS
端的代码
|
当设计完
BO
类后,需调用
NC EJB
开发工具集生成和部署代码,生成瘦客户端,供客户端调用
BS
端的代码。
|
|
|
|
B12
|
在
BO
、
DMO
类中调用另一个
BO
对象时是否保证一个事务内的正确实现
|
在
BO
和
DMO
类中,如要使用其它
BO
对象,必须使用
getBeanHome()
方法获得。假如
BO1
的一个方法内要使用
BO2
,那么示例如下:
BO2Home home = getBeanHome(“BO2Name”, BO2Home.class);
BO2 bo2 = BO2Home.create();
bo2.method1();
其中,
getBeanHome()
方法的第一个参数
(“BO2Name”)
是一个字符串,代表
BO2
的
JNDI
名称。我们技术部的中间件默认的
JNDI
名称由
“
包名
.remote
接口名
”
构成,例如,对上述
BO2(
假定它位于
nc.bs.mypackage
包中
)
,默认的
JNDI
名称是
“
nc.bs.mypackage.BO2”
。
不可直接
New
一个
BO
对象的实例,否则中间件将无法控制和确保其事务属性的正确实现
|
|
|
|
B13
|
向数据库插入一条记录时,是否为它获得唯一主键
(OID)
|
提供OID的算法由系统管理统一处理,通过在DMO基类的两个接口方法getOID(String pk_corp)和getOIDs(String pk_corp, int amount)提供给业务模块使用。其中,参数pk_corp是此记录所属的公司的主键。如果参数pk_corp为null,则默认为集团公司的数据。
|
|
|
|
B14
|
业务级校验
|
业务级校验方法是否齐全
|
|
|
|
8.8). DMO(数据管理对象):
序号
|
测试项
|
测试内容
|
质量保证标准
|
问题属性
|
出错频率
|
DM
0
|
继承类
|
每个
DMO
类是否都继承
DataManageObject
。
|
|
|
|
DM1
|
数据库的利用效率
|
为了提高数据库的利用效率,是否尽量使用
PreparedStatement
执行
SQL
操作,不要使用
Statement
|
|
|
|
DM
2
|
DMO
类中方法的完整性
|
1
通常
DMO
类中应包含
insert()
、
delete()
、
update()
方法。还可以包括其它的查询方法。
2
对一些特殊的继承类,如处理参数设置的
DMO
类,可能不需要
insert()
和
delete()
方法。
|
|
|
|
DM
3
|
数据库连接
|
在
DMO
类中,数据库连接必须通过
getConnection()
方法获得,不允许直接使用
JNDI
查询
|
|
|
|
DM
4
|
数据库资源的获得和释放
|
应在
DMO
类每个方法的获得
Connection
、
PreparedStatement
两种数据库资源,并在方法的结束位置释放数据库资源。
|
|
|
|
DM
5
|
库表主键值
|
在
DMO
类的一个方法中向数据库插入
(insert)
数据时,是否使用
getOID()
方法获得一个自动产生的库表主键值。
|
|
|
|
DM
7
|
是否尽量使用
VO
数组
|
如果
DMO
类中的方法需要返回业务数据,则通常是
VO
对象或
VO
对象的数组(或集合)。当客户端需要多个
VO
对象时,是否尽量使用
VO
数组的形式返回,以提高数据库和网络效率,不要将多个
VO
一个一个的查询和返回
|
|
|
|
DM
9
|
DMO
对象调用另一个
BO
对象时
|
如果你在
DMO
对象中需要使用
BO
对象(通常是提供公共服务的
BO
),必须使用
getBeanHome
获得
BO
对象的
home
接口。
|
|
|
|
DM
11
|
自动生成代码的调整
|
在
CodeSeed
生成的代码中包含了
delete(VO)
、
insert(VO)
、
update(VO)
、
insertArray(VO[])
、
queryAll()
等方法。是否根据业务需要增加、删除、调整
DMO
类中的方法。
|
|
|
|
DM
12
|
参数
pk_corp
的使用
|
在
DMO
中的
insert()
等方法中,向数据库插入记录时,要通过
getOID(String pk_corp)
或
getOIDs (String pk_corp, int amount)
为该记录获得一个记录主键(
OID
),如果参数
pk_corp
为
null
,则默认为集团公司。
|
|
|
|
DM
13
|
用
VO
对象写库时
|
数据库表中加一字段时,执行
stmt = con.prepareStatement(sql)
后,执行
stmt.setString(3, invcl.getInvclasscode()
语句中的序号是否与数据库表中字段顺序一致
(
举例附后
)
|
|
|
|
DM
14
|
条件拚写语句
|
条件拚写语句是否符合业务逻辑
|
|
|
|
DM
15
|
DMO
类的查询、增加、修改方法
|
查询:执行完查询
Sql
语句
ResultSet rs = stmt.executeQuery()
后,是否对查询
vo
对象正确地赋值,且赋值属性是否有遗漏
增加:执行完插入
Sql
语句
stmt = con.prepareStatement(sql);
是否对
stmt
正确地赋值,且赋值属性是否有遗漏,然后执行
stmt.executeUpdate()
更新数据库
更新:执行完更新
Sql
语句
stmt = con.prepareStatement(sql);
是否对
stmt
正确地赋值,且赋值属性是否有遗漏,然后执行
stmt.executeUpdate()
更新数据库
|
|
|
|
错误码DM
13
举例
,
如:数据库表
bd_invcl
中加一字段
avgprice
,执行完后
sql
语句后,
PreparedStatement
类型的
stmt
中执行
set
语句的顺序要与数据库表中字段顺序一致。否则出错
String sql = "insert into bd_invcl(pk_invcl, invclassname, invclasscode, endflag, avgprice, invclasslev) values(?, ?, ?, ?, ?, ?)";
Connection con = null;
PreparedStatement stmt = null;
try {
con = getConnection();
stmt = con.prepareStatement(sql);
// set PK fields:
String newOid = getOID();
stmt.setString(1, newOid);
// set non PK fields:
if (invcl.getInvclassname() == null) {
stmt.setNull(2, Types.CHAR);
}
else {
stmt.setString(2, invcl.getInvclassname());
}
if (invcl.getInvclasscode() == null) {
stmt.setNull(3, Types.CHAR);
}
else {
stmt.setString(3, invcl.getInvclasscode());
}
if (invcl.getEndflag() == null) {
stmt.setNull(4, Types.CHAR);
}
else {
stmt.setString(4, invcl.getEndflag());
}
if (invcl.getAvgprice() == null) {
stmt.setNull(5, Types.INTEGER);
}
else {
stmt.setBigDecimal(5, invcl.getAvgprice());
}
if (invcl.getInvclasslev() == null) {
stmt.setNull(6, Types.INTEGER);
}
else {
stmt.setInt(6, invcl.getInvclasslev().intValue());
}
//
stmt.executeUpdate();
return newOid;
} catch (Exception e) {return "
插入未成功
";}
finally {
try {
if (stmt != null) {
stmt.close();
}
}catch (Exception e) {}
try {
if (con != null) {
con.close();
}
}catch (Exception e) {}
}
}
8.9). 业务逻辑重点测试项目(需根据不同业务要求进行细化)
1
. 状态校验测试:
如:
(1)
作废状态的校验:
在
Remove
和
Update
单据时,需校验状态。如果记录处于作废时会抛异常,否则正常删除或修改。(请构造正反用例分别测试)
(
2
)审核状态的校验:在
Remove
和
Update
单据时,需校验状态。如果记录处于审核状态时会抛异常,否则正常删除或修改。(请构造正反用例分别测试)
(
3
)冻结状态校验:同上。
2
.关联删除测试:
3
.关联增加测试:
4
.静态变量的测试:
8.10). 样例:
如存货基本档案
UI层:
1
).显示控件和编辑控件应该加以区分,尽量避免任何引起用户误会的可能。如,存货档案中的
“
查询条件
”
控件,使用户误以为是用来录入的
2).编辑控件数据类型没有与表中对应字段数据类型一致
如:InvbasdocPanel类中的gettxtWeitUnitNum(){}
应加入ivjtxtWeitUnitNum.setTextType(nc.ui.pub.beans.textfield.UITextType.TextDbl);
3 控件没有控制最大长度范围:
如:对双精度型,数据库表中字段设为Decimal类型,pricision为20位,Scale为8位
则需加入下列语句:
ivjtxtShipUnitNum.setMaxLength(
20
);
ivjtxtShipUnitNum.setNumPoint(
8
);
4
).参照问题
按增加时,从树中所选分类没有自动带入,存货分类参照应只显示末级
5
).树表结构
·
1
.树中节点级次混乱
·
2
.选择末级节点时,树中节点与列表中记录没有对应
·
3
.一进入树表结构型的界面中,选择末级节点时,没有激活
“
增加
”
按钮,
·
4
.按增加,没有缺省切换到第一页,从树中所选分类没有自动带入
6)报错信息:
· 1.错误信息提示不准确
· 2.当操作合法时,也出现报错信息框
如:光标定位于左边
tree
中的某一节点时,报错信息为:
只有第二级以下的节点或末级节点表才能展开。
9. 测试数据设计
测试数据表
| ||||||
测试类名:
方
法
名
:
|
测试人:
所属模块:
|
编号:
| ||||
序号
|
测试目的
|
输入数据
|
实际输出
|
期望输出
|
差异与否
(
允许误差
)
|
估计错误原因
|
1
|
匹配条件
|
|
|
|
|
|
2
|
边界测试
|
|
|
|
|
|
3
|
条件分支
|
|
|
|
|
|
4
|
循环
|
|
|
|
|
|
5
|
不合法数据
|
|
|
|
|
|
备注
|
|
|
|
|
|
|
10. 代码测试报告填写说明
代码测试报告填写说明
项目编号
|
1
|
类名称及版本
|
2
| |||||||||||||||||
项目名称
|
3
|
测试人员
|
4
| |||||||||||||||||
测试执行日期及版本
|
5
|
|
|
| ||||||||||||||||
方法名称
|
标识号
|
测试结果
|
问题描述
|
问题属性
|
问题类别
|
修改确认
|
确定修改人员
|
返回次数
|
确认修改状态
| |||||||||||
1
|
2
|
3
|
4
|
5
|
6
| |||||||||||||||
6
|
7
|
8
|
9
|
10
|
11
|
|
12
|
13
|
14
| |||||||||||
|
|
|
|
|
|
|
|
| ||||||||||||
|
|
|
|
|
|
|
|
|
| |||||||||||
|
|
|
|
|
|
|
|
|