文档章节

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

o
 osc_wws45aot
发布于 2019/08/20 15:17
字数 1008
阅读 21
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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("\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).@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"]
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
pytest单元测试框架

参考文章:https://mp.weixin.qq.com/s/k6ZZ42CFZhq20RGuBcOOfQ unittest是python自带的单元测试框架,它封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,使得单元测试易于开展...

osc_nqgx3w60
2019/05/05
2
0
pytest系列(一):什么是单元测试界的高富帅?

pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试、自动化测试工作中。 unittest也是python语言中一款单元测试框架,但是功能有限,没有pytest灵活。...

osc_ofejccgq
2019/06/28
2
0
python-pytest学习

一:pytest基于unittest之上的单元测试框架 1.自动发现测试模块和测试方法; 2.断言使用assert+表达式即可; 3.可以设置会话级、模块级、类级、函数级的fixtures :数据准备+清理工作 4.丰富的...

osc_9wm81b2v
2019/04/15
4
0
pytest

1.Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但更简洁并高效。 官方网站优点简介: 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考...

osc_78xm5q8u
2019/06/12
8
0
web自动化中的page object模式

一. 原理 将页面的元素定位和元素行为封装成一个page类,实现页面对象和测试用例分离 类的属性:元素定位 类的行为:元素的操作 测试用例:调用所需页面对象中的行为,组成测试用例 二. 好处...

osc_nyhmdnf9
2018/07/05
1
0

没有更多内容

加载失败,请刷新页面

加载更多

百度技术沙龙第67期 百度开源专场

本文作者:HelloDeveloper 具体的产品案例,分享百度开源技术最新实践经验。目前这些项目都已经在 github/baidu 上开源。 什么是 PaddlePaddle 深度学习平台? 首先做个简单的介绍,PaddleP...

百度开发者中心
2019/07/23
11
0
Hacker News 简讯 2020-07-10

更新时间: 2020-07-10 01:15 US Supreme Court deems half of Oklahoma a Native American Reservation - (reuters.com) 美国最高法院认为俄克拉荷马州的一半是印第安人保留地 得分:131 | 评...

FalconChen
今天
28
0
OSChina 周五乱弹 —— 求求你吃了我吧,不要再玩弄食物的感情了

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :张喆的单曲《陷阱 》 这首歌已经在网易找不到原唱了,不知道被哪家买了版权。#今日歌曲推荐# 《陷阱 》- 张喆 手机党少年们想听歌...

小小编辑
今天
32
1
清华陈文光教授:AI 超算基准测试的最新探索和实践。

道翰天琼认知智能平台为您揭秘新一代人工智能。 无规矩不成方圆。放在超级计算机的研发领域,没有一个大家普遍接受的算力评测指标,便难以推动超算迅猛发展。 而现在伴随着人工智能的发展,大...

jackli2020
今天
7
0
@RequestMapping, consumes 提交简单有意思的测试

getParm @GetMapping("getParm")public Result getParm(String id){ System.out.println(); return ResultFactory.success(id);} 等同于 == bodyParm @PostMapping("bodyParm......

莫库什勒
今天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部