技术宅,fat-man

增加语言的了解程度可以避免写出愚蠢的代码

导航

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

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

 1 class OpenApiBase:
 2     def __init__(self):
 3         self.funPOST = self.POST
 4         self.POST = self.post
 5     
 6     #将post函数声明为支持可变参数的函数,这样它可以处理子类的POST函数有多个参数的情况
 7     def post(self,*args):
 8         try:
 9             wi =  web.input()
10             token = wi.token
11             self.serverToken = getServerToken(db,token)
12             
13             web.debug(str(self.serverToken))
14             
15             if self.serverToken == False:
16                 return '{"result":"error","message":"token is error"}'
17 
18             if checkExpires(self.serverToken):
19                 return '{"result":"error","message":"token is expires"}'
20 
21             #执行每个子类具体的代码,注意:apply将可变参数送入funPOST
22             return apply(self.funPOST,args)
23         except:
24             if DEBUG:
25                 raise
26             return '{"result":"error","message":""}'
27 
28 class getFolders(OpenApiBase):
29     #该函数有两个参数,action是业务逻辑里必须的,因此父类的post函数调用时必须传递进来
30     def POST(self,action):
31         wi = web.input()
32 
33         userId = self.serverToken.userId #子类拿到包含身份信息的变量,该变量是父类创建,通过属性拿到
34         
35         if action == "person": #使用action
36             list = tnuser.User.getPersonFolders(db,userId)
37             return '{"result":"ok","message":"","data":%s}' %(json.dumps(list))
38         
39         if action == "project": #使用action
40             projectId = util.unhash17(int(wi.id))
41             folderId = getProjectRootFolderId(db,projectId)
42             if folderId == -1:
43                 return '{"result":"error","message":"","data":[]}'
44             
45             list = folder.getSubFolders(db,folderId,userId)
46             for i in list:
47                 i["projectId"] = util.hash17(i["projectId"])
48             return '{"result":"ok","message":"","data":%s}' %(json.dumps(list))
49         
50         if action == "subfolder": #使用action
51             folderId = int(wi.id)
52             list = folder.getSubFolders(db,folderId,userId)
53             for i in list:
54                 i["projectId"] = util.hash17(i["projectId"])
55             return '{"result":"ok","message":"","data":%s}' %(json.dumps(list))
56         
57         return '{"result":"error","message":"","data":[]}'

 

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

我理解调试指的是单步啥的,但是测试是根据接口,预先定义好输入输出,什么样的输入会产生什么样的输出,一旦不符合规则,立即报警,且可以重复执行的脚本性程序

posted on 2012-07-27 14:26  codestyle  阅读(492)  评论(0)    收藏  举报