技术宅,fat-man

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

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

重构实例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   codestyle  阅读(487)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示