<!–
(adsbygoogle=window.adsbygoogle||[]).push({})
–>
(adsbygoogle=window.adsbygoogle||[]).push({})
<!–
–>
之前介绍了pytest以xUnit形式来写用例,下面来介绍pytest特有的方式来写用例
代码如下
from __future__ import print_function
import pytest @pytest.fixture(scope=\'module\')
def resource_a_setup(request):
print(\'\\nresources_a_setup()\')
def resource_a_teardown():
print(\'\\nresources_a_teardown()\')
request.addfinalizer(resource_a_teardown) def test_1_that_needs_resource_a(resource_a_setup):
print(\'test_1_that_needs_resource_a()\') def test_2_that_does_not():
print(\'\\ntest_2_that_does_not()\') def test_3_that_does(resource_a_setup):
print(\'\\ntest_3_that_does()\')
使用-s -v运行查看详情如下

这里使用的了pytest的特有的模式来写用例,使用的方式是scope方式,scope支持多种,后面会介绍
这里还使用了pytest的addfinalizer内置功能,具体可参见官网,用处是:在最后一个测试项目中调用teardown
代码如下
from __future__ import print_function
import pytest @pytest.fixture()
def resource_a():
print(\'\\nresources_a() \"setup\"\') def test_1_that_needs_resource_a(resource_a):
print(\'test_1_that_needs_resource_a()\') def test_2_that_does_not():
print(\'\\ntest_2_that_does_not()\') def test_3_that_does(resource_a):
print(\'test_3_that_does()\')
这是最简单的一个例子,结果如下

可以看出测试用例继承了用pytest.fixture的函数后,都执行了setup的功能,默认的pytest.fixture是function
在写用例时,有几种方法使用pytest.fixture来形成框架,
方法一:
就是上面提到的这种方法,如下
pytest.fixture()
def before():
print(\'\\nbefore each test\') def test_1(before):
print(\'test_1()\') def test_2(before):
print(\'test_2()\')
方法二:使用fixture修饰
@pytest.fixture()
def before():
print(\'\\nbefore each test\') @pytest.mark.usefixtures(\"before\")
def test_1():
print(\'test_1()\') @pytest.mark.usefixtures(\"before\")
def test_2():
print(\'test_2()\')
标红的就是修饰器
之前使用@pytest.fixture(scope=\’module\’)来定义框架,scope的参数有以下几种
- function 每一个用例都执行
- class 每个类执行
- module 每个模块执行(函数形式的用例)
- session 每个session只运行一次,在自动化测试时,登录步骤可以使用该session
如下一个用module例子
@pytest.fixture(scope=\'module\')
def resource_a():
print(\'\\nresources_a() \"setup\"\') def test_1_that_needs_resource_a(resource_a):
print(\'test_1_that_needs_resource_a()\') def test_2_that_does_not():
print(\'\\ntest_2_that_does_not()\') def test_3_that_does(resource_a):
print(\'test_3_that_does()\')
即使我们在每个用例都继承了resource_a,但在实际测试中,所有用例只执行了一次resource_a

这时,你可能会问,为什么只这setup功能,没有teardown功能,要teardown怎么写,方法如下:
def cheese_db(request):
..... def teardown():
print(\'\\n[teardown] cheese_db finalizer, disconnect from db\')
request.addfinalizer(teardown)
这里使用的还是之前介绍的request.addfinalizer功能,函数名字可以任意取,不一定要teardown
这里就不介绍了,看官方文档吧
看代码,如下
@pytest.fixture(scope=\"module\")
def foo(request):
print(\'\\nfoo setup - module fixture\')
def fin():
print(\'foo teardown - module fixture\')
request.addfinalizer(fin) @pytest.fixture()
def bar(request):
print(\'bar setup - function fixture\')
def fin():
print(\'bar teardown - function fixture\')
request.addfinalizer(fin) @pytest.fixture()
def baz(request):
print(\'baz setup - function fixture\')
def fin():
print(\'baz teardown - function fixture\')
request.addfinalizer(fin) def test_one(foo, bar, baz):
print(\'in test_one()\') def test_two(foo, bar, baz):
print(\'in test_two()\')
测试结果如下

pytest还有很有用的yield功能,后续再介绍
<!–
(adsbygoogle=window.adsbygoogle||[]).push({})
–>
<!– 
–>
(adsbygoogle=window.adsbygoogle||[]).push({})
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
扫码联系技术微信【备注:站媒体网】
客服QQ:137483024







