重构实例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:
我理解调试指的是单步啥的,但是测试是根据接口,预先定义好输入输出,什么样的输入会产生什么样的输出,一旦不符合规则,立即报警,且可以重复执行的脚本性程序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述