关于 unittest 的用例排序问题的困扰 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Hopetree
V2EX    Python

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

  •  
  •   Hopetree
    Hopetree 2019-03-30 22:01:15 +08:00 2781 次点击
    这是一个创建于 2455 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 条回复    2019-03-31 23:28:29 +08:00
    billlee
        1
    billlee  
       2019-03-31 01:35:40 +08:00
    unit tests 不应该有相互依赖,如果需要控制执行顺序,就说明写得有问题
    9hills
        2
    9hills  
       2019-03-31 01:43:58 +08:00 via iPhone
    用__dir__()可以指定,但是并没有什么卵用,只要 dir,它就会给你排个序…
    msg7086
        4
    msg7086  
       2019-03-31 01:50:37 +08:00
    测试为什么要有依赖……每个测试应该是一个独立环境,执行先后顺序应该不影响测试结果。
    Hopetree
        5
    Hopetree  
    OP
       2019-03-31 02:02:29 +08:00
    @msg7086
    @billlee
    有的接口测试需要有依赖关系啊
    Trim21
        6
    Trim21  
       2019-03-31 02:03:30 +08:00
    抛开测试应该不应该有依赖说句无关的

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

    然后 cls.__dict__里 key 的排序是按照定义的顺序来的, 你可以从__dict__里面取
    msg7086
        7
    msg7086  
       2019-03-31 02:33:21 +08:00
    @Hopetree 接口测试要什么依赖。
    一个测试,跑之前建好环境,跑之后清理环境,哪能利用另一个测试用例给你建环境的。
    Hopetree
        8
    Hopetree  
    OP
       2019-03-31 14:32:11 +08:00
    @msg7086 我看我们公司用 fastunit 就是用例之间有依赖关系的,比如说,第一个接口创建了一个指定的用户,第二个接口更新用户信息,所以执行第二个的前提是第一个用例执行完成。当然,如果第二个用例自己创建用户自己更新也可以,但是这里就不仅仅调用了一个接口了。。。。反正我看公司的 fastunit 都是这样的,因为 fastunit 好像是按照编辑的顺序执行的,所以我才想着怎么让 unittest 也实现根据用例顺序执行,这个也算是一种探索用法,不仅仅针对某个测试
    264768502
        9
    264768502  
       2019-03-31 17:17:40 +08:00 via Android
    换 pytest 或者 nose
    msg7086
        10
    msg7086  
       2019-03-31 23:28:29 +08:00
    @Hopetree 是的,不建议按照你们这样的方式来搞。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5088 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:38 PVG 15:38 LAX 23:38 JFK 02:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86