关于 unittest 的用例排序问题的困扰

2019-03-30 22:01:15 +08:00
 Hopetree

使用过 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 的单元用例排序,让它按照函数的添加顺序执行即可。

2080 次点击
所在节点    Python
10 条回复
billlee
2019-03-31 01:35:40 +08:00
unit tests 不应该有相互依赖,如果需要控制执行顺序,就说明写得有问题
9hills
2019-03-31 01:43:58 +08:00
用__dir__()可以指定,但是并没有什么卵用,只要 dir,它就会给你排个序…
9hills
2019-03-31 01:47:08 +08:00
但是 unittest 的排序应该不是用的 dir,你参考下这个

https://docs.python.org/2/library/unittest.html#unittest.TestLoader.sortTestMethodsUsing
msg7086
2019-03-31 01:50:37 +08:00
测试为什么要有依赖……每个测试应该是一个独立环境,执行先后顺序应该不影响测试结果。
Hopetree
2019-03-31 02:02:29 +08:00
@msg7086
@billlee
有的接口测试需要有依赖关系啊
Trim21
2019-03-31 02:03:30 +08:00
抛开测试应该不应该有依赖说句无关的

python3.6 以上的字典是保证有序的...

然后 cls.__dict__里 key 的排序是按照定义的顺序来的, 你可以从__dict__里面取
msg7086
2019-03-31 02:33:21 +08:00
@Hopetree 接口测试要什么依赖。
一个测试,跑之前建好环境,跑之后清理环境,哪能利用另一个测试用例给你建环境的。
Hopetree
2019-03-31 14:32:11 +08:00
@msg7086 我看我们公司用 fastunit 就是用例之间有依赖关系的,比如说,第一个接口创建了一个指定的用户,第二个接口更新用户信息,所以执行第二个的前提是第一个用例执行完成。当然,如果第二个用例自己创建用户自己更新也可以,但是这里就不仅仅调用了一个接口了。。。。反正我看公司的 fastunit 都是这样的,因为 fastunit 好像是按照编辑的顺序执行的,所以我才想着怎么让 unittest 也实现根据用例顺序执行,这个也算是一种探索用法,不仅仅针对某个测试
264768502
2019-03-31 17:17:40 +08:00
换 pytest 或者 nose
msg7086
2019-03-31 23:28:29 +08:00
@Hopetree 是的,不建议按照你们这样的方式来搞。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550365

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX