這周的《軟件測試技術》,我們系統地學習到了等價類划分、邊界值分析、因果圖法和決策表法。等價類划分法和邊界值分析方法都是着重考慮輸入條件,下面我先通過一個實際問題更為透徹地介紹下等價類划分,至於其定義和原理詳見我的上一篇博客http://www.cnblogs.com/xlwm/p/4343612.html。
1.問題描述
EditBox:
允許1到6個英文字符或數字,按OK結束
(通過輸入字符串,返回信息)
2.等價類划分
| 有效等價類 | 編號 | 無效等價類 | 編號 | |
| 長度 | 1-6 | 1 | 0,6以上 | 3 |
| 字符 | a-z,A-Z,0-9 | 2 | 英文/數字以外字符,控制字符,標點符號 | 4 |
3.測試用例
針對等價類的划分,我們可以選取以下作為測試用例:
| 編號 | 輸入 | 覆蓋等價類 | 預期輸出 |
| Test1 | 1 | 1,2 | It's OK. |
| Test2 | a | 1,2 | It's OK. |
| Test3 | Z | 1,2 | It's OK. |
| Test4 | 123456 | 1,2 | It's OK. |
| Test5 | 1a9T0z | 1,2 | It's OK. |
| Test6 | 123 | 1,2 | It's OK. |
| Test7 | 3 | Please input reasonable string. |
|
| Test8 | 1234568 | 3 | Please input reasonable string. |
| Test9 | 2; | 4 | Please input reasonable string. |
| Test10 | \n¥& | 4 | Please input reasonable string. |
| Test11 | ;@keoffad | 3,4 | Please input reasonable string. |
| Test12 | ^afafaf3v | 3,4 | Please input reasonable string. |
4.代碼實現及結果樣例:
我們都知道正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,我們就認為它“匹配”了,否則,該字符串就是不合法的。
所以我們判斷一個字符串是否是合法的方法是:
-
創建一個匹配該字符串的正則表達式;
-
用該正則表達式去匹配用戶的輸入來判斷是否合法。
因為正則表達式也是用字符串表示的,所以,我們要首先了解如何用字符來描述字符。
這幾天我一直在研究python,發現用python是種清晰划一 、功能強大、用途廣泛的語言。而python提供re模塊,則包含所有正則表達式的功能,其中match()方法判斷是否匹配,如果匹配成功,返回一個Match對象,否則返回None。常見的判斷方法就是:
1 test = '用戶輸入的字符串' 2 if re.match(r'正則表達式', test): 3 print 'ok' 4 else: 5 print 'failed'
而在正則表達式中,如果直接給出字符,就是精確匹配。用\d可以匹配一個數字,\w可以匹配一個字母或數字
要做更精確地匹配,可以用[]表示范圍,比如:
-
[0-9a-zA-Z\_]可以匹配一個數字、字母或者下划線; -
[0-9a-zA-Z\_]+可以匹配至少由一個數字、字母或者下划線組成的字符串,比如'a100','0_Z','Py3000'等等; -
[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划線開頭,后接任意個由一個數字、字母或者下划線組成的字符串,也就是Python合法的變量; -
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精確地限制了變量的長度是1-20個字符(前面1個字符+后面最多19個字符)。
另外A|B可以匹配A或B,所以[P|p]ython可以匹配'Python'或者'python'。^表示行的開頭,^\d表示必須以數字開頭。$表示行的結束,\d$表示必須以數字結束。
綜上所述,通過這些准備知識,我們可以得知問題所對應的正則表達式便是'^\w{1,6}$',看起來是不是立馬高大上,十分簡單呢?
最終代碼實現如下:
1 __author__ = 'xinlan' 2 # -*- coding: utf-8 -* 3 4 from Tkinter import * 5 import tkMessageBox 6 import re 7 8 def judge(str): 9 if re.match(r'^\w{1,6}$', str): 10 return True 11 else: 12 return False 13 14 class Application(Frame): 15 def __init__(self, master=None): 16 Frame.__init__(self, master) 17 self.pack() 18 self.createWidgets() 19 20 def createWidgets(self): 21 self.nameInput = Entry(self) 22 self.nameInput.pack() 23 self.alertButton = Button(self, text='OK', command=self.ok) 24 self.alertButton.pack() 25 26 def ok(self): 27 name = self.nameInput.get() 28 #print(judge(name)) 29 if(judge(name)): 30 tkMessageBox.showinfo('Message', 'It\'s OK') 31 else: 32 tkMessageBox.showinfo('Message','Please input reasonable string') 33 34 app = Application() 35 # 設置窗口標題: 36 app.master.title('Test') 37 # 主消息循環: 38 app.mainloop()
這是部分測試用例的結果圖:
(點擊OK出現結果,點擊OK返回主界面)
(1)

(2)
(3)
