前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pytest测试框架系列(3)-fixture和参数化

pytest测试框架系列(3)-fixture和参数化

作者头像
搁浅同学
发布2022-07-21 14:58:06
8800
发布2022-07-21 14:58:06
举报
文章被收录于专栏:搁浅测试同学小分享

接着上一篇pytest测试框架的分享

在上一篇主要讲解pytest的执行的相关命令参数,今天主要分享下pytest的

fixture和参数化。

f ixture翻译过来就是固件装置,主要来配置测试资源,fixture是通过装饰器标注的。

我们先新新建一个脚test_parmas.py

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest
def test_param():
    a = 1
    b = 1
    assert a == b
def test_baili():
    assert 1 == 1

一、fixture基础入门

定义一个fixture很简单,只要一个函数用装饰器@pytest.fixture标记之后,该函数名就可以当作参数传入到测试函数里面,看下面的代码,

函数my_fixture用装饰器@pytest.fixture(),就可以将函数名当作参数传入到test_bali函数,执行测试用例可以看到执行my_fixture

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest
@pytest.fixture()
def my_fixture():
    print("this is a fixture")

def test_param():
    a = 1
    b = 1
    assert a == b
def test_baili(my_fixture):
    assert 1 == 1

二、fixture常用参数说明

代码语言:javascript
复制
@pytest.fixture(scope=scope,params=params,ids=ids,autouse=false)

fixture分别有scope、params 、ids 、autouse 4个参数,各个参数说明

scope:分别有5个取值function、class、module、package、session,默认值是function,代表fixture能分享的范围

params:可接受列表、元祖等参数,来实现参数化,通过request.param来取里面的值

ids:测试用例的id列表

name:给fixture取个别名,取了别名后,只能通过别名使用

autouse:为True时函数自动使用,默认值时False

scope:分别以function、class为了例子说明,新建文件test_fixture.py,内容如下:把fixture的scope的范围设置为class,并且在测试类Testfixture使用,那么运行所有测试用例时,整个测试类只执行一次,看执行结果

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest


@pytest.fixture(scope="class", name="myFixture")
def my_fixture():
    print("this a fixture")


@pytest.mark.usefixtures("myFixture") #另外调用fixture的方式
class TestFixture:

    def test_fixture(self):
        assert 1 == 1

    def test_fixture1(self):
        assert 2 == 2

将scope设置为function后,执行情况如下:

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest


@pytest.fixture(scope="function", name="myFixture")
def my_fixture():
    print("this a fixture")

@pytest.mark.usefixtures("myFixture")
class TestFixture:
    def test_fixture(self):
        assert 1 == 1

    def test_fixture1(self):
        assert 2 == 2

在此可以看到scope是class时作用到类,是function时作用到每个测试方法,其他范围大家可以尝试下。

autouse:autouse使用主要是用于装饰器到方法上,分别用False和True来作为展示

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest

@pytest.fixture(scope="function", name="myFixture", autouse=False)
def my_fixture():
    print("this a fixture")
class TestFixture:
    @pytest.mark.usefixtures("myFixture")
    def test_fixture(self):
        assert 1 == 1

    def test_fixture1(self):
        assert 2 == 2

执行后,可看到只有第一个测试用例作用到了,第二个测试用例没有

改成autouse是True后

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest

@pytest.fixture(scope="function", name="myFixture", autouse=True)
def my_fixture():
    print("this a fixture")

class TestFixture:
    @pytest.mark.usefixtures("myFixture")
    def test_fixture(self):
        assert 1 == 1

    def test_fixture1(self):
        assert 2 == 2

两个用例都作用到了,使用autouse是True后,默认第一次使用fixture后面也默认使用,所以第二个测试用例也作用到了

params参数主要用例功能参数化,params主要接受可迭代的对象,比如列表,例子如下

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest

@pytest.fixture(scope="function", params=["诸葛亮", "妲己", "孙尚香"])
def my_fixture(request):
    print("this a fixture")
    return request.param

class TestFixture:

    def test_fixture(self, my_fixture):
        print(str(my_fixture))
        assert 1 == 1

    def test_fixture1(self):
        assert 2 == 2

再次执行

第一个测试用例执行了3次,分别打印了params里面的值,可以通过params实现参数

三、功能参数化另一种方式@pytest.mark.parametrize

除了上述通过fixture能够实现参数化,

我们最常用的是@pytest.mark.parametrize来实现参数化

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pytest

@pytest.fixture(scope="function", params=["诸葛亮", "妲己", "孙尚香"])
def my_fixture(request):
    print("this a fixture")
    return request.param

class TestFixture:

    def test_fixture(self, my_fixture):
        print(str(my_fixture))
        assert 1 == 1
        
    @pytest.mark.parametrize("hero", ["程咬金", "老夫子", "夏洛特"])
    def test_fixture1(self, hero):
        print(hero)
        assert 2 == 2
        
   #@pytest.mark.parametrize第一个参数是字符串作为用例的变量名,后面是可
   # 迭代的对象,如果是多个参数则通过逗号隔开“name1,name2”,后面的每一项也需要对应,比如
   # (val1,val2)

再次执行结果可以看到第二个测试用例也实现了参数化

这个参数化和fixture是我们学习pytest的重点内容,所以需要多练习才能熟悉使用,不懂的时候可以对着官网的例子进行练习。那么今天的更新就到这里了,好像也没讲得怎么样。。。😂,转移话题,听歌吧!

这街上太拥挤。。。。。。。。。。。。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 暴走的软件测试Tester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档