pytest测试框架1-强大的Fixture功能

pytest测试框架1-强大的Fixture功能

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_30758629/article/details/95923286

1.fixture是 干什么用的??

fixture是在测试函数运行前后,由pytest执行的外壳函数;代码可以定制,满足多变的测试需求;

包括定义传入测试中的数据集,配置测试前系统的初始状态,为批量测试提供数据源等等...

fixture是pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制!

2.举个例子

@pytest.fixture()
def some_data():
    return 42

def test_some_data(some_data):
    assert some_data == 42

#@pytest.fixture() 装饰器用于声明函数是一个fixture

如果测试函数的参数列表中包含fixture名字,那么pytest会检测到,

检测顺序是:优先搜索该测试所在的模块,然后搜索conftest.py

并在测试函数运行之前执行该fixture,

fixture可以完成测试任务,也可以返回数据给测试函数

pytest --setup-show test_example1.py

3.fixture函数放在哪里合适?

1.可以放在单独的测试文件里

2.如果希望多个测试文件共享fixture,可以放在某个公共目录下新建一个conftest文件,将fixture放在里面。

4.使用fixture传递测试数据

fixture非常适合存放测试数据,并且他可以返回任何数据

@pytest.fixture()
def a_list():
    return [1,2,3,44,5]

def test_a_list(a_list):
    assert a_list[2] == 3

5.指定fixture作用范围

fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function

1)function
每一个函数或方法都会调用 
@ pytest.fixture()
def first():
    print("
获取用户名")
    a = "xiaoyulaoshi"
    return a
@pytest.fixture(scope="function")
def sencond():
    print("
获取密码")
    b = "123456"
    return b

def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"

def test_2(sencond):
    '''用例传fixture'''
    print("测试密码:%s" % sencond)
    assert sencond == "123456"

2).class 每一个类调用一次,一个类可以有多个方法
@pytest.fixture(scope="class")
def first():
    print("
获取用户名,scope为class级别只运行一次")
    a = "xiaoyulaoshi"
    return a

class TestCase():
    def test_1(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "xiaoyulaoshi"

    def test_2(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "xiaoyulaoshi"

3).module,每一个.py文件调用一次,该文件内又有多个function和class

import pytest
@pytest.fixture(scope="module")
def first():
    print("
获取用户名,scope为module级别当前.py模块只运行一次")
    a = "xiaoyulaoshi"
    return a
    
def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"


class TestCase():
    def test_2(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "xiaoyulaoshi"

4).session
是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
当我们有多个.py文件的用例时候,如果多个用例只需调用一次fixture,那就可以设置为scope = "session",并且写到conftest.py文件里

conftest.py

import pytest
@pytest.fixture(scope="session")
def first():
    print("
获取用户名,scope为session级别多个.py模块只运行一次")
    a = "xiaoyulaoshi"
    return a

test_fixture11.py
import pytest
def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"
import pytest
def test_2(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"

6.fixture的参数化

pytest支持在多个完整测试参数化方法:

1).pytest.fixture(): 在fixture级别的function处参数化

2).@pytest.mark.parametrize:允许在function或class级别的参数化,为特定的测试函数或类提供了多个argument/fixture设置。

3_.pytest_generate_tests:可以实现自己的自定义动态参数化方案或扩展。

import pytest
import requests
par_to_test=[{
      "case": "serach a word :haha",
      "headers": {},
      "querystring": {
        "wd":"hah"
      },
      "payload": {},
      "expected": {
        "status_code":200
      }
    },

{
      "case": "serach a word2 :kuku",
      "headers": {},
      "querystring": {
        "wd":"kuku"
      },
      "payload": {},
      "expected": {
        "status_code":200
      } },
{
      "case": "serach a word3 :xiaoyulaoshi",
      "headers": {},
      "querystring": {
        "wd":"xiaoyulaoshi"
      },
      "payload": {},
      "expected": {
        "status_code":200
      } }
]

@pytest.fixture(params = par_to_test)
def class_scope(request):
    return request.param
def test_baidu_search(class_scope):
    url = "https://www.baidu.com"
    r = requests.request("GET", url, data=class_scope["payload"], headers=class_scope["headers"], params=class_scope["querystring"])
    assert r.status_code == class_scope["expected"]["status_code"]
原文地址:https://www.cnblogs.com/wzz2500/p/11383090.html