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