重构实例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:

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

你可能感兴趣的:(测试)