您的位置:首页 > 编程语言

重构实例1:抽取冗余代码 - 未通过测试而进行的第二次修正

2012-07-27 14:26 691 查看
昨天重构了OPEN-API模块,挺高兴,觉得自己做的不错,结果昨天把程序重构完,除了挑出来作为测试接口的代码其他代码都没有测试,今天上午要做其他的维护工作,觉得还是先跑一次测试再说,测试程序并不是特地为这个接口进行开发,当时为这个OPEN-API写了一个SDK,这个程序其实是为了SDK开发的测试程序,且写的并不完善,但即使是这样,测试程序的断言(assert)仍然报告执行出了问题,因此我又去排查程序,发现有几个接口,它的函数参数不只一个参数(self参数),而我的几类再调具体子类的时,就没有提供其他的参数,因此产生运行时错误,了解到这一点,就翻了手上的《python学习手册》花了一个小时解决问题

class OpenApiBase:
def __init__(self):
self.funPOST = self.POST
self.POST = self.post

#将post函数声明为支持可变参数的函数,这样它可以处理子类的POST函数有多个参数的情况
def post(self,*args):
try:
wi =  web.input()
token = wi.token
self.serverToken = getServerToken(db,token)

web.debug(str(self.serverToken))

if self.serverToken == False:
return '{"result":"error","message":"token is error"}'

if checkExpires(self.serverToken):
return '{"result":"error","message":"token is expires"}'

#执行每个子类具体的代码,注意:apply将可变参数送入funPOST
return apply(self.funPOST,args)
except:
if DEBUG:
raise
return '{"result":"error","message":""}'

class getFolders(OpenApiBase):
#该函数有两个参数,action是业务逻辑里必须的,因此父类的post函数调用时必须传递进来
def POST(self,action):
wi = web.input()

userId = self.serverToken.userId #子类拿到包含身份信息的变量,该变量是父类创建,通过属性拿到

if action == "person": #使用action
list = tnuser.User.getPersonFolders(db,userId)
return '{"result":"ok","message":"","data":%s}' %(json.dumps(list))

if action == "project": #使用action
projectId = util.unhash17(int(wi.id))
folderId = getProjectRootFolderId(db,projectId)
if folderId == -1:
return '{"result":"error","message":"","data":[]}'

list = folder.getSubFolders(db,folderId,userId)
for i in list:
i["projectId"] = util.hash17(i["projectId"])
return '{"result":"ok","message":"","data":%s}' %(json.dumps(list))

if action == "subfolder": #使用action
folderId = int(wi.id)
list = folder.getSubFolders(db,folderId,userId)
for i in list:
i["projectId"] = util.hash17(i["projectId"])
return '{"result":"ok","message":"","data":%s}' %(json.dumps(list))

return '{"result":"error","message":"","data":[]}'


最后,对测试程序做个说明 镇宅神兽 13:36:58:

我理解调试指的是单步啥的,但是测试是根据接口,预先定义好输入输出,什么样的输入会产生什么样的输出,一旦不符合规则,立即报警,且可以重复执行的脚本性程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: