pytest-两种不同写法

XUnit 的写法

熟悉 unittest 框架的人都知道,unittest 里面 fixture 的写法是 setUp 和 tearDown,setUp_class 和 tearDown_class,只有这一种写法,而且是固定的写法哈。

Pytest 是兼容 unittest 的,当然也支持这样写:

from datetime import datetime
from time import sleep
from unittest import TestCase
class TestMikigo(TestCase):

    def setUp(self):
        print("我是前置", datetime.now())
        sleep(1)

    def test_001(self):
        print("我是用例", datetime.now())
        sleep(1)

    def tearDown(self):
        print("我是后置", datetime.now())

注意是继承了 unittest.TestCase 的,Pytest 可以兼容运行的,基本操作哈。

除此之外还有一些你没见过的 Xunit 写法:

from time import sleep
class TestMikigo:

    def setup(self):
        print("我是前置", datetime.now())
        sleep(1)

    def test_001(self):
        print("我是用例", datetime.now())
        sleep(1)

    def teardown(self):
        print("我是后置", datetime.now())
我是前置 2022-01-24 16:17:59.267900
我是用例 2022-01-24 16:18:00.269282
我是后置 2022-01-24 16:18:01.270688

你看,setup 和 teardown 这种写法也是会被自动识别的。

还有这种,看准了哈:

from datetime import datetime
from time import sleep
class TestMikigo:

    def setup_method(self):
        print("我是前置", datetime.now())
        sleep(1)

    def test_001(self):
        print("我是用例", datetime.now())
        sleep(1)

    def teardown_method(self):
        print("我是后置", datetime.now())
我是前置 2022-01-24 16:24:57.456212
我是用例 2022-01-24 16:24:58.457273
我是后置 2022-01-24 16:24:59.458097

setup_method 和 teardown_method 也可以。

这里还要讲一下 setup_method 和 setup_function 的区别,setup_function 是在基于函数的用例写法时使用的,setup_method 是基于类的用例写法使用的,我面试别人的时候喜欢问这两个的区别,如果知道这个的,基本对本部分内容是了解的。

以上只是用例级别的,下面说下类级别的写法:

from datetime import datetime
from time import sleep
class TestMikigo:

    def setup_class(self):
        print("我是类前置", datetime.now())
        sleep(1)

    def setup_method(self):
        print("我是用例前置", datetime.now())
        sleep(1)

    def test_001(self):
        print("我是用例", datetime.now())
        sleep(1)

    def teardown_method(self):
        print("我是用例后置", datetime.now())
        sleep(1)

    def teardown_class(self):
        print("我是类后置", datetime.now())
我是类前置 2022-01-24 16:31:59.411548
我是用例前置 2022-01-24 16:32:00.411892
我是用例 2022-01-24 16:32:01.413373
我是用例后置 2022-01-24 16:32:02.414377
我是类后置 2022-01-24 16:32:03.415521

直接写成 setup_class 就可以了,在 unitest 里面类级别的是需要加类方法装饰器 @classmethod 的,pytest 里面可加可不加,看你喜欢。

模块级别的就用 setup_module,会话级别的就用 setup_session,这都好理解,这里就不举例了。

fixture 写法

前面 Xunit 的写法已经很灵活了,但是 Pytest 真正厉害的是它自己特有的 fixture 写法。

from datetime import datetime
from time import sleep
import pytest
class TestMikigo:

    @pytest.fixture(scope="function")
    def do_something_before(self):
        print("我是用例前置", datetime.now())
        sleep(1)
        yield
        print("我是用例后置", datetime.now())

    def test_001(self, do_something_before):
        print("我是用例", datetime.now())
        sleep(1)

这里有几点要注意:

  • fixture 必须要加@pytest.fixture() 装饰器;
  • scope 为 fixture 级别;
  • fixture 的函数名 do_something_before 可以自定义,但是不要和 Xunit 的函数名一样,不然就乱掉了。
  • yield 之前是前置,yield 之后是后置,这里实际上是利用了生成器的原理;
  • 函数名 do_something_before 需要显式的传入用例参数:
def test_001(self, do_something_before):
    print("我是用例", datetime.now())
    sleep(1)

或者使用 @pytest.mark.usefixtures() ,就像这样:

@pytest.mark.usefixtures("do_something_before")  # 也可以放到类名前面,表示对这个类里面所有的用例都生效。
def test_001(self):
    print("我是用例", datetime.now())
    sleep(1)

不过这种写法我个人不建议哈,字符串的形式属于硬编码,不好维护。

这里要好好理解一下哈,短短的几句话,其实包含了很多内容哦。这种写法没有一个严格的定式,更多是一种模式。

欢迎关注公众号,与Joker一起探索测试之道。


参考链接:https://juejin.cn/post/7221769090834481189

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Anthony_路人甲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值