使用过 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 的单元用例排序,让它按照函数的添加顺序执行即可。
1
billlee 2019-03-31 01:35:40 +08:00
unit tests 不应该有相互依赖,如果需要控制执行顺序,就说明写得有问题
|
2
9hills 2019-03-31 01:43:58 +08:00 via iPhone
用__dir__()可以指定,但是并没有什么卵用,只要 dir,它就会给你排个序…
|
3
9hills 2019-03-31 01:47:08 +08:00 via iPhone
但是 unittest 的排序应该不是用的 dir,你参考下这个
https://docs.python.org/2/library/unittest.html#unittest.TestLoader.sortTestMethodsUsing |
4
msg7086 2019-03-31 01:50:37 +08:00
测试为什么要有依赖……每个测试应该是一个独立环境,执行先后顺序应该不影响测试结果。
|
6
Trim21 2019-03-31 02:03:30 +08:00
抛开测试应该不应该有依赖说句无关的
python3.6 以上的字典是保证有序的... 然后 cls.__dict__里 key 的排序是按照定义的顺序来的, 你可以从__dict__里面取 |
8
Hopetree OP @msg7086 我看我们公司用 fastunit 就是用例之间有依赖关系的,比如说,第一个接口创建了一个指定的用户,第二个接口更新用户信息,所以执行第二个的前提是第一个用例执行完成。当然,如果第二个用例自己创建用户自己更新也可以,但是这里就不仅仅调用了一个接口了。。。。反正我看公司的 fastunit 都是这样的,因为 fastunit 好像是按照编辑的顺序执行的,所以我才想着怎么让 unittest 也实现根据用例顺序执行,这个也算是一种探索用法,不仅仅针对某个测试
|
9
264768502 2019-03-31 17:17:40 +08:00 via Android
换 pytest 或者 nose
|