pytest之 fixture 实现机制
一、相同测试数据存放优化
在讲 fixture 实现机制之前,插入一段内容
上次有个小伙伴问我说,类似下面的用例代码情况,每条测试用例的数据都一样的,我们可以怎么进行优化吗?
当然是可以的
其实我们可以把这些用例的数据全部拿出来用列表的形式存放在datas,里面,然后遍历每一条数据进行判断
- import pytest
- from Day18_pytest_fixture.login import login_check
- datas = [
- {"user":'python37', "passwd": 'lemonban', "check": {"code": 0, "msg": "登录成功"} },
- {"user":'python37', "passwd": 'lemonban666', "check": {"code": 1, "msg": "账号或密码不正确"} },
- {"user": 'python370', "passwd": 'lemonban', "check": {"code": 1, "msg": "账号或密码不正确"}},
- {"user": None, "passwd": 'lemonban', "check": {"code": 1, "msg": "所有的参数不能为空"}},
- {"user": 'python37', "passwd": None, "check": {"code": 1, "msg": "所有的参数不能为空"}}
- ]
- # 第二步遍历每一条数据然后进行判断:
- # 这种方法不太友好——只会执行一条用例,而且用例失败了就不能往下继续执行
- # ——解决方法:pytest 框架自带的解决方法:@pytest.mark.parametrize("参数名",列表数据)
- # class TestLogin:
- # def test_login_success(self):
- # for data in datas:
- # actual = login_check(data["user"],data["passwd"])
- # assert actual == data["check"]
- # 解决:第二步遍历每一条数据然后进行判断的问题
- class TestLogin:
- @pytest.mark.parametrize("case",datas) # 解决:第二步遍历每一条数据然后进行判断的问题
- def test_login(self,case): #这里的case 要与上面装饰器的case 保持一致
- actual = login_check(case["user"], case["passwd"])
- assert actual == case["check"]
二、fixture 实现机制
通过@pytest.fixture 装饰器来定义fixture 。一个函数被@pytest.fixture 装饰,那么这个函数就是fixture。
使用fixture 时,分为两个部分: fixture 定义、fixture 调用。
除此之外,还有fixture 的共享机制,嵌套调用机制。
1、定义fixture
(1)fixture 通过函数实现
(2)使用@pytest.fixture 进行装饰
- import pytest
- @pytest.fixture
- def init():
- pass
2、fixture 的调用
在fixture定义好之后,可以明确:
1)fixture 处理了哪些前置准备工作、哪些后置清理工作
2)fixture 作用域(是测试函数?还是测试类,还是测试回话,还是测试模块?)
但是,注意一般情况下我们不会放在类里面去使用,一般是放在模块或者类外面使用的
- # (2)函数前面,要用@pytest.fixture来声明它是一个fixture
- # autouse=True ——》有表示类下面的每条用例都会执行,没有表示整个类只执行一次, scope="class" : 表示设置作用域
- @pytest.fixture(scope="class", autouse=True)
- # (1)自定义一个函数名
- def hello(self):
- # 前置准备工作的代码
- print("一条测试用例开始执行")
- yield # yield之前的代码为:前置工作,yield之后的代码为:后置工作
- # 后置清理工作的代码
- print("一条测试用例执行结束")
import pytest
- from Day18_pytest_fixture.login import login_check
- datas = [
- {"user":'python37', "passwd": 'lemonban', "check": {"code": 0, "msg": "登录成功"} },
- {"user":'python37', "passwd": 'lemonban666', "check": {"code": 1, "msg": "账号或密码不正确"} },
- {"user": 'python370', "passwd": 'lemonban', "check": {"code": 1, "msg": "账号或密码不正确"}},
- {"user": None, "passwd": 'lemonban', "check": {"code": 1, "msg": "所有的参数不能为空"}},
- {"user": 'python37', "passwd": None, "check": {"code": 1, "msg": "所有的参数不能为空"}}
- ]
- # @pytest.fixture(scope="class",autouse=True)
- @pytest.fixture(scope="class")
- # (1)自定义一个函数名
- def hello():# self 可以不要了,因为我们不是放在类里面了
- # 前置准备工作的代码
- print("一条测试用例开始执行")
- print("======================================")
- yield # yield之前的代码为:前置工作,yield之后的代码为:后置工作
- # 后置清理工作的代码
- print("一条测试用例执行结束")
- #可以同时调用多个
- # @pytest.fixture(scope="class")
- # def class_fix():
- # # 前置准备工作的代码
- # print("-----测试类下的用例开始执行------")
- # yield
- # # 后置清理工作的代码
- # print("-----测试类下的用例执行结束------")
- #函数名可以随便取
- # @pytest.mark.usefixtures("class_fix") # 调用函数名为class_fix的fixture.
- @pytest.mark.usefixtures("hello") # 调用函数名为hello的fixture.,注意函数名不要写错了,写错了就会报错,因为程序找不到
#我们来思考一个问题,类怎么去调用这个前后置模块的代码逻辑呢?——用例执行之前执行前置,用例执行之前后执行后置?——》@pytest.mark.usefixtures()
- #@pytest.mark.usefixtures("hello") #pytest.mark.usefixtures("hello") 表示在执行当前类下的测试用例之前,会自动去寻找函数名叫hello的fixture并执行
- class TestLogin:
@pytest.mark.parametrize("case",datas) # 解决:第二步遍历每一条数据然后进行判断的问题
def test_login(self,case): #这里的case 要与上面装饰器的case 保持一致
actual = login_check(case["user"], case["passwd"])
assert actual == case["check"]
# @pytest.mark.usefixtures("hello") #像这个是调用不了的,因为设置了作用域,只能类下面去调用
def test_hello_world():
print("我是模块下的测试用例")
pytest之 fixture 实现机制的更多相关文章
- pytest.4.Fixture
From: http://www.testclass.net/pytest/fixture/ 我们可以简单的把Fixture理解为准备测试数据和初始化测试对象的阶段. 一般我们对测试数据和测试对象的管 ...
- pytest(6)-Fixture(固件)
什么是固件 Fixture 翻译成中文即是固件的意思.它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用例在请求接口前数据库的初始连接,和请求之后关闭数据库的操作 ...
- 『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)
目录 5.addfinalizer关键字 6.带返回值的Fixture 7.Fixture实现参数化 (1)params参数的使用 (2)进阶使用 8.@pytest.mark.usefixtures ...
- unittest的前置后置,pytest的fixture和共享机制conftest.py
Unittest setUp/tearDown setUp当中得到的变量,用self.xxx = value传递给测试用例 setUpClass/tearDownClass setupClass当中得 ...
- 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)
目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...
- pytest 15 fixture之autouse=True
前言 平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了.当用例很多的时候,每次都传这个参数,会比较麻烦.fixture里面有个参数autouse,默认是Fa ...
- pytest 5. fixture之yield实现teardown
前言: 1.前面讲的是在用例前加前置条件,相当于setup,既然有setup那就有teardown,fixture里面的teardown用yield来唤醒teardown的执行 看以下的代码: #!/ ...
- pytest 3.fixture介绍一 conftest.py
前言: 前面一篇pytest2 讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录, ...
- pytest的fixture和conftest
解决问题:用例1需要先登录,用例2不需要登录,用例3需要先登录.很显然这就无法用setup和teardown来实现了,这个时候就可以自定义测试用例的预置条件,比setup灵活很多. 1.fixture ...
随机推荐
- JS模块化,Javascript 模块化管理的历史
模块管理这个概念其实在前几年前端度过了刀耕火种年代之后就一直被提起. 直接回想起来的就是 cmd amd commonJS 这三大模块管理的印象.接下来,我们来详细聊聊. 一.什么是模块化开发 为了让 ...
- zabbix之模板制作(memcache redis)
#:找一台主机安装redis和memcached(记得安装zabbix-agent) root@ubuntu:~# apt install redis root@ubuntu:~# apt insta ...
- VUE页面实现加载外部HTML方法
前后端分离,后端提供了接口.但有一部分数据,比较产品说明文件,是存在其他的服务器上的.所以,在页面显示的时候,如果以页面内嵌的形式显示这个说明文件.需要搞点事情以达到想要的效果.本文主要和大家介绍VU ...
- 找出1小时内占用cpu最多的10个进程的shell脚本
cpu时间是一项重要的资源,有时,我们需要跟踪某个时间内占用cpu周期最多的进程.在普通的桌面系统或膝上系统中,cpu处于高负荷状态也许不会引发什么问题.但对于需要处理大量请求的服务器来讲,cpu是极 ...
- 【Java基础】Java中如何获取一个类中泛型的实际类型
泛型的术语 <>: 念做typeof List<E>: E称为类型参数变量 ArrayList<Integer>: Integer称为实际类型参数 ArrayLis ...
- 南京邮电大学CTF密码学之MD5-golang与php代码实现
题目内容:这里有一段丢失的md5密文 e9032???da???08????911513?0???a2 要求你还原出他并且加上nctf{}提交 已知线索 明文为: TASC?O3RJMV?WDJKX? ...
- Taro 3.5 canary 发布:支持适配 鸿蒙
一.背景 鸿蒙作为华为自研开发的一款可以实现万物互联的操作系统,一经推出就受到了很大的关注,被国人寄予了厚望.而鸿蒙也没让人失望,今年 Harmony2.0 正式推出供用户进行升级之后,在短短的三个月 ...
- python3.6.4 scrapy框架from PIL import Image报错 from . import _imaging as core
scrapy框架爬取url下载图片时,用ImagesPipeline下载图片 from PIL import Image报错 from . import _imaging as core Import ...
- centos配置 显示中文
目录 一.简介 二.操作 一.简介 不显示中文,出现这个情况一般是由于没有安装中文语言包,或者设置的默认语言有问题导致的. 二.操作 1.查看当前系统语言 登陆linux系统打开操作终端之后,输入 e ...
- 拆分行(Power Query 之 M 语言)
数据源: 略 目标: 将指定列拆分为行 操作过程: 选取指定列>[主页](或[转换])>[拆分列]>[按分隔符]/[按字符数]/[按位置]>高级选项>拆分为[行] M公式 ...