Pytest插件pytest-order指定用例顺序

安装

 pip install pytest-order
  • 注意不是pytest-ordering
  • 说起来这里有个故事

关于pytest-ordering和pytest-order

https://github.com/ftobia/pytest-ordering

https://github.com/pytest-dev/pytest-order

  • 在写这个文章之前,我用的一直是pytest-ordering

  • 但我在安装pytest-ordering的时候一直看到有pytest-order

  • 今天特意看了下,好家伙

    • GITHUB上写了这么一句:pytest-ordering is no longer maintained, please use https://pypi.org/project/pytest-order/
    • pytest-order is a fork of pytest-ordering that provides additional features like ordering relative to other tests.
    • pytest-order works with Python 3.6 - 3.10, with pytest versions >= 5.0.0 for all versions except Python 3.10, and for pytest >= 6.2.4 for Python 3.10. pytest-order runs on Linux, macOS and Windows.
  • 所以pytest-ordering在当前的pytest及python版本中可能会出现问题,而pytest-order是同步更新的,你可以放心食用

  • 那么问题来了,pytest-order怎么用呢?看官方的示例跟pytest-ordering还是有区别的(如果没有区别,装了2个的话你可能会分不清哪个调用的,当然我们不推荐你用2个)

    • 虽然用起来很简单,但的确蛮细节的,网上你看到的基本都是pytest-ordering的用法,然它在3年前就停止更新了
    • 我把它的git@github.com:pytest-dev/pytest-order.git,下下来,它写了很多的example,嗯~

根据索引排序

  • 其实就一个数字

  • 也可以是与之对应的特定字符,如first等

    字符数字index
    first0
    second1
    last-1
    second_to_last-2
    eighth_to_last-8
  • 示例1

     import pytest
     
     
     @pytest.mark.order(index=2)
     def test_three():
         print('three')
         assert 3 == 3
     
     
     @pytest.mark.order('second')
     def test_two():
         print('two')
         assert 2 == 2
     
     @pytest.mark.order(-1)
     def test_last():
         print('last')
         assert 'last' == 'last'
     
     @pytest.mark.order(0)
     def test_one():
         print('one')
         assert 1 == 1
     
     
     if __name__ == '__main__':
         pytest.main(['-sv', __file__])
     
    
     test_order_v1.py::test_one one
     PASSED
     test_order_v1.py::test_two two
     PASSED
     test_order_v1.py::test_three three
     PASSED
     test_order_v1.py::test_last last
     PASSED
     
     ============================== 4 passed in 0.06s ==============================
     
     进程已结束,退出代码为 0
     
    
  • index是从0开始的;切记index=2其实是第三个,first其实是0.所以我们不建议混用

  • -1是最后一个没有问题,索引体系跟list的类似,还是比较好理解的。建议用数字,学习成本就比较低。

  • 这个装饰器可以用到类上

     import pytest
     
     
     @pytest.mark.order(2)
     class TestA:
         def test_one(self):
             assert 1 == 1
         def test_two(self):
             assert 1 == 1
     
     @pytest.mark.order(1)
     class TestB:
         def test_one(self):
             assert 1 == 1
         def test_two(self):
             assert 1 == 1
     
     
     if __name__ == '__main__':
         pytest.main(['-sv', __file__])
     
    
     test_order_v1.py::TestB::test_one PASSED
     test_order_v1.py::TestB::test_two PASSED
     test_order_v1.py::TestA::test_one PASSED
     test_order_v1.py::TestA::test_two PASSED
    

排在指定用例后面

  • 直接看示例

     import pytest
     
     
     @pytest.mark.order(after='test_hallo')
     def test_hello():
         assert 1 == 1
     
     
     def test_hallo():
         assert 1 == 1
     
     
     if __name__ == '__main__':
         pytest.main(['-sv', __file__])
     
    
  • 还可以这样写,指定类

     @pytest.mark.order(after="TestB::test_c")
     @pytest.mark.order(after="Test2")
     
    
  • 可以指定文件夹/文件::类::测试用例(即测试函数名),也可以用before

     @pytest.mark.order(before="test_module_c/test_submodule.py::test_2")
     
    
  • 组合也可以

     @pytest.mark.order(index=0, after="test_second")
     @pytest.mark.order(after=["test_second", "other_module.py::test_other"])
     
    
  • 如果是参数化,那就直接用测试函数名

     import pytest
     
     @pytest.mark.order(after=["test_second"])
     def test_first():
         assert True
     
     @pytest.parametrize(param, [1, 2, 3])
     def test_second(param):
         assert True
    

说在最后

  • 关于用例的顺序相关的插件是不少的,比如

    • pytest-randomly:随机顺序
    • pytest-reverse:反转(通过一个hook亦可实现)
    • pytest-random-order :随机顺序
    • pytest-depends:依赖
    • pytest-find-dependencies:寻找依赖
  • 写完发现他有个doc,白整了~

     https://pytest-order.readthedocs.io/en/latest/
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxianfeng023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值