zoukankan      html  css  js  c++  java
  • 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,

    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"]
    
  • 相关阅读:
    mysql timestamp自动更新 简单
    vim中执行shell命令小结 简单
    Memcached常用资料 简单
    linux bash的命令行操作 简单
    如何调研 简单
    Linux 任务 jobs 简单
    shell相关命令效率 简单
    shell命令学习 简单
    线段树 区间更新(hdu1698) 区间合并(poj3667)
    hdu 1166 敌兵布阵 (树状数组)
  • 原文地址:https://www.cnblogs.com/wzz2500/p/11375352.html
Copyright © 2011-2022 走看看