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 · 2261 次点击
    这是一个创建于 2090 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用过 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,它就会给你排个序…
    9hills
        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
    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   ·   实用小工具   ·   1885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:17 · PVG 00:17 · LAX 08:17 · JFK 11:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.