1.各層公用問題
|
2.JAVA語言規範
|
3.數據類型
|
4.SQL語句規範
|
5 界面UI
|
6.VO數值對象
|
7.BO業務對象
|
8.DMO數據管理對象
|
9.業務邏輯重點
|
10.事務處理與隔離級別測試(詳見總體技術部相關文檔)
|
11.效率測試(詳見總體技術部相關文檔)
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
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、及需求報告說明書
|
|
|
|
|
|
|
|
|
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
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不僅用於對子類可見,也用於對同一個包的其它所有類可見
|
|
|
|
|
|
|
|
|
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
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)--設置串並取消鎖定
任何設置都會修改以前設定的鎖定長度
|
|
|
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
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
|
函數
|
不允許動態創建函數。
|
|
|
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
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、界面規範測試
|
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
|
退出
|
· 在新增或修改狀態直接退出,系統是否提示保存,提示文本是否正確。
· 能否正常退出操作界面。
|
|
|
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
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等相應的包裝類型。
|
|
|
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
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
|
業務級校驗
|
業務級校驗方法是否齊全
|
|
|
|
序號
|
測試項
|
測試內容
|
質量保證標準
|
問題屬性
|
出錯頻率
|
DM0
|
繼承類
|
每個DMO類是否都繼承DataManageObject。
|
|
|
|
DM1
|
數據庫的利用效率
|
爲了提高數據庫的利用效率,是否儘量使用PreparedStatement執行SQL操作,不要使用Statement
|
|
|
|
DM2
|
DMO類中方法的完整性
|
1 通常DMO類中應包含insert()、delete()、update()方法。還可以包括其它的查詢方法。
2 對一些特殊的繼承類,如處理參數設置的DMO類,可能不需要insert()和delete()方法。
|
|
|
|
DM3
|
數據庫連接
|
在DMO類中,數據庫連接必須通過getConnection()方法獲得,不允許直接使用JNDI查詢
|
|
|
|
DM4
|
數據庫資源的獲得和釋放
|
應在DMO類每個方法的獲得Connection、PreparedStatement兩種數據庫資源,並在方法的結束位置釋放數據庫資源。
|
|
|
|
DM5
|
庫表主鍵值
|
在DMO類的一個方法中向數據庫插入(insert)數據時,是否使用getOID()方法獲得一個自動產生的庫表主鍵值。
|
|
|
|
DM7
|
是否儘量使用VO數組
|
如果DMO類中的方法需要返回業務數據,則通常是VO對象或VO對象的數組(或集合)。當客戶端需要多個VO對象時,是否儘量使用VO數組的形式返回,以提高數據庫和網絡效率,不要將多個VO一個一個的查詢和返回
|
|
|
|
DM9
|
DMO對象調用另一個BO對象時
|
如果你在DMO對象中需要使用BO對象(通常是提供公共服務的BO),必須使用getBeanHome獲得BO對象的home接口。
|
|
|
|
DM11
|
自動生成代碼的調整
|
在CodeSeed生成的代碼中包含了delete(VO)、insert(VO)、update(VO)、insertArray(VO[])、queryAll()等方法。是否根據業務需要增加、刪除、調整DMO類中的方法。
|
|
|
|
DM12
|
參數pk_corp的使用
|
在DMO中的insert()等方法中,向數據庫插入記錄時,要通過getOID(String pk_corp)或getOIDs (String pk_corp, int amount)爲該記錄獲得一個記錄主鍵(OID),如果參數pk_corp爲null,則默認爲集團公司。
|
|
|
|
DM13
|
用VO對象寫庫時
|
數據庫表中加一字段時,執行stmt = con.prepareStatement(sql)後,執行stmt.setString(3, invcl.getInvclasscode()語句中的序號是否與數據庫表中字段順序一致(舉例附後)
|
|
|
|
DM14
|
條件拚寫語句
|
條件拚寫語句是否符合業務邏輯
|
|
|
|
DM15
|
DMO類的查詢、增加、修改方法
|
查詢:執行完查詢Sql語句ResultSet rs = stmt.executeQuery()後,是否對查詢vo對象正確地賦值,且賦值屬性是否有遺漏
增加:執行完插入Sql語句stmt = con.prepareStatement(sql); 是否對stmt正確地賦值,且賦值屬性是否有遺漏,然後執行stmt.executeUpdate()更新數據庫
更新:執行完更新Sql語句stmt = con.prepareStatement(sql); 是否對stmt正確地賦值,且賦值屬性是否有遺漏,然後執行stmt.executeUpdate()更新數據庫
|
|
|
|
測試數據表
|
||||||
測試類名:
方法名:
|
測試人:
所屬模塊:
|
編號:
|
||||
序號
|
測試目的
|
輸入數據
|
實際輸出
|
期望輸出
|
差異與否
(允許誤差)
|
估計錯誤原因
|
1
|
匹配條件
|
|
|
|
|
|
2
|
邊界測試
|
|
|
|
|
|
3
|
條件分支
|
|
|
|
|
|
4
|
循環
|
|
|
|
|
|
5
|
不合法數據
|
|
|
|
|
|
備註
|
|
|
|
|
|
|
項目編號
|
1
|
類名稱及版本
|
2
|
|||||||||||||||||
項目名稱
|
3
|
測試人員
|
4
|
|||||||||||||||||
測試執行日期及版本
|
5
|
|
|
|
||||||||||||||||
方法名稱
|
標識號
|
測試結果
|
問題描述
|
問題屬性
|
問題類別
|
修改確認
|
確定修改人員
|
返回次數
|
確認修改狀態
|
|||||||||||
1
|
2
|
3
|
4
|
5
|
6
|
|||||||||||||||
6
|
7
|
8
|
9
|
10
|
11
|
|
12
|
13
|
14
|
|||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|