设计一个简单的加法运算器的主要功能是,界面如下,功能:在左边两文本框中输入数据,单击运算按扭,在右边文本框中显示运算

vfp报表设计器有哪几个分区每个区域实现的功能
vfp报表设计器有哪几个分区每个区域实现的功能
09-12-24 &匿名提问 发布
图片、表单、报表、prg不用打包的,因为在exe文件中已经包含在内,额外的exe文件、txt文件以及程序中需要的数据库、自由表必须打包。 回答者: sdl0819 - 高级经理 七级   3-11 08:09图片、表单、报表、prg不用打包的,因为在exe文件中已经包含在内,额外的exe文件、txt文件以及程序中需要的数据库、自由表必须打包。 回答者:sdl0819 - 高级经理 七级 3-11 08:09 可以给这个答案评最佳了 图片可以编译进去的exe的
请登录后再发表评论!
l        小组如何协同工作来完成一个设计题目?&O        命名统一各种文件:集体协商定好所选设计题目的数据表、数据库、菜单、报表、项目文件和其他表单文件的名称。&O        数据表要统一:表的结构由小组集体决定,确定下来后不要更改,如有变动要通知所有组员知道,否则最后不能联编在一起。&O        统一文件存放路径。如:都存在f:\xxx文件夹中。l        如何备份阶段性成果文件?&O        退出VFP,再备份文件,注意文件备份要全面,不要遗漏文件。如:表单形成两个文件:scx 表单文件和.sct表单备注文件,两个都要备份,否则表单打不开。&O        解决办法:请备份整个设计文件夹。l        如何设计系统的数据表?&O        为了避免信息的重复存储(信息冗余),表设计的原则是:一个主题的信息形成一个表。&O        如学生成绩管理系统:学生信息表(学号,姓名,性别等)、课程表(课程号,课程名称)、成绩表(学号,课程号,成绩)l        为什么文件找不到了?&O        原因:当前工作目录下没有这个名称的文件。&O        请在做设计之前设置好你的工作目录。l        怎样更改表单的最大设计区域(640*480  800*600  )?&O        工具/选项/表单/最大设计区域/选择合适的分辨率:如800*600或。l        如何给表单填加背景图片?&O        不要直接用表单的picture来填加背景图片,图片的大小不可控制。&O        解决办法:用图像控件:image, 来显示背景图片(缩放方式为:变比填充),并在表单的activate事件中用代码方式对image 控件的位置(top=0、 left=0) 和大小(height、width)属性做适当的设置,让image 控件的大小等于表单的大小。&O        若想实现表单的尺寸大小改变时,背景图片同步改变大小,请在表单的resize事件中做上述同样的代码设置即可。l        为什么回不到设计状态?&O        程序挂起了,参看教材12章:程序的调试部分---挂起suspend命令。&O        解决办法:在命令窗口中输入命令:cancel回车;或者单击“程序”菜单中的“取消”命令。l        怎样快速找到出错的命令行代码?&O        出错时,点“挂起”来打开调试器,看到出错的行,找到原因;&O        在调试器中单击,“跳出”工具按钮,来回到错误状态;&O        单击“取消”按钮,回到设计状态修改错误代码。l        为什么数据类型不匹配?&O        请注意表中字段的数据类型与你写的表达式的数据类型一致,数据类型不一致不能运算。如表达式:123&”1000”&O        解决办法:用转换函数(推荐用前者)或者改表中的字段类型。l        如何在一个顶层表单中调用一般菜单?1、建立一般菜单&O        文件/新建/菜单-----存成菜单定义文件.MNX&O        显示/常规选项/选中“顶层表单”  (告诉系统将来这个菜单要在一个顶层表单中调用)&O        生成.MPR菜单程序文件2、在一个“顶层表单”的表单文件中调用上面的菜单&O        将表单设置为顶层表单:将表单的showwindow设置为2。&O        顶层表单的init事件代码如下:DO xx.MPR WITH THIS, .T.l        如何在一个表单中调用快捷菜单?&O        新建/菜单/快捷菜单(同一般菜单)&O        保存文件MNX-----生成文件MPR&O        在表单(控件)的右击事件(Rightclick)来调用,输入代码:Do  XX.mprl        如何书写主程序?**main.prg**_screen.visible=.f.do form  xx.scxread eventsquitl        用VFP编写管理系统的一般模式是什么?主程序(main.prg)  调用  密码验证表单(顶层表单)  调用  主控表单(顶层表单)  调用  菜单(xtcd.mpr)—  调用  其他功能表单(showwindow属性设置为1:在顶层表单中)注:顶层表单:showwindow属性设置为2:作为顶层表单l        浏览功能表单的设计思路?是一个数据表单,表单上可以有相应的控件(从数据环境中直接拖入即可),要求控件只读,还要有一些按钮来移动记录指针。还可以增加简单的查询功能,来实现按查询的条件来浏览表中的记录信息。注:若用到表格(grid)控件,请去掉表格控件的删除列,即修改deletemark属性:deletemark=.f. l        查询功能表单的设计思路?&O        用set filter to实现:是一个数据表单,表单上有相应的表格(grid)控件,(表格控件要求只读),用文本框来接收用户的查询关键字段的值,再用set filter to命令来对表格控件的数据源表进行条件过滤,来模拟查询的效果。若是多关键字查询,请用选项按钮组来让用户选择要查询的关键字类别,如:按姓名或按学号等。&O        用SQL语句Select实现:是一个数据表单,表单上有相应的表格(grid)控件,(表格控件要求只读),用文本框来接收用户的查询条件,填加一个“查询”按钮,单击该按钮时,执行select查询语句,查询语句的结果放到表格(grid)控件中显示(该表格控件的数据源用代码方式设置为:thisform.grid1.recordsourcetype=4,即SQL说明;thisform.gird1.recordsource=“select * from 表 where 条件 into cursor temp”。)注:若用到表格(grid)控件,请去掉表格控件的删除列,即修改deletemark属性:deletemark=.f. l        打印功能表单的设计思路?&O        先做有关数据表的报表格式文件(frx)。&O        做一个表单,上有按钮控件,单击该按钮,执行预览报表的命令:report form xx.frx preview &O        若想实现条件打印预览,只需在上面的命令中加上for条件语句:report form xx.frx preview for &条件&l        修改功能表单的设计思路?实质是一个数据表单,表单上有相应的表格(grid)控件(表格控件要求只读),或相应的ole绑定控件(从数据环境中直接拖入表单中产生的控件,控件要求只读),还有“修改”按钮,单击该按钮,去掉上述控件的只读属性,允许用户来修改表单中显示的记录数据。还有一个“确定”按钮,单击该按钮,设置相应控件的只读属性为真,不允许用户修改数据,表示数据修改结束。注:若用到表格(grid)控件,请去掉表格控件的删除列,即修改deletemark属性:deletemark=.f.l        删除功能表单的设计思路?&O        假删除方法:建一个数据表单,表单上有相应的表格(grid)控件(表格控件要求只读)显示数据表中的记录,并且去掉表格(grid)控件的删除列,即修改deletemark属性:deletemark=.f.;由用户在表格中选择一个要删除的记录,单击“删除”按钮,给记录加上删除标记,即逻辑删除记录;然后执行set deleted on 命令来屏蔽(不显示)有删除标记的记录,来模拟删除的效果。最后,在“退出”按钮中,执行物理删除命令:pack,来真正删除表中的记录。注:表必须以独占方式打开(可用命令:use 表 exclusive;也可在设置表单数据环境的属性:exclusive=.t.),否则会删除失败。l        删除表单中的恢复删除功能实现?表单中增加一个接收“记录号”的文本框和一个“恢复删除”按扭,单击该按钮,首先不屏蔽(显示)有删除标记的记录,然后执行recall命令来恢复相应的记录,最后再设置系统状态为:屏蔽(不显示)有删除标记的记录。l        增加记录功能表单的设计思路?方法1:是一个数据表单,表单上可以有相应的控件(从数据环境中直接拖入即可),要求控件只读。增加一个“增加记录”按钮,单击该按钮,实现在表的末尾增加一条空记录,并去掉相应字段的绑定控件只读属性,允许用户来修改新记录的内容。注:如果数据库表中设置了主索引,上述方法会失败。原因是主索引的关键字是不许为空的。解决办法是:去掉表的主索引或者用SQL中的insert into 命令来实现。方法2:建一个表单,表单上填加相应的控件,来接收用户输入的相应字段的值,然后用SQL中的insert into 命令来把新记录的值追加到表中即可。insert into 表名(字段1, 字段2..) values( 值1,值2…)l        为什么我的程序编译后一闪而过?这个问题有两种可能性,第一种是程序执行完成并退出,第二种是程序正在执行,但界面被隐藏。对于第二种情况,可直接按&Ctrl-Alt-Del&键观察到。造成这两种情况的原因如下:我们先看下面的一段示例程序,假如下面的示例程序是项目的主程序,并且应用项目以VFP主窗口做为自己的主窗口。*环境设置Do Form myScreen &&启动封面表单 _Screen.Show &&显示VFP主窗口Do myMenu.mpr &&安装菜单系统RETURN为达到在显示启动封面之前不显示VFP主窗口的目的,在Config.fpw中已写Screen=off,当程序执行到Do Form myScreen这一句时,如果表单myScreen的ShowWindows属性被设为&在屏幕中&,则不管是在开发环境还是在编译环境下,程序都将停下来,表单被显示在_Screen中,而_Screen被隐藏了,因此表单跟着也被隐藏了,所以在屏幕上什么也看不见。这就是第二种情况的产生原因。为了避免这种错误的出现,必须将myScreen表单的ShowWindow的属性设为&做为顶层表单&,这样就可使在_Screen被隐藏的情况下,myScreen仍然可以被显示出来。但请注意,在此情况下,Do Form myScreen这句话执行后,程序并不能停下来,而是顺序地执行下去,一直到执行到RETURN后程序退出,这也就是著名的&一闪而过&现象了。为此必须在程序中包含事件处理命令Read Events使程序停下来,如下:*环境设置Do Form myScreen &&启动封面表单Read Events &&开始事件处理:使启动封面停下来_ Screen.Show &&显示VFP主窗口Do myMenu.mpr &&安装菜单系统Read Events &&开始事件处理RETURN程序执行Do Form myScreen后,将启动封面显示在屏幕上,然后向下执行到Read Events开始事件处理,此时启动封面表单必须由用户关闭或由表单事件关闭,否则程序将一直停在Read Events这一句上。不管myScreen表单由谁关闭,在关闭代码中必须包含一句Clear Events的停止事件处理命令,以便开始执行Read Events的下一句指令,顺序执行完成_Screen.Show及Do myMenu.mpr后,用户的主界面就建立完成,同理,此处还需要一个事件处理命令让程序再次停下来,开始菜单系统的命令处理,一般情况,菜单系统中将包含的&退出&项,其中有&Clear Events&清除事件处理代码,从而停止第二条&Read Events&事件处理命令,退出整个系统。以上经验恐有谬误,敬请批评!最后,VFP是个所谓&让我欢喜让我忧&的东东,有时百依百顺,有时莫名其妙。未曾恋爱过的男性最适合习之,以便为今后的恋爱打下坚实的心理基础。在梅子那边看到经典问题里面有这个题目,话说了一堆,却没说到点子上。说实话,以前也从来没看到过说到点子上的文章。大多数人也就是知道在主程序里面加了Read events 后能够避免一闪而过的问题而已,到底是什么原理还是不清除。其实很简单,主程序是个什么文件?它就是一个PRG。普通的PRG文件执行情况是怎么样的?从头到尾,每一行代码执行下去,然后立即退出。OK,现在,再想一想,我们想要做的,是怎么样一个程序?是一个会出现菜单、主窗口,等待我们选择某个功能去执行的程序。也就是说,程序应该打开菜单、主窗口以后就中途停下来,等待我们操作的程序。好,现在再想一下,怎么在PRG中间的某个地方让程序停下来进入那么一种状态?Wait window可以做到,不过一按鼠标马上就又继续执行了,要让程序一直等着,即使进行了几个操作也不会退出,就只有用Read events了。随便建一个PRG,不用把它设置成主程序,只要这个PRG中间有Read events,那么程序就会停下来等着,MSDN里面的许多示例就是这么干的。现在,一闪而过的问题应该清楚了吧?你的菜单是打开了、主窗口是打开了,但是,因为没有进入这个等待状态,所以,程序马上继续执行到末尾然后退出,菜单、主窗口都马上又被关闭了。这些,都是一瞬间就执行完的,结果,看起来就是一闪而过。再看看Clear events,它的意思,就是从这种等待状态中退出。许多人把 Clear events 误会成一个退出程序的命令。不对,Clear events只是退出这种等待状态而已,如果你在它的后面再加上一个 Read events,那么程序就又会进入一种等待状态而不会结束。由于Clear events并不是立即退出程序,因此,在Clear events 后面的代码还是会继续执行,比如我们用来关闭数据库、恢复系统环境设置等等的命令之类的,都可以放在Clear events后面去执行。这个解释,应该是【一闪而过】和【Read events】的最终解释了吧!
请登录后再发表评论!
将纵向数据列表转化为横向数据字段parkrace/gaqe/31268.html单设属性好像list还做不到一点,不过你可以用一下别的方法嘛,比如把A表放到一个四条记录多个相同字段的临时表中,再让list显示这个临时表的内容。 希望我的方法对你有所帮助。
请登录后再发表评论!(说明:此白盒测试指南主要给白盒测试人员提供一些基本的白盒测试方法和技术,由于涉及的问题广泛,测试内容中的细节不一定准确和完整,还有待于各位的共同参与和不断完善,欢迎多交流!)
本方案主要实施NC产品程序代码的白盒测试。使界面符合设计规范,适用于用户;保证程序创建的类与接口的完整与正确,以及程序模块单独正常运行。保证局部模块功能完备性,运行正确性与稳定性。
所要测试的类。如:
nc.ui.bd.*
nc.bs.bd.*
nc.vo.bd.*
1.NC产品需求报告;
需求规格说明书、用例描述清单
2.设计文档;(OOA、OOD、CRC卡)
如:AOM(Analysis Object Model)表示类间的静态关系,是多个相关的用例共用的。
ASD(Analysis Sequence Diagram)是按业务工作的顺序表示每一工作步骤执行时类间的动态关系。一个用例对应一个ASD。
CRC (Collaborators & Responsibilities Card)卡是一个类的完整表述
3.界面规范
4.编码规范
5.开发命名标准
通过的准则
1.界面测试通过的标准:界面的样式、大小、颜色、整体布局的设置;各种标签控件的使用及主题描述以及事件源控件的使用、快捷键使用都应符合《NC系统应用框架需求报告》和《设计文档的相关规范》。
2.程序代码通过的标准:创建的类、接口、方法、属性应与《设计文档》保持一致;程序的各种命名、注释、代码行的格式等应符合《程序开发命名标准》和《编码规范》;程序模块能独立稳定运行。
测试环境配置
1.测试工具:
2.软件环境:
Client端:
&&&&&&&&&&&&&&&&&&&& 操作系统:中文WINNT/2000
开发环境:VA3.5 专业版
待测试的源码包
Server端:
&&&&&&&&&&&&&&&&&&&& 操作系统:WIN NT4.0
&&&&&&&&&&&&&&&&&&&& 开发环境:VA3.5 专业版
&&&&&&&&&&&&&&&&&&&& 通讯环境:&& Servlet&&&&&&
3.DB Server端:DBMS:SQL SERVER
4.资源文件
白盒测试总流程
测试流程依据,请参见《代码层次结构规范》。
NC系统中的对象主要分为如下几种:
?& 界面对象(UIObject)
?& 数值对象VO(ValueObject)
?& 业务对象BO(BusinessObject)
?& 数据管理对象DMO(DataManageObject)
测试流程可按二种方式,其优缺点对照:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& VO&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& VO
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
前者:优点是便于测试者从界面层直观地录入数据,缺点是做回归测试时,录入数据需重复
原则是从底层测试,底层测试通过了,再依次往上一层测试;否则不需往上层测试
缺点:需给中间层做一测试小程序:根据程序中类的对象构造输入数据及将结果输出到控制台上,(可通过自行设计测试工具来改善,测试工具需求另附)
优点:做回归测试时,不用再构造输入数据,只要再执行一遍小测试程序
测试步骤:
需要列出所测试类的调用关系和关键方法的调用关系(依据为数据流)。
(1)&&&&&& 类关系图。
(2)& 方法的功能调用关系图:只需要列出一些调用关系较复杂的方法。
7.1.&&& 配置好测试环境;
7.2.&&& 编写测试用例;
7.3.&&& 静态测试,走查代码;
代码走查使用测试用例启发检测错误,沿程序逻辑走一遍,检测程序结构和实现上是否有问题
7.4.&&& 动态测试
l& 界面初始化状态测试;
l& 界面控件功能测试;(正反用例);
l& 业务功能测试(正反用例);
l& 数据流关联测试(涉及多表的增、删、改),并结合数据库表的字段、外键、字段类型、精度、小数位数、非空、默认值、备注、数据对象等。
l& 数据传递和接收一致,数据计算或处理后状态正确;
l& 组合模块整体运行稳定,不出现死机;
7.5.&&& 确定问题属性:
分为四类:错误、缺陷、失效、故障
错误是指计算值、观测值、测量值之间,或条件与真值之间,不符合规定的或理论上的正确值或条件
缺陷是指与期望值或特征值的偏差
故障是指功能部件不能执行所要求的功能。故障可能由错误、缺陷或失效引起。
失效是指功能部件执行其功能的能力丧失,系统或系统部件丧失了在规定限度内执行所要求功能的能力
7.6.&&& 确定问题类别:
问题类别分为以下几大类:
1.各层公用问题
2.JAVA语言规范
3.数据类型
4.SQL语句规范
6.VO数值对象
7.BO业务对象
8.DMO数据管理对象
9.业务逻辑重点
10.事务处理与隔离级别测试(详见总体技术部相关文档)
11.效率测试(详见总体技术部相关文档)
7.7.&&& 填写测试报告
测试记录需详细填写具体实施方法中的相关列表;
上交的测试报告只需填写未通过的项。(详见第10节)
具体实施方法:
8.1).&& 各层公用问题:
质量保证标准
代码与设计对照
按需求、UI,CRC设计文档与编码对照,看是否完全地实现了所有的UI设计文档和CRC卡中规定的内容?
代码与设计对照
按需求、UI,CRC设计文档与编码对照,看是否创建了所需的数据库或其他初始化数据文件?
返回值
方法中被传递参数的类型、个数、顺序及返回值是否正确?以符合UI设计文档和CRC卡为准。
参数的传递
当方法需要调用其它方法时,调用的参数是否正确?(UI设计文档和CRC卡中有调用说明)
是否按《命名规范》进行了类、方法、变量、属性的命名?
代码中的公式是否使用了设计文档中的相应数学公式。
注释是否使用简洁明了的语言对每一个方法都进行了充分必要的描述?是否对复杂的代码进行了注释?当程序的运行是受某些特殊因素限制时,是否做了限制注释?是否列出限制模块运行特性的全部特殊因素?
冗余语句和变量
是否存在永远执行不到的语句和变量,而降低了程序的可理解性?
程序是否冗余
对于程序中的大量重复内容,是否使用了专门的类来实现?
代码整体规范
是否自始至终使用了《程序员开发手册》和《编码规范》中要求的格式、调用约定、结构等?
代码与书写注释
在一个函数内代码的长度不允许超过100行。建议如果一个函数的代码长度超过一个屏幕,那么或许这个函数太长了。
使用统一的格式化代码。将‘{’放在所有者的后面,并且在下一行代码前加入TAB键缩进;(TAB键比用若干个空格更容易控制使用统一的缩进距离)
类的注释;
接口的注释;
函数的注释;
类属性的注释;
局部变量的注释;
请详见:《代码与注释书写风格规范》
命名是否符合程序包命名规范
1.创建的属性(字段)是否完整,类型与命名是否规范,注释是否清楚合理。
2.创建的方法是否完整;命名是否规范;修辞是否正确;参数,参数类型,返回类型是否正确。
3.调用的方法和传递的参数是否正确。
1.&&&&&&&&& 参数传递、返回值是否正确
2.&&&&&&&& 特殊校验、处理是否有注释
第一个字母大写的英文正常语序
每个功能点的主程序(通常继承系统管理框架)统一采用ClientUI类名称。
业务逻辑代码类以BO结尾,如:GeneralLedgerBO
数值对象类以VO结尾,如:EmployeeVO
数据管理对象类以DMO结尾,如:EmployeeDMO
查询对象类以QO结尾,如:EmployeeQO
非参照对话框类以Dlg结尾,如:EditEmployeeDlg
参照对话框类以Ref结尾,如:WorkCenterRef
面板类以Panel结尾,如:GeneralLedgerPanel
接口名的开头加上字母‘I’前缀
从第二个字母起,用首字母大写的英文单词描述
1.是否正确定义了此方法(包括修辞词、返回类型、参数、参数类型)
2.注释是否清楚
3.命名是否正确:
l&& 方法函数名的第一个单词小写,后面的单词第一个字母大写;
l&& 第一个单词必须是动词,使函数的意义清晰明了;
l&& 存取对象的属性使用setXXX()和getXXX()函数形式
l&& 访问布尔类型的属性可以使用isXXX()函数
?& 所有类属性全部以m_开头,同其它变量区分开。
?& 集合类型的域,如数组、向量,必须使用复数形式来指出它们多值特性。
?& 所有的域都是私有的,用并且仅用getXXX和setXXX等的存取函数去访问域,。
?& 存取函数的可见性尽量为protected属性的,getter函数可以是public属性的
?& 存取函数的命名规则是:
getter函数 =& get + 域名 (非布尔类型域)
&&&&&&& &&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&is + 域名 (布尔类型域)
setter函数 =& set + 域名
常量的命名全部使用大写。用下划线来分隔单词。
START_DATE
MINIMUM_BALANCE
类所实现的功能
是否实现了要求的所有功能
类中的校验方法
1.界面级的校验是否齐全
2.业务级的校验是否齐全
面向对象程序是否体现继承、封装和多态的特性?
面向对象特性
面向对象程序中,编写类的方法时,是否同时考虑基类方法(Base::Function())的行为和继承类方法(Derived::Function())的行为
数据封装性
数据成员是否满足数据封装的要求。
有时强制的类型转换会破坏数据的封装特性。例如:
  class Hiden
  {private:
  int a=1;
  char *p= &hiden&;}
  class Visible
  {public:
  int b=2;
  char *s= &visible&;}
  Visible *qq=(Visible *)&
  在上面的程序段中,pp的数据成员可以通过qq被随意访问
类中成员方法
以OOD为依据,类中成员方法是否实现了设计中所要求的功能;如通过OOD仍不清楚,则还应依据OOA、及需求报告说明书
8.2).&& JAVA语言规范走查内容
质量保证标准
是否有下标变量越界错误?
是否包含有除零错误的可能?
当对一个不知是否为空的对象取其属性值会引起空指针异常。如果空指针异常没有被接收程序将终止。例如:BusinessData1.getBusinessDate2.getOid()当BusinessData1.getBusinessDate2为null时,
BusinessData1.getBusinessDate2.getOid()将发生异常
在字符串比较和将字符串写入数据表前应Trim()掉它的前后空格。
字符串连结符&+&
将字符串连结操作中的+操作符同加法运算中的+操作混淆将导致奇怪的结果。例如:y为int类型,y的值为5,g.drawString(&y+2=&+y+2,30,30);将显示y+2=52
不要用等于或不等于来比较浮点值,而应该判断其差别是否小于某一指定小的值。例如:89.6 实际可能为89.
不要对浮点值用做计数循环,应用整型值。
不要使用类型float或者double的变量执行精确的金融计算。浮点数的不精确会导致引起不正确金融计算的错误。可定义若干类来完成不同的金融计算。
switch语句的末尾如果没有defaul语句将会不利于处理异常。
是否在switch结构中的每一个case语句体结束时都有break语句?
在if语句体右括号后紧跟一个分号常常是一个错误,会使if语句成为顺序语句。
通过循环语句对一Vector型变量赋值时,其Vector变量的实例化语句是否被错误地包含在循环体内?
注意循环的条件中是否有差1的现象?
代码是否有无穷循环的可能?(循环条件永远为真)
数值范围
是否存在溢出错误
This和Super的用法是否正确
是否缺少构造子方法
方法声明、参数、
返回值
方法声明错误
返回值错误
控制流错误
类的修饰符
修饰符是否符合以下原则:
Public用于对所有的类可见,
Private用于对本类可见
Protected不仅用于对子类可见,也用于对同一个包的其它所有类可见
8.3).&& 数据类型:
质量保证标准
在设置值对象VO时,在VO内部是否将空串&&将转化null,数值型数据(整数、浮点数)null转为0。*
在取得VO元素放到界面时(如放到UITextField)是否根据需要将null转化为&&或&0&或”0.0”。
控件数据类型的转换
编辑控件数据类型是否与表中对应字段数据类型一致
1.UITextField文本域数据类型在nc.ui.pub.beans.textfield包的UITextType接口中定义了TextStr、TextInt、TextDbl、TextDate和TextDateTime等5类,但布尔型使用UICheckBox或UIRadioButton控件,故没有定义布尔型。
UFDouble的使用
去掉原UFCurrency类型,重新封装UFDouble,所有的数值型及运算是否采用UFDouble。
UFDateTime的使用
去掉原UFTime类型,重新封装UFDateTime。
某些数据封装类型的禁用
禁止使用的数据封装类型,如Boolean、Short、Long、Float、Double、Date。
双精度型控件的范围控制
对双精度型控件是否控制最大长度范围:
如:对双精度型,数据库表中字段设为Decimal类型,pricision为20位,Scale为8位
& 则需加入语句:
ivjtxtShipUnitNum.setMaxLength(20);
&&&&&&&&&&&&&&& ivjtxtShipUnitNum.setNumPoint(8);
最大长度的设置
设置最大长度MaxLength(默认20位、对TextDate与TextDateTime无效),
小数位数的设置
设置小数位数NumPoint(默认4位、只对TextDbl有效)
禁止输入字符的设置
设置禁止输入的字符DelStr,整数和浮点数也可设置禁止字符串,如:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //禁止输入负数
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& setTextType(&TextStr&);&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& setDelStr(&-&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //只输入数字型字符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& setTextType(&TextDbl&);&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& setDelStr(&-.&);
整数和浮点数默认右对齐,其它左对齐,可以改变
左边字符锁定的设置
设置左边字符锁定
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && (1)setFixText(String)--设置串并锁定和字符串相同的长度
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && (2)setFixText(String,int)--设置串并锁定参数给定的长度
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && (3)setFixTextLen(int)--锁定参数给定的长度
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && (4)setText(String)--设置串并取消锁定
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && 任何设置都会修改以前设定的锁定长度
8.4).&& SQL语句规范:(详见数据库处理规范)
质量保证标准
语句全部用小写
l&& 禁止使用“select& *& from ”语法。
l&& 禁止使用“insert into table_name values(?,?,……)”语法,
l&& 统一使用“insert into table_name (col1,col2,……) values(?,?,…...)”。
如果在语句中有not in(in)操作,是否考虑用not exists(exists)来重写。
避免显式或隐含的类型转换。例如在where子句中numeric 型和int型的列的比较
当SQL语句含有运算符时,运算符需与其他字符串用空格区分。否则容易导致以下类似问题。在语句select a–b from table 中, a,b均为变量。拼写该语句时,如果a=6, b= -3,则语句变为select 6--3 from table。--变为Sql的注释,语句报错
为提高索引的效率,查询路径优化(尤其是要尽力减少查询嵌套)。
使用静态视图,不允许动态创建视图,索引,存储过程等数据库对象
不能将Null 与& 空串“”视为相同
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的非等值条件)。
复杂SQL语句
对复杂SQL语句必须单独测试:如多表查询拚写语句是否符合业务要求
多数据库适配
1.Sql语句转换类。调用方法:SqlTranslator trans = new SqlTranslator(); destSql = trans.getSql(sourceSql, databaseType)。
2.提供SQLException信息转换。同一个SQL在不同数据库操作,JDBC返回的错误号以及错误信息不同。SQLException信息转换器将不同JDBC返回的错误号统一为以Sql Server7.0为准,错误信息仍以不同JDBC返回的错误信息为主
多数据库适配
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 用法一致
不允许动态创建函数。
8.5).&& 界面UI层:
为提高测试效率,界面UI层测试可将黑盒测试技术和白盒测试技术结合起来进行测试
8.5.1.代码规范:
质量保证标准
1.从ToftPanel继承一个类。每个界面类都要继承ToftPanel:
&&&&&&& public class myUI extends ToftPanel{…}
2. 是否为界面类添加它需要的按钮。
a)&&&&&&&& 添加按钮属性。
b)&&&&&&& 添加按钮组属性
c)&&&&&&&& 将按钮设置到界面上。在构造方法中是否添加如下语句:
&&&&&&&&&&& setButtons(m_aryButtonGroup);
3. 响应按钮。在onButtonClicked(ButtonObject bo)方法中,处理按钮事件:
&&& public void onButtonClicked(ButtonObject bo) {
&&&&&&& if (bo == m_boNormalButton) {
&&&&&&&&&&& onNormalButtonClicked();
&&&&&&& } else if (bo == m_boXxxButton) {
&&&&&&&&&&& // other button disposing
4. 设置界面标题。在getTitle()方法中,返回界面的标题:
&&&&&&&& public String getTitle() { return &我的标题&; }
其他业务代码
5. 完成其他业务代码。
&&& 在完成业务代码时,可能需要用到帐套编码、单位编码、用户编码等信息,这些信息保存在ClientEnvironment类中。你可以在ToftPanel的继承类中使用方法getClinetEnvironment()获得一个ClientEnvironment
客户端调用BO对象
&&& 对在客户端用到的每个BO类XxxBO,都要生成一个客户端的代理类XxxBO_Client。XxxBO_Client和XxxBO的方法一一对应,XxxBO_Client实际上是XxxBO对象在客户端的一个包装。在UI层中,只使用XxxBO_Client访问BS层。例如:如果你要调用XxxBO类中的一个update(MyVO vo)方法,那么在客户端的代码是: XxxBO_Client.update(vo);
对话框须继承和使用的类
&&& 对话框继承nc.ui.pub.beans.UIDialog
&&& 对于提供消息的对话框,使用nc.ui.pub.beans.MessageDialog,不允许使用javax.swing.JOptionPane,因为JOptionPane在浏览器中运行时存在问题
表格模型须继承和使用的类
表格模型继承nc.ui.pub.beans.table.VOTableModel或使用NCTableModel
8.5.2.UI功能测试
分为两个主要手段:
l& 非正常用例手段:此阶段主要是采用不合法的输入数据和非正常的操作手段。测试系统的错误控制与处理能力。保证系统不死机,能正常稳定运行。
l& 正常用例手段:此阶段主要采用合法的业务数据,正常的操作手段。保证UI符合设计要求和操作习惯,能正常稳定运行,能正确处理业务数据。
1、界面规范测试
2.界面初始化测试
3、编辑控件(除功能按钮以外的控件)应用测试;
4、通用对话框测试
5、参照框测试;
6、状态栏测试
7、业务功能测试(新建、保存、删除、查询、浏览、退出)
8. 界面级校验测试
质量保证标准
界面规范测试
1.同一界面,不能同时在同一屏上打开多个。
2.菜单、控件的一致性测试:与设计文档相比较。主要查看菜单与控件是否齐全,控件的类型是否正确。
3.界面的整体布局测试:控件的整体布局是否协调,颜色,尺寸是否合理。具有操作逻辑的控件,其摆放的先后位置是否合理。
4.图标、标题、标签测试:各种图标使用是否符合规范;标题文本、标签文本是否正确合理。
5.控件的鼠标提示文本测试:是否有鼠标提示,提示文本是否正确合理(针对重要的控件)。
界面初始化测试
1.“增加”、 “退出”、“浏览”按钮是否被激活,“取消”按钮是否变灰。
2.界面是否自动列示最后(或最前)一条记录?(如在列表/卡片型界面中的卡片中)
3.各种标签文本和图标提示文本是否正确
界面控件功能测试
1.最小化、最大化、关闭按钮是否有效。
2.菜单各种功能按钮是否有效。
3.按增加按钮是否刷新界面,处于待输入状态。增加按钮、删除变灰,并激活取消、确定按钮。光标是否定位于第一个文本域内。
4.文本域内是否能输入正常长度、数据类型的数据(各提示键显示的内容是否正确);可根据前面已知文本自动显示关联的文本是否自动显示。
5.输入非正常的数据,系统是否有相应的错误提示,术语是否正确
6.在增加状态下按取消按钮,是否放弃当前操作,返回前一界面,并激活增加按钮。
7.按删除按钮是否能删除选中的记录。
8.状态栏显示是否正确。
9.是否响应键盘事件(Enter,Delete,Tab)
10。按退出按钮是否能正常终止主应用程序。
编辑控件的应用测试:
1.& 显示控件和编辑控件应该加以区分
2.& .属性是否齐全
3.& 控件的应用是否合理
4.& 能否正常接收数据,对非法类型数据是否进行了控制。
5.& 允许输入的数据长度是否符合要求。
6.& 控件的边界状态是否设定。如文本框的滚动条等。
7.& 是否有快捷键,快捷键是否有效。
8.& 主要的功能按钮是否响应键盘事件。(Esc:退出;&& :前删;delete:删除选定的项;F1:调出帮助;F5:调出定位或查找界面;Enter:确定和光标移动;alt+F4:调出参照框;键盘上的4个浏览按钮适用于树的扩展与伸收,及控件内部的光标移动,其中向下的箭头用于下拉框;Tab:用于控件的焦点移动;Alt-浏览按钮:用于选定菜单功能)
通用对话框测试:
1.& 图标,标题是否正确。
2.& 标签,提示文本是否正确合理。
3.& 功能按钮是否齐全,是否合理有效。(包括关闭小按钮:X,相当于取消对话框的功能。)
参照框测试:
参照:分树型、树表、列表型参照:
l&& 对于树型参照,是否应只显示末级记录,而不是所有记录
l&& 可选择参照编码,名称或者助记码
l&& 模糊参照和预过滤的功能
l&& 参照可以设置栏目
l&& 可以对参照记录进行快速匹配定位,且该定位记录自动显示在当前屏(目前存在此问题)
l&& 可以对参照记录进行主,次关键字排序,或者通过单击表头对任一列排序
l&& 参照的自动检查
l&& 参照文本框获得焦点时显示编码,离开显示名称
l&& 模糊参照:输入01* 再按参照按钮,将只显示以01开头的记录
l&& 输入0101????显示编码为8为且以0101开头的记录
l&& 参照预定位,输入01,再按参照按钮,光标停在01开头的记录
l&& 双击参照表格的一行,结束参照并返回
l&& 对应参照返回的数据,在保存数据库时也要进行业务合法性检查,因为参照返回的数据不一定是数据库中存在的,可能在写数据库前基础数据已发生改变,
状态栏测试
增加,修改,保存,删除等操作应在状态栏显示其操作状态(成功、失败等)。
随操作不同,状态应做相应的变化。
在查询大数据量时,是否有提示用户等待窗口。
界面级校验测试
如.起始日期不能大于截止日期,如果大于是否有错误提示,提示文本是否正确。
业务功能测试
系统初始化状态测试
1.&& 系统初始化分为两种,初次使用本系统时各界面的初始化和再次使用本系统时各界面的初始化。主要测试各菜单和功能按扭的缺省状态(变灰与激活)是否合理;各种控件的缺省值是否正确。
2.对于母子表的界面,注意母子表是否能同步显示,显示的明细记录是否正确。
l&& 操作逻辑是否合理(包括业务数据输入的先后顺序)。比如应先定位树节点,再按新增按钮;
l&& 按下新增按钮后,各功能按钮和菜单状态变化是否正确;界面的编辑框是否刷新(注意合理的保留值不应刷新);光标定位是否合理。
l&& 能否输入合法的数据;能否正常地调出参照框,并导入所需的数据(包括下拉框,参照对话框,右键菜单等)。能否正常修改或清除数据(需要注意参照框的此项要求)。
l&& 在没保存所编辑的记录时,进行其他操作,系统是否提示保存新增记录,对话框文本是否正确合理。
l&& 按保存按钮后,是否进行全面的逻辑校验(与设计文档相符),与正常的业务逻辑保持一致;提示文本是否正确合理,对话框能否正常操作(见非正常用例阶段的通用对话框测试描述)。退出对话框后光标定位是否合理。
l&& 能否正常保存数据。界面数据显示是否正确。菜单、其它功能按钮及控件状态变化是否合理。
l&& 能否查询到此记录,查询到的结果是否与输入的一致。
l&& 能否正常修改数据。
l&& 不应该修改的编辑框是否锁死。
l&& 在没保存所编辑的记录时,进行其他操作,系统是否提示保存新增记录,对话框文本是否正确合理。
l&& 按保存按钮后,是否进行全面的逻辑校验(与设计文档相符),与正常的业务逻辑保持一致;提示文本是否正确合理,对话框能否正常操作(见非正常用例阶段的通用对话框测试描述)。退出对话框后光标定位是否合理。
l&& 能否正常保存修改数据,界面数据显示是否正确。菜单、其它功能按钮及控件状态变化是否合理。
l&& 能否查询到此记录,查询到的结果是否与输入的一致。
l&& 删除分为记录删除和行删除两种。
l&& 删除操作逻辑是否合理。如先定位后删除,一次性删除多条等。
l&& 按删除按钮是否有提示,提示文本是否正确合理。
l&& 具有业务逻辑时,是否遵循逻辑删除规则,是否有提示,提示文本是否正确。
l&& 记录是否从界面上清除。是否显示上一条记录,菜单、功能按钮、各种编辑控件状态是否正确。
l&& 通过查询,验证是否正常删除。
l&& 按保存后是否进行所有的业务逻辑校验。是否有提示,提示文本是否正确。
l&& 保存后,记录是否从界面上清除。是否显示上一条记录,菜单、功能按钮、各种编辑控件状态是否正确。
l&& 输入正常的匹配值能否查询到合适的记录。
l&& 对于较长时间的查询是否有等待提示窗口。
l&& 注意条件为时间段的查询。
l&& 如果没有缺省条件,直接按查询按钮是否能查出所有的记录。
l&& 对于组合查询,应进行互相匹配验证查询。
l&& 注意通过双击记录带出明细的操作模式。
l&& 所有条件是否能单独和组合查询,列表框数据刷新是否正确。
输入合理的值,光标能否定位在适当的位置。
l&& 在新增或修改状态直接退出,系统是否提示保存,提示文本是否正确。
l&& 能否正常退出操作界面。
8.6). ValubleObject:数值对象
一个VO类包装一组代表业务含义的数据,负责在系统各层之间传递业务数据。通常一个VO对应一个数据库表,但也可以对应多个数据库表,或对应一个数据库表的部分字段。
质量保证标准
该类是否继承于VO类
get()和set()方法是否齐全
VO类是否包含每个需要持久化属性的setXXX和getXXX方法。
在set方法中是否对属性进行合法性校验,校验失败抛出ValidationException异常
该类应包含无参构造子、只含参数OID的构造子
全参构造子中参数的顺序是否与set语句的顺序一致?(去掉)
在每个set方法中是否有修改对应属性的语句体?
在每个get方法中是否有返回对应属性的语句体?
空值问题
所有为保存操作员的录入数据而创建VO对象的类属性应初始化为null,直到操作员录入数据时才为相应属性分配空间和赋值。在保存到数据库时,把空属性(null)映射为数据库相应字段的null。
Integer、Double包装类型
由于Java的Primitive Type类型(如int、double)不是对象,所以不能使用它们作为类属性类型,应该采用对应的Integer、Double等相应的包装类型。
8.7).&& BO业务对象层:
每个BO类都继承BusinessObject类。BO对象通过操纵DMO对象和其他BO对象完成业务逻辑。
质量保证标准
&BO类中是否存在名称相同且参数个数相同的方法
一个BO类中不能有名称相同且参数个数相同的两个方法同时存在。因为目前中间件生成工具处理此情况存在问题
事件监听器和处理事件
不建议使用可视化进行事件处理,请手工注册事件监听器和处理事件
因为可以减少不必要的代码
所有异常应打印出来,可使用下述语句:
e.printStackTrace(System.err);
BO的所有业务方法都必须抛出异常:java.rmi.RemoteE否则将不能生成EJB辅助代码
BO对象中使用其它BO对象或环境变量时
在BO对象中如要使用其它BO对象或环境变量,必须使用getBeanHome()和getEnvProperty()方法获得,不要直接使用JNDI查询。使用其它BO对象的方法代码示例如下:
&&&&&&&&&&&&& BO2Home home = getBeanHome(“BO2Name”, BO2Home.class);
&&&&&&&&&&&&& BO2 bo2 = BO2Home.create();
基类BusinessObject包含了SessionBean接口中的setSessionContext()、ejbCreate()、ejbActivate()、ejbPassivate()、ejbRemove()方法。这是提供给EJB Server的调用接口,不要在你的BO类中调用这几个方法。
工具生成代码是否可用
在CodeSeed为一个数据库表生成代码时,你可以选择包含BO类以及home、remote接口、BO_Client(客户端代理)。所有这些代码演示系统各层之间的调用关系,这些类是否根据业务要求加以调整
BO类的设计要遵循大粒度(coarse-grained)的原则
即尽量将一项业务的所有方法放入同一个BO类中。这是设计EJB(尤其是Stateless Session Bean)的一项原则,它能有效的提高对系统资源的利用。具体到我们的编码实践中,虽然CodeSeed针对每个DMO类生成了一个BO类,但我们要将相关的BO类整合成一个BO类。
BO类中方法的命名是否反映该方法的业务含义
虽然CodeSeed生成的代码中将方法命名为insert()、update()等,还应将它们更名为addBill()、auditBill()等业务名称
BO类是否生成供客户端调用BS端的代码
当设计完BO类后,需调用NC EJB开发工具集生成和部署代码,生成瘦客户端,供客户端调用BS端的代码。
在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对象的实例,否则中间件将无法控制和确保其事务属性的正确实现
向数据库插入一条记录时,是否为它获得唯一主键(OID)
提供OID的算法由系统管理统一处理,通过在DMO基类的两个接口方法getOID(String pk_corp)和getOIDs(String pk_corp, int amount)提供给业务模块使用。其中,参数pk_corp是此记录所属的公司的主键。如果参数pk_corp为null,则默认为集团公司的数据。
业务级校验
业务级校验方法是否齐全
8.8). DMO(数据管理对象):
质量保证标准
每个DMO类是否都继承DataManageObject。
数据库的利用效率
为了提高数据库的利用效率,是否尽量使用PreparedStatement执行SQL操作,不要使用Statement
DMO类中方法的完整性
1.通常DMO类中应包含insert()、delete()、update()方法。还可以包括其它的查询方法。
2.对一些特殊的继承类,如处理参数设置的DMO类,可能不需要insert()和delete()方法。
数据库连接
在DMO类中,数据库连接必须通过getConnection()方法获得,不允许直接使用JNDI查询
数据库资源的获得和释放
应在DMO类每个方法的获得Connection、PreparedStatement两种数据库资源,并在方法的结束位置释放数据库资源。
库表主键值
在DMO类的一个方法中向数据库插入(insert)数据时,是否使用getOID()方法获得一个自动产生的库表主键值。
是否尽量使用VO数组
如果DMO类中的方法需要返回业务数据,则通常是VO对象或VO对象的数组(或集合)。当客户端需要多个VO对象时,是否尽量使用VO数组的形式返回,以提高数据库和网络效率,不要将多个VO一个一个的查询和返回
DMO对象调用另一个BO对象时
如果你在DMO对象中需要使用BO对象(通常是提供公共服务的BO),必须使用getBeanHome获得BO对象的home接口。
自动生成代码的调整
在CodeSeed生成的代码中包含了delete(VO)、insert(VO)、update(VO)、insertArray(VO[])、queryAll()等方法。是否根据业务需要增加、删除、调整DMO类中的方法。
参数pk_corp的使用
在DMO中的insert()等方法中,向数据库插入记录时,要通过getOID(String pk_corp)或getOIDs (String pk_corp, int amount)为该记录获得一个记录主键(OID),如果参数pk_corp为null,则默认为集团公司。
用VO对象写库时
数据库表中加一字段时,执行stmt = con.prepareStatement(sql)后,执行stmt.setString(3, invcl.getInvclasscode()语句中的序号是否与数据库表中字段顺序一致(举例附后)
条件拚写语句
条件拚写语句是否符合业务逻辑
DMO类的查询、增加、修改方法
查询:执行完查询Sql语句ResultSet rs = stmt.executeQuery()后,是否对查询vo对象正确地赋值,且赋值属性是否有遗漏
增加:执行完插入Sql语句stmt = con.prepareStatement(sql); 是否对stmt正确地赋值,且赋值属性是否有遗漏,然后执行stmt.executeUpdate()更新数据库
更新:执行完更新Sql语句stmt = con.prepareStatement(sql); 是否对stmt正确地赋值,且赋值属性是否有遗漏,然后执行stmt.executeUpdate()更新数据库
错误码DM13举例,如:数据库表bd_invcl中加一字段avgprice,执行完后sql语句后,PreparedStatement类型的stmt中执行set语句的顺序要与数据库表中字段顺序一致。否则出错
String sql = &insert into bd_invcl(pk_invcl, invclassname, invclasscode, endflag, avgprice, invclasslev) values(?, ?, ?, ?, ?, ?)&;
&&&&&&&&&&& Connection con =
&&&&&&&&&&& PreparedStatement stmt =
&&&&&&&&&&& 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 newO
&&&&&&&&&&& }&&&&&&&&& 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). 样例:
如存货基本档案
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).树表结构
l& 1.树中节点级次混乱
l& 2.选择末级节点时,树中节点与列表中记录没有对应
l& 3.一进入树表结构型的界面中,选择末级节点时,没有激活“增加”按钮,
l& 4.按增加,没有缺省切换到第一页,从树中所选分类没有自动带入
6)报错信息:
l& 1.错误信息提示不准确
l& 2.当操作合法时,也出现报错信息框
如:光标定位于左边tree中的某一节点时,报错信息为:
只有第二级以下的节点或末级节点表才能展开。
测试数据设计
测试数据表
&测试类名:
&方 法 名:
所属模块:
(允许误差)
估计错误原因
不合法数据
代码测试报告填写说明
代码测试报告填写说明
类名称及版本
测试执行日期及版本
确定修改人员
确认修改状态
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:149792次
积分:2962
积分:2962
排名:第5580名
原创:136篇
转载:110篇
评论:43条
&&5年大型外企经验,历任java程序员、软件测试工程师、高级软件测试工程师,资深自动化测试工程师,先后多次受邀参加各种软件测试技术论坛会议,先后多次客座51testing专家栏目网上答疑,51cto网络学院兼职资深测试讲师,精通英日双语
2009年11月加入惠普武汉公司,先后参与了2个项目的测试工作,主要业务是ITIL,航空。
&&在惠普期间,业余时间,和朋友创办BQuickTest自动化测试咨询工作室()(提供自动化测试技术讨论,自动化测试服务,企业内训,企业测试解决方案),2011年7月由于各种原因被迫关闭
&&号因个人职业规划发展的需要离开惠普武汉分公司,加盟武汉科码软件有限公司,任测试部门主管,负责组建测试部门,加盟3天后,为其建立测试部门流程规范,建立测试部门绩效考核,招人用人等一系列规范,基于项目建立测试技术选型和团队建设,人才培养机制等一系列举措,最后因某种不得不离开。
&&号加入无锡海辉。
&&2013年8月因个人职业规划原因离开无锡海辉软件有限公司,加入塔塔(TCS)信息技术股份有限公司中国深圳分公司
学习是一个永无止境的过程,而且是越学越感觉&无知&,博客在于思考、总结、提升 自己
个人联系方式: sina邮箱: 微信:jason_txj
(2)(2)(1)(12)(2)(13)(13)(1)(3)(2)(7)(1)(4)(2)(3)(3)(1)(6)(2)(2)(6)(5)(1)(2)(3)(2)(24)(7)(6)(3)(2)(4)(7)(40)(3)(20)(6)(12)(7)(1)(3)

我要回帖

更多关于 运算器的主要功能是 的文章

 

随机推荐