使用过 python unittest 的人应该知道,unittest 的每个类里面的单元测试用例在执行的时候是按照函数的名称顺序去执行的,虽然可以通过把函数名称都写成test_001_dosomething
这种,但是感觉并不方便,因为如果我哪天要在之前已经订好名称的用例前面加一个用例那名称就不好办了,所以,鉴于此,我这几天都在想办法写个元类来修改这些函数名称,于是有了下面这个元类
class Meta(type):
def __new__(cls, name, parents, attrs):
LONG = 4
id = 1
_attrs = {}
for k, v in attrs.items():
if k.startswith('test_'):
id_str = str(id).zfill(LONG)
_k = k.replace('test_', 'test_{}_'.format(id_str))
_attrs[_k] = v
id += 1
else:
_attrs[k] = v
return type.__new__(cls, name, parents, _attrs)
但是我很快就发现,这个类根本不会有意义,虽然我通过这个类可以给函数改名称,但是由于attrs
本身是一个字典,是无序的,所以我其实是在给一个无序的字典重命名,根本没有意义。
所以我的问题是:怎么获取一个类的函数的先后顺序?我知道类形成之后 dir()可以得到一个有序的属性列表,但是怎么通过元类来获取这个列表?
或者直接一点,怎么给 unittest 的单元用例排序,让它按照函数的添加顺序执行即可。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.