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

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

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

本文链接:https://blog.csdn.net/qq_30758629/article/details/95923286
与测试教程网同步: http://www.testclass.net/interface

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,

扫描二维码关注公众号,回复: 7063251 查看本文章

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("\n获取用户名")



    a = "xiaoyulaoshi"



    return a



 



 



@pytest.fixture(scope="function")



def sencond():



    print("\n获取密码")



    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("\n获取用户名,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("\n获取用户名,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("\n获取用户名,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)[email protected]:允许在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"]

猜你喜欢

转载自www.cnblogs.com/wzz2500/p/11375352.html
今日推荐