实例分析等价类划分(一)
这周的《软件测试技术》,我们系统地学习到了等价类划分、边界值分析、因果图法和决策表法。等价类划分法和边界值分析方法都是着重考虑输入条件,下面我先通过一个实际问题更为透彻地介绍下等价类划分,至于其定义和原理详见我的上一篇博客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)