美文网首页
自定义pytest用例执行顺序

自定义pytest用例执行顺序

作者: 虚白无类 | 来源:发表于2019-05-10 19:12 被阅读0次

    默认情况下,pytest测试用例的执行是顺序是和collect的顺序一致的。而collect是按测试目录中test开头的文件名称顺序来的。

    目录结构.png
    如上目录结构,不同测试文件的执行顺序是这样的。
    执行顺序.png
    在一个文件中,用例的执行顺序是从上到下的。这样,除了修改文件名称,想要调整不同测试文件的测试函数的执行顺序似乎无从下手。好在,pytest中有个hook函数pytest_collection_modifyitems就是派这个用处的。

    不过已经有人通过插件pytest-ordering实现了这个功能,详细用法可以见链接中的文档。这个插件代码量不大,适合直接看源码或者作为自己开始实现插件的参考。

    在这个基础上可以再自定义一些,比如根据不同场景更改用例执行顺序。

    # conftest.py
    import pytest
    
    def pytest_collection_modifyitems(config, items):
        """ 根据指定的mark参数场景,动态选择case的执行顺序"""
        for item in items:
            scenarios = [
                marker for marker in item.own_markers
                if marker.name.startswith('scenarios')
                and marker.name in config.option.markexpr
            ] 
            if len(scenarios) == 1 and not item.get_closest_marker('run'):
               item.add_marker(pytest.mark.run(order=scenarios[0].args[0]))
    
    
    # test_foo.py
    import pytest
    
    def test_1():
        print(1)
    
    @pytest.mark.scenarios_1(1)
    def test_2():
        print(2)
    
    @pytest.mark.scenarios_2(3)
    def test_3():
        print(3)
    
    @pytest.mark.scenarios_1(2)
    @pytest.mark.scenarios_2(1)
    def test_4():
        print(4)
    
    
    # test_bar.py
    import pytest
    
    @pytest.mark.scenarios_2(2)
    def test_a():
        print('a')
    
    @pytest.mark.scenarios_1(3)
    def test_b():
        print('b')
    
    def test_c():
        print('c')
    
    

    下面可以尝试一下,使用不同的scenario,用例执行顺序也会改变。
    >> pytest -m scenarios_1 -s

    相关文章

      网友评论

          本文标题:自定义pytest用例执行顺序

          本文链接:https://www.haomeiwen.com/subject/avbooqtx.html