一文让你快速入门pytest框架
pytest是什么
官方文档描述:
pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. Get started in minutes with a small unit test or complex functional test for your application or library.
pytest是一个python单元测试框架。
pytest的特点
pytest与unitest区别
pytest用例执行
- 使用pytest.main方法执行
import pytest
def func(x):
return x+1
def test_b():
print('-----test_b-----')
assert func(3)==5 # 断言失败
def test_a():
print('-----test_a-----')
assert func(3)==4 # 断言成功
if __name__=="__main__":
pytest.main(['-s','test_demo.py'])
- 使用命令行执行
执行单个文件,进入到文件所在路径
pytest -s test_demo.py
执行整个目录
pytest -s 目录名称
pytest常用命令参数
参数:-s
运行过程中执行print打印函数:pytest -s参数:-v 或 -q
打印用例执行的详细/简略过程,pytest -v ,pytest -q
参考:https://www.cnblogs.com/sc912/p/11369237.html
pytest用例前置和后置
setup、teardown,在方法前后执行
- pytest的setup、teardown方法可以在类之外
import pytest
def test_a():
print('-----test_a-----')
def test_b():
print('-----test_b-----')
def setup():
print('-----setup-----')
def teardown():
print('-----teardown----')
if __name__ == '__main__':
if __name__ == '__main__':
pytest.main(['-s','test_method.py'])
执行结果如下:
-----setup-----
PASSED [ 50%]-----test_a-----
-----teardown----
test_method.py::test_b -----setup-----
PASSED [100%]-----test_b-----
-----teardown----
- pytest的setup、teardown方法放在类之内
import pytest
class Test_method():
def test_a(self):
print('-----test_a-----')
def test_b(self):
print('-----test_b-----')
def setup(self):
print('-----setup-----')
def teardown(self):
print('-----teardown----')
if __name__ == '__main__':
if __name__ == '__main__':
pytest.main(['-s','test_method.py'])
执行结果如下:
test_method.py::Test_method::test_b
============================== 2 passed in 0.02s ==============================
Process finished with exit code 0
-----setup-----
PASSED [ 50%]-----test_a-----
-----teardown----
-----setup-----
PASSED [100%]-----test_b-----
-----teardown----
可以看到,在执行每一个方法前都会执行setup方法,在执行每个方法后都会执行teardown方法。
setup_class、teardown_class,在类前后执行
setup_class、teardown_class方法得放在类里面,否则不生效。
import pytest
class TestMethod():
def test_a(self):
print('-----test_a-----')
def test_b(self):
print('-----test_b-----')
def setup_class(self):
print('-----setup-----')
def teardown_class(self):
print('-----teardown----')
if __name__ == '__main__':
if __name__ == '__main__':
pytest.main(['-s','test_class.py'])
执行结果如下:
test_class.py::TestMethod::test_a -----setup-----
PASSED [ 50%]-----test_a-----
test_class.py::TestMethod::test_b PASSED [100%]-----test_b-----
-----teardown----
可以看出,先执行一次setup_class,然后执行完全部方法,再执行teardown_class方法。
import pytest
class TestMethod():
def test_a(self):
print('-----test_a-----')
def test_b(self):
print('-----test_b-----')
def setup(self):
print('-----setup-----')
def teardown(self):
print('-----teardown----')
def setup_class(self):
print('-----setup_class-----')
def teardown_class(self):
print('-----teardown_class----')
if __name__ == '__main__':
if __name__ == '__main__':
pytest.main(['-s','test_class.py'])
执行结果如下:
test_class.py::TestMethod::test_a -----setup_class-----
-----setup-----
PASSED [ 50%]-----test_a-----
-----teardown----
test_class.py::TestMethod::test_b -----setup-----
PASSED [100%]-----test_b-----
-----teardown----
-----teardown_class----
pytest运行规则
默认规则
自定义规则
使用配置文件pytest.ini进行配置
安装ini插件
pycharm无法识别ini文件,需要安装插件。
配置文件在test_pytest目录下
指定执行test_ini目录的测试用例
(venv) D:\Test\python\hogwarts_TD\test_pytest>pytest -v
执行结果如下:
test_ini/test_class.py::TestMethod::test_a -----setup_class-----
-----setup-----
-----test_a-----
PASSED-----teardown----
test_ini/test_class.py::TestMethod::test_b -----setup-----
-----test_b-----
PASSED-----teardown----
-----teardown_class----
注释掉指定目录后,是执行10个用例
pytest断言
from common.get_mysql import *
def test_assert():
a=0
b=1
# assert a,'断言失败打印的信息' # 自定义断言失败打印的信息,用逗号隔开
assert not a,'断言失败打印的信息'
assert b,'断言失败打印的信息'
c='c'
d='adacde'
e='aeewd'
assert c in d,'断言失败打印的信息'
assert c not in e,'断言失败打印的信息'
assert a!=b
assert a==b
# 对比数据库数据
assert a==get_sql("SELECT dept_no FROM departments WHERE dept_name ='Finance'")
pytest标记
是pytest特有的机制,unitest没有,作用是筛选用例。
标记测试用例
遇到问题:
执行后
(venv) D:\Test\python\hogwarts_TD\test_pytest>pytest -m testa
警告:
PytestUnknownMarkWarning: Unknown pytest.mark.testa - is this a typo?
怎么是执行了两条用例?应该是执行一条用例才对
似乎是与配置文件有关。
(venv) D:\Test\python\hogwarts_TD\test_pytest>pytest -m "testa or testb"
跳过测试、条件判断执行
import pytest
class TestMethod():
@pytest.mark.skip
def test_a(self):
print('-----test_a-----')
# 只执行test_b
def test_b(self):
print('-----test_b-----')
if __name__ == '__main__':
pytest.main(['-s','test_mark.py'])
全部用例都不执行
import pytest
@pytest.mark.skip(reason="不要执行的用例") # reason可以不写
class TestMethod():
def test_a(self):
print('-----test_a-----')
def test_b(self):
print('-----test_b-----')
if __name__ == '__main__':
pytest.main(['-s','test_mark.py'])
为真的时候不执行
import pytest
class TestMethod():
@pytest.mark.skip(reason="不要执行的用例") # reason可以不写
def test_a(self):
print('-----test_a-----')
@pytest.mark.skipif(2>1,reason="不要执行的用例") # 为真的时候不执行
def test_b(self):
print('-----test_b-----')
if __name__ == '__main__':
pytest.main(['-s','test_mark.py'])
为假的时候执行用例
import pytest
class TestMethod():
@pytest.mark.skip(reason="不要执行的用例") # reason可以不写
def test_a(self):
print('-----test_a-----')
@pytest.mark.skipif(0>1,reason="不要执行的用例")
def test_b(self):
print('-----test_b-----')
if __name__ == '__main__':
pytest.main(['-s','test_mark.py'])
pytest参数化
传入单个参数
在测试用例的前面加上:
@pytest.mark.parametrize("参数名",列表数据)
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。
import pytest
class TestMethod():
@pytest.mark.parametrize('name',['xiaoming','jack'])
def test_a(self,name):
print('-----test_a-----')
print(name)
@pytest.mark.parametrize(('username','password'),[('xiaoming','123456'),('jacky','567890')])
def test_b(self,username,password):
print('-----test_b-----')
print('username: "{}",password:"{}"'.format(username,password))
if __name__ == '__main__':
pytest.main(['-s','test_para.py'])
执行结果:
============================== 4 passed in 0.02s ==============================
Process finished with exit code 0
PASSED [ 25%]-----test_a-----
xiaoming
PASSED [ 50%]-----test_a-----
jack
PASSED [ 75%]-----test_b-----
username: "xiaoming",password:"123456"
PASSED [100%]-----test_b-----
username: "jacky",password:"567890"
传入多个参数
import pytest
from test_requests.api.member import Member
class TestMember():
@classmethod
def setup_class(cls):
cls.member = Member() # 不要每次调用方法都实例化,这个测试类只需要实例化一次就好了
@pytest.mark.parametrize(('userid,name,email'),[('test001','test001','test001'),('test002','test002','test002')])
def test_create_one(self,userid,name,email): # 参数化 值得好好思考
r = self.member.create_one(userid,name,email)
print(r)
import pytest
from test_wework.api.tag import Tag
class TestTag:
def setup_class(self):
self.tag = Tag()
def test_get(self):
self.tag.get()
# 参数化
@pytest.mark.parametrize(('tagname,tagid'),[('test099',99),('test100',100)])
def test_add(self,tagname,tagid):
self.tag.add_tag(tagname,tagid) # 使用add命名方法有问题,估计重名了
self.tag.get()
# 断言 添加后获取标签列表,判断添加的tagname在列表里面
传入文件参数
待补充
pytest生成报告
修改配置文件
以下是html报告
pytest执行失败重试
修改配置文件
reruns 2,表示失败时重试2次
delay 1,表示等待1s
一文让你快速入门pytest框架的更多相关文章
- 【零基础】快速入门爬虫框架HtmlUnit
迅速的HtmlUnit htmlunit是一款开源的web页面分析工具,理论上来说htmlunit应用于网页的自动化测试,但是相对来说更多人使用它来进行小型爬虫的快速开发.使用htmlunit进行爬虫 ...
- 快速入门GreenDao框架并实现增删改查案例
大家的项目中不可避免的使用到SQLite,为此我们要花费心思编写一个增删改查框架.而一个好的ORM框架则能够给我们带来极大的方便,今天给大家讲解一个非常火热的ORM-GreenDao. 基本概念 Gr ...
- 【快速入门ORM框架之Dapper】大牛勿进系列
前言:dapper是什么?Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的.也就是说实体类都要自己写.它没有复杂 ...
- 一篇文章快速入门React框架
视频教程 本文章在B站配有视频教程 课程目标 了解最常用的React概念和相关术语,例如JSX,组件,属性(Props),状态(state). 构建一个非常简单的React应用程序,以阐述上述概念. ...
- pytest封神之路第零步 快速入门
背景:本文是在系列第五篇发表后的补充篇章,第一篇介绍了tep,可能对不熟悉pytest的朋友不够友好,特意补充入门篇,帮大家快速了解如何动手写pytest.如果你是从这篇文章第一次阅读,那么请忽略以上 ...
- PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引
一.框架的由来 快速入门 有关框架的更多信息,请看框架官方主页! 本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.N ...
- 【Pytest01】全网最全最新的Pytest框架快速入门
一.Pytest简介pytest是一个非常成熟的全功能的Python测试框架,主要有一下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,还可以用来做seleni ...
- Pytest系列(1) - 快速入门和基础讲解
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 目前有两种纯测试的测试框架, ...
- struts2框架快速入门小案例
struts2快速入门: index.jsp------>HelloAction--------->hello.jsp struts2流程 1.导入jar包 struts2的目录结构: a ...
随机推荐
- NOIP 模拟 $28\; \rm 客星璀璨之夜$
题解 \(by\;zj\varphi\) 概率与期望,考虑 \(\rm dp\) 设 \(dp_{i,j}\) 为消除 \(i-j\) 这一段行星的期望,转移: 枚举 \(k\) 为当前状态下第一个撞 ...
- 黑马JVM教程——自学笔记(三)
四.类加载与字节码技术 4.1.类文件结构 首先获得.class字节码文件 方法: 在文本文档里写入java代码(文件名与类名一致),将文件类型改为.java java终端中,执行javac X:.. ...
- Jpa-操作mongodb
pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr ...
- pytorch之对预训练的bert进行剪枝
大体过程 对层数进行剪枝 1.加载预训练的模型: 2.提取所需要层的权重,并对其进行重命名.比如我们想要第0层和第11层的权重,那么需要将第11层的权重保留下来并且重命名为第1层的名字: 3.更改模型 ...
- 【java虚拟机】几种内存溢出及解决方案
作者:平凡希 地址:https://www.cnblogs.com/xiaoxi/p/7406903.html 1.JVM Heap(堆)溢出:java.lang.OutOfMemoryError: ...
- MyBatis like报错
错误的likeSQL语句是这么写的 select * from student name like '%#{name}%' 下面是错误信息 Parameter index out of range ( ...
- web项目中的浏览器行为和服务器行为
package day10.think_about_path; import java.io.IOException; import javax.servlet.ServletException; i ...
- netty系列之:轻轻松松搭个支持中文的服务器
目录 简介 netty的HTTP支持 netty中使用HTTP的原理 100 (Continue) Status 为netty搭建HTTP服务器 总结 简介 之前讲了那么多关于netty的文章,都是讲 ...
- vue@cli3 项目模板怎么使用public目录下的静态文件,找了好久都不对,郁闷!
作为图片最好放在static目录下,但是vue@cli3没有static,网上都说放在public目录下,行,那就放吧,可问题是图片放了怎么使用 第一次尝试 肯定用绝对路径这就不说了,用相对路径,we ...
- 剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下 ...