Python自学周记(五)
本周在电脑上安装了项目骨架,开始学习自动化测试以及自己编写测试程序。
所谓的自动化测试,就是编写一段测试代码代替你去检验你所设计的产品,就拿上周学习的游戏代码来说,如果要人为的测试,需要把所有指令都输入一遍,第一个场景还好,第三个输入密码的场景,每失败一次就要从头再来,那个过程别提多枯燥了(别问我是怎么知道的)。所以自动化测试是非常必要的,假如哪一天对这个游戏进行了修改,只需要运行测试代码就可以了。
了解了自动化测试,便马上自己动手写一段测试程序。
先测试一小部分,测试用例如下:
from nose.tools import *
from ex48 import lexicon
def test_directions():
assert_equal(lexicon.scan("north"),[('direction','north')])
result = lexicon.scan("north south east")
assert_equal(result,[('direction','north'),
('direction','south'),
('direction','east')])
我要编写的是一个扫描器,扫描的结果是[(‘direction’,‘XXX’)]形式的列表。看到列表,首先想到了要用 for 循环把元素依次放入列表中。书中提示到需要应用“try—except”组合,把要运行的代码放在“try”中,把出错后的执行的命令放在“except”中,通过这种方法排除异常,捕获错误。下图为我第一次尝试编写的代码:
directions = ('north','south','east') #需要扫描的元组
class lexicon(object):
def scan(self,stuff):
self.stuff = stuff
words = stuff.split(' ') #以空格为标记将字符串分开
list = []
for i in words :
try:
list.append(('direction',i))
except:
return None
第一个代码可谓错误百出:
(1)module ‘ex48.lexicon’ has no attribute ‘scan’
因为 lexicon_tests.py文件调用时用的是 ex48 而不是 ex48.lexicon ,所以不能用类书写,要想用类书写,需将测试程序的 from ex48 import lexicon 改为 from ex48.lexicon import lexicon 。
(2)scan() missing 1 required positional argument: ‘stuff’
意思是:scan()缺少1个必需的位置参数:“stuff” 。这里不需要加 self ,直接引用 stuff 即可。因为测试程序中 scan 函数的作用就是这里 stuff 的作用,加了 self 反而多此一举。
(3)None != [(‘direction’, ‘north’)]
指没有收到[(‘direction’, ‘north’)]列表,我们忘记设置返回值,加上即可。要注意的是 return 要在 for 循环里,不然会报错。
改正后的代码为:
directions = ('north','south','east') #需要扫描的元组
class lexicon(object):
def scan(stuff):
words = stuff.split(' ') #以空格为标记将字符串分开
list = []
for i in words :
try:
list.append(('direction',i))
except:
return None
return list
测试结果:
习题里需要测试类似这样的六段代码,只需要在 for 循环中加入 if
语句判断即可。
例如:
if i in directions:
list.append(('direction',i))
elif i in verbs:
list.append(('verb',i))
……
最终的测试结果为:
目前只是初步了解了自动化测试,还需要大量的练习才能熟练掌握。