在事务逻辑相关的开发中,对象的事务逻辑运行正确与否的测试,总会让开发者头痒、测试者熬夜。
特别是在功能模块开发的早期,与前端尚未建立联系,后端已经稳稳地把代码敲完时,偶尔会出现那么一点空档期,后端人员会迫切想知道,在前端环境中,自己开发的模块到底跑得怎么样(当然,同时掌握双端开发的开发团队结构大都可以无视这个问题,而勤力于登录控制台实际操作后端内存中的对象的开发者也请别见笑)。
于是,懒惰而又谨慎的后端,开始为单端代码,特别是逻辑模块的测试开始想点办法。
俺不是非常资深的测试,也没有牛逼的测试修为,于是一开始想象的建立测试驱动的开发框架在某一次麦当劳午餐期间认栽了,转向了脚踏实地,从小开始的思维方式——对象逻辑测试。
本质上非常简单,就是调用对象的成员方法或者对象的属性的成员方法,以及返回其结果,而这个过程以字符串作为传递,想法来源于基于聊天框的GM命令。
那么,第一点要做的,就是封装一个对象运行和结果返回过程:
def run(self, params_str):
# 解释传入str,获得并组装需要运行的语句
# 之所以不直接输入运行语句,主要是基于使用方便考量
_attr_func, _params = get_attr_and_parsms(params_str)
# 过滤掉各种属性对象,直接获得运行方法
_func = get_func(_attr_func)
# 总个来说,exec可能要好点,但是俺不大清楚exec到底能否返回运行结果
_results = eval(_func%str(_params))
return _results
用例:
# Client input string "dofunction 1 23 55"
client.input(dofunction 1 23 55)
# To server
params_str = socket.recv(_rec)
results = obj.test.run(params_str)
socket.sendall(results)
# Back to client and show
client.show(results)
相当没节操的一个功能,而且安全性也很乱来;
没节操这点罢了,毕竟是用于懒人自测,安全性倒好办,加一个安全锁之类的:
on = False
这时候:
def run(self, params_str):
if not on:
return None
....
只是性能上不那么完美,还算过得去。
使用上,这东西与被测试对象的关系,个人目前选择了测试模块作为对象的从属而不是高于对象本身,这出于易用性考量。
例如:
obj.test_run = run
然后简单整理一下:
class Objter:
def __init__(self, obj):
......
def run(self, params_str):
......
obj.tester = Objter(obj)
然后懒惰去...