Pytest 使用简介
前言
最近在听极客时间的课程,里面的讲师极力推崇 pytest 框架,鄙视 unittest 框架,哈哈!然后查了些资料,发现了一条 python 鄙视链:pytest 鄙视 > unittest 鄙视 > robotframework 。
pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。接下来我们在文中来对分析下 pytest 有哪些简洁、高效的用法。
一、安装
首先使用 pip 安装 pytest
pip3 install pytest
查看 pytest 是否安装成功
pip3 show pytest
二、简单使用
1.创建 test_sample.py 文件,代码如下:
#!/usr/bin/env python
# coding=utf-8
import pytest def inc(x):
return x + 1 def test_answer():
assert inc(3) == 5 if __name__ =="__main__":
pytest.main()
执行结果:
test_sample.py F [100%] ================================== FAILURES ===================================
_________________________________ test_answer _________________________________ def test_answer():
> assert inc(3) == 5
E assert 4 == 5
E + where 4 = inc(3) test_sample.py:19: AssertionError
============================== 1 failed in 0.41s ==============================
从上面的例子可以看出,pytest 中断言的用法直接使用 assert ,和 unittest 中断言 self.assert 用法有所区别。
2.总结一下:使用 pytest 执行测试需要遵行的规则:
.py 测试文件必须以test_开头(或者以_test结尾)
测试类必须以Test开头,并且不能有 init 方法
测试方法必须以test_开头
断言必须使用 assert
三、fixture
pytest 提供的 fixture 实现 unittest 中 setup/teardown 功能,可以在每次执行case之前初始化数据。不同点是,fixture 可以只在执行某几个特定 case 前运行,只需要在运行 case 前调用即可。比 setup/teardown 使用起来更灵活。
1.fixture scope 作用范围
先看下 fixture 函数的定义:
def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
"""
:arg scope: 可选四组参数:function(默认)、calss、module、package/session
:arg params: 一个可选的参数列表,它将导致多个参数调用fixture函数和所有测试使用它。
:arg autouse: 如果为True,则fixture func将为所有测试激活可以看到它。如果为False(默认值),则需要显式激活fixture。
:arg ids: 每个参数对应的字符串id列表,因此它们是测试id的一部分。如果没有提供id,它们将从参数中自动生成。
:arg name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')”。
"""
重点说下 scope 四组参数的意义:
function:每个方法(函数)都会执行一次。
class:每个类都会执行一次。类中有多个方法调用,只在第一个方法调用时执行。
module:一个 .py 文件执行一次。一个.py 文件可能包含多个类和方法。
package/session:多个文件调用一次,可以跨 .py 文件。
在所需要调用的函数前面加个装饰器 @pytest.fixture()。举一个简单的例子:
#!/usr/bin/env python
# coding=utf-8
import pytest @pytest.fixture(scope='function')
def login():
print("登录") def test_1():
print('测试用例1') def test_2(login):
print('测试用例2') if __name__ =="__main__":
pytest.main(['test_sample.py','-s'])
执行结果:
test_sample.py
测试用例1
.
登录
测试用例2
. ============================== 2 passed in 0.07s ==============================
2.yield
我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要 清除数据(或还原)操作,可以使用 yield 来实现。
#!/usr/bin/env python
# coding=utf-8
import pytest @pytest.fixture(scope='function')
def login():
print("登录")
yield
print("注销登录") def test_1():
print('测试用例1') def test_2(login):
print('测试用例2') if __name__ =="__main__":
pytest.main(['test_sample.py','-s'])
执行结果:
test_sample.py
测试用例1
.
登录
测试用例2
.注销登录 ============================== 2 passed in 0.08s ==============================
3.conftest
上面的案例都是写在同一个.py 文件内的。倘若有多个.py 文件需要调用 login() 方法,就必须把 login() 方法写在外面,这里引用了conftest.py 配置文件。test_xxx.py 测试文件中无需 import conftest,pytest 会自动搜索同级目录中的 conftest.py 文件。
conftest.py 与 测试文件 目录层级关系

# 新建conftest.py,和 test_sample.py 同级目录
import pytest @pytest.fixture(scope='function')
def login():
print("登录") # test_sample.py 代码如下
import pytest def test_1():
print('测试用例1') def test_2(login):
print('测试用例2') if __name__ =="__main__":
pytest.main(['test_sample.py','-s'])
执行结果:
test_sample.py
测试用例1
.
登录
测试用例2
. ============================== 2 passed in 0.01s ==============================
Pytest 使用简介的更多相关文章
- pytest基础简介及实践举例
一.pytest简介 pytest 是 python 的第三方单元测试框架,比自带的 unittest 更简洁和高效,同时兼容 unittest 框架.它还有如下优点: 1.简单灵活,容易上手,文档丰 ...
- pytest使用简介
pytest是基于py unittest的一个单元测试框架,用起来比unittest简单不少,不过和unittest使用不太一样,总结如下: 格式: case的py文件名必须是test开头 def用例 ...
- pytest 简介与安装
前面我们已经基本上掌握了unittest测试框架,下面我们将学习新的pytest测试框架.之于原因嘛,太流行啦!掌握一个框架是不够的,急需另外一个,于是瞅上了pytest. pytest是什么? py ...
- pytest.1.快速开始
From: http://www.testclass.net/pytest/quick_start/ 简介 pytest测试框架可以让我们很方便的编写测试用例,这些用例写起来虽然简单,但仍然可以规模化 ...
- Pytest自动化测试-简易入门教程(02)
Pytest框架简介 Pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,3.还可以用来做sel ...
- python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装
前言 在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码 ...
- pytest测试框架 -- 简介
一.pytest测试框架简介: (1)pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效. (2)pytest框架可以兼容unittest用 ...
- pytest简介
pytest有哪些优点? 允许直接使用assert进行断言,而不需要使用self.assert*; 可以自动寻找单测文件.类和函数; Modular fixtures可以用于管理小型或参数化的测试信息 ...
- 【Pytest】python单元测试框架pytest简介
1.Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍 ...
随机推荐
- PHP 扩展与 ZEND 引擎的整合
PHP 扩展是对 PHP 功能的一个补充,编写完 PHP 扩展以后, ZEND 引擎需要获取到 PHP 扩展的信息,比如 phpinfo() 函数是如何列出 PHP 扩展的信息,PHP 扩展中的函数如 ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- Fragment生命周期函数调用(ViewPager切换方式)
在使用ViewPager时,Google亲爹为我们提供了多种PagerAdapter.其中,与Fragment相关的是FragmentPagerAdapter和FragmentStatePagerAd ...
- tinker接入
对于热修复无非就是两大类,一类是tencent代表的classloader模式的,另一类是阿里系代表的底层方面替换. 下面以本人的经验介绍下微信的tinker接入: 命令行接入方式: gradle接入 ...
- 聊聊 Vue 中 title 的动态修改
由于之前的 Vue 项目打包成果物一直是嵌入集成平台中,所以一直没有关注过项目的 title.直到最近,突然有个需求,要求点击按钮在集成平台外新开一个页面,此时我才发现,原来我的项目的 title 一 ...
- 获取Excel工作薄中Sheet页(工作表)名集合
#region 获取Excel工作薄中Sheet页(工作表)名集合 02./// <summary> 03./// 获取Excel工作薄中Sheet页(工作表)名集合 04./// < ...
- winform批量更新数据_长时间的执行会导致界面卡死
前言:使用winform触发一个事件后执行的代码,如果耗时非常长,则会导致窗口界面假死! 本人最近通过winform窗体执行一项:需要批量更新一批数据库的数据的操作的任务时,由于数据量达到百万级别, ...
- 利用Python突破验证码限制
一.实验说明 本实验将通过一个简单的例子来讲解破解验证码的原理,将学习和实践以下知识点: Python基本知识 PIL模块的使用 二.实验内容 安装 pillow(PIL)库: $ sudo apt- ...
- PHP入门了解
1.五个基本概念 1.1静态页面和动态页面 静态页面:服务器不执行的页面 动态页面:服务器执行的页面 1.2客户端和服务器端 客户端:浏览器就是客户端 服务器端:给浏览者提供服务 1.3端 ...
- js验证手机号、身份证等
//验证手机号function check_lxdh(lxdh){ var mobile = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0 ...