<!–

(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运行查看详情如下

python pytest测试框架介绍三

这里使用的了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()\')

这是最简单的一个例子,结果如下

python pytest测试框架介绍三

可以看出测试用例继承了用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

python pytest测试框架介绍三

这时,你可能会问,为什么只这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()\')

测试结果如下

python pytest测试框架介绍三

pytest还有很有用的yield功能,后续再介绍

<!–

(adsbygoogle=window.adsbygoogle||[]).push({})

–>
<!–

–>

(adsbygoogle=window.adsbygoogle||[]).push({})
ICP+EDI电信增值业务许可证申请审核网站源码

扫码联系技术微信【备注:站媒体网】
客服QQ:137483024