Pytest

 pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:

· 简单灵活,容易上手

· 支持参数化

· 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)

· pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等

· 测试用例的skip和xfail处理

· 可以很好的和jenkins集成

· report框架----allure 也支持了pytest

安装Pytest

· pip install -U pytest

Pytest用例设计原则

· 测试类以Test开头,并且不能带有init方法

· 以test_开头的函数

· 以Test开头的类

· 所有的包pakege必须要有__init__.py文件

· 断言使用assert

运行Pytest的两种方式

· Pycharm里代码运行

pytest.main(["test.py"])

· 命令行运行方式

pytest test.py# 运行指定类下的指定方法pytest 文件名::类名::方法名

Pytest参数说明

· -v  说明:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等

· -s  说明:输入我们用例中的调式信息,比如print的打印信息等

· -x:遇到错误的用例,立即退出执行,并输出结果

· -v:表示查看详细的报告内容

· -collect-only:表示把待执行的用例全部展示出来

· -lf:只执行上次失败的用例

· -vv :显示详细的测试结果

· -tb=no:不展示用例失败的错误详情

· -tb=line:展示用例失败的代码具体行数

· -tb=short:展示更加详细的错误信息

· -k  "关键字" 说明:执行用例包含“关键字”的用例

· -q  说明:简化控制台的输出,可以看出输出信息和上面的结果都不一样, 下图中有两个..点代替了pass结果

· -maxfail=num 当用例错误达到指定数量时,停止测试

· m  说明:执行特定的测试用例。我们再次修改一下我们的用例,并添加一个新的用例

# 如果要运行多个标识的话,用表达式,如下pytest -m "slow or faster" test_1.py  运行有slow标识或 faster标识用例pytest -m "slow and faster" test_1.py 运行有slow和faster标识的用例pytest -m "slow and not faster" test_1.py 运行有slow和没有faster标识的用例

注意:-m后面不能带''号(单引号),只能带“”(双引号),不然识别不到

ini配置文件

· 创建pytest.ini文件(固定写法)

[pytest];固定写法;变量名不能错addopts=-vv -s ;多个参数中间空格testpaths=../HC/huace ;多个目录中间空格python_files=test*.py ;python文件前缀,可自定义python_classes=huace ;指定类名python_functions=test* ;指定方法名,可自定义

跳过测试函数

· 跳过测试函数: 根据特定的条件,不执行标识的测试函数

# -*- coding: utf-8 -*-import pytestclass Test():   def test(self):       print("执行的是testcase的用例")@pytest.mark.skipif(condition=1<2,reason="1不大于2,所以不执行")class huace():   def haha(self):       print("执行的是haha方法里面的用例")

Pytest之fixture

· unittest和nose都支持fixture的,但是fixture在pytest里使用更灵活。也算是pytest的一个闪光点吧

· 可以理解为一个跟setup和teardown这种前后置类似的东西。但是比它们要强大、灵活很多

fixtur当做参数传入

# -*- coding: utf-8 -*-import pytest@pytest.fixture()def login():   print('登录系统')# 直接使用函数名做为参数传入def test_01(login):   print('测试用例一')def test_02():   print('测试用例2')def test03():   print('测试用例3')

运行结果

· 只有tes_01调用了login

· 遗留问题来了,如果我这里有10个方法或更多?是不是都需调用login方法?继续看下面的fixture参数

testcase.py::test_01 登录系统测试用例一PASSEDtestcase.py::test_02 测试用例2PASSEDtestcase.py::test03 测试用例3PASSED

fixture语法

# scope有4个作用范围:function(不填则默认)、class、module、sessionfixture(scope='function', params=None, autouse=False, ids=None, name=None)

参数说明

· scope:即作用域,function"

(默认),"class","module","session"四个

· params:可选参数列表,它将导致多个参数调用fixture函数和所有测试使用它。

· autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture

· ids:params测试ID的一部分。如果没有将从params自动生成.

· name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name。

· session的作用域:是整个测试会话,即开始执行pytest到结束测试scope参数作用范围控制fixture的作用范围:session>module>class>function

autouse

· 参数置默认为False,则需要手动去调用装饰器

# -*- coding: utf-8 -*-import pytest# 当前就算定义了装饰器,也不会调用Login@pytest.fixture()def login():   print("打开浏览器")def test1():   print("test1里的用例")def test2():   print("test2里的用例")

调用方式1

# -*- coding: utf-8 -*-import pytest@pytest.fixture()def login():   print("打开浏览器")# 直接传入函数名def test1(login):   print("test1里的用例")   def test2(login):   print("test2里的用例")

调用方式2

# -*- coding: utf-8 -*-import pytest# autouse设为True,就能自动调用login的装饰器@pytest.fixture(autouse=True)def login():   print("打开浏览器")# 直接传入函数名def test1():   print("test1里的用例")def test2():   print("test2里的用例")

function

· function:作用域为函数

· 所有的方法都调用了login

# -*- coding: utf-8 -*-import pytest@pytest.fixture(scope='function', autouse=True)def login():   print('登录系统')def test_01():   print('测试用例一')def test_02():   print('测试用例2')def test03():   print('测试用例3')

运行结果

· 符合用例名设计的都会调用装饰器

· login不符合所以不会调用

testcase.py::test_01 登录系统测试用例一PASSEDtestcase.py::test_02 登录系统测试用例2PASSEDtestcase.py::test03 登录系统测试用例3PASSED

class

· class:作用域为类

· 所以TestCase1和TestCase2这两个类都会执行login

# -*- coding: utf-8 -*-# @Time : 2021/1/14 21:05# @Author : 程序员阿沐import pytest@pytest.fixture(scope='class', autouse=True)def login():   print('登录系统')def test_01():   print('这个是类外面的用例')class TestCase1:   def test_02(self):       print('测试用例2')   def test03(self):       print('测试用例3')class TestCase2:   def test_04(self):       print('测试用例4')   def test05(self):       print('测试用例5')

运行结果

· 类里面的方法只会调用一次

· pytest机制,因为方法是以test开头,所以也会调用

testcase.py::test_01 登录系统这个是类外面的用例PASSEDtestcase.py::TestCase1::test_02 登录系统测试用例2PASSEDtestcase.py::TestCase1::test03 测试用例3PASSEDtestcase.py::TestCase2::test_04 登录系统测试用例4PASSEDtestcase.py::TestCase2::test05 测试用例5PASSED

module

· module:在当前.py脚本里面所有用例开始前只执行一次

· 只要符合用例的设计要求,不管是类里和外边的都会调用

# -*- coding: utf-8 -*-import pytest@pytest.fixture(scope='class', autouse=True)def open():   print("打开浏览器,并且打开百度首页")def test_s1():   print("用例1:搜索python-1")class TestCase():   def test_s2(self):       print("用例2:搜索python-2")   def test_s3(self):       print("用例3:搜索python-3")

运行结果

· 当前文件里的用例都调用了装饰器

· 如果类名不是为Test开头你试试看是否还会调用装饰器?

testcase.py::test_s1 打开浏览器,并且打开百度首页用例1:搜索python-1PASSEDtestcase.py::TestCase::test_s2 打开浏览器,并且打开百度首页用例2:搜索python-2PASSEDtestcase.py::TestCase::test_s3 用例3:搜索python-3PASSED

session

· fixture为session级别是可以跨.py模块调用的

· 当我们有多个.py文件的用例时候,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并写到conftest.py文件里

· conftest.py文件名称是固定的,pytest会自动识别该文件。放到工程的根目录下,就可以全局调用了

· 如果放到某个package包下,那就只在该package内有效

# -*- coding: utf-8 -*-# conftest文件内容import pytest@pytest.fixture(scope="session", autouse=True)def login():   print("调用conftest文件的里的方法")

两个用例文件

# -*- coding: utf-8 -*-# testcase1.pyimport pytestdef test1():   print("test1里的用例")def test2():   print("test2里的用例")   # -*- coding: utf-8 -*-# testcase1.py  import pytestdef test3():   print("test3里的用例")def test4():   print("test4里的用例")

运行结果

· 两个文件只有testcase文件的用例调了conftest里的方法

testcase.py::test1 调用conftest文件的里的方法test1里的用例PASSEDtestcase.py::test2 test2里的用例PASSEDtestcase1.py::test3 test3里的用例PASSEDtestcase1.py::test4 test4里的用例PASSED

pytest-allure生成测试报告

· 安装模块:pip install allure-pytest

# 第一步:生成xml数据pytest --alluredir=./report/xml testcase.py

# 第二步:生成html文件allure generate --clean ./report/xml -o ./result/html

将截图加入到报告里

· allure.attach(f, '图片名', allure.attachment_type.JPG)

# -*- coding: utf-8 -*-from selenium import webdriverimport allurebrowser=webdriver.Chrome()browser.get("https://www.baidu.com")try:   browser.find_element_by_id("zhiyi").send_keys('test123456')  # 输入密码,except Exception as e:   file_name = './test.jpg'   browser.save_screenshot(file_name)  # 截图函数   '''allure添加截图附件'''   with open(file_name, mode='rb') as file:       # 读取文件,将读取的结果作为参数传给allure       f = file.read()     # 把图片添加到allure操作步骤里   allure.attach(f, 'login', allure.attachment_type.JPG)     raise e

pytest中yield和return的区别和相同点

共同点

· return和yield都可以返回值

区别

· yield返回值后,后面的代码还会继续运行

· return返回值后,后面的代码不会继续运行

# -*- coding: utf-8 -*-import pytest@pytest.fixture()def openbrower():   print("打开浏览器")   yield "返回浏览器"   print("关闭浏览器")def test01(openbrower):   print(openbrower)

运行结果

· 证明yield后面的代码仍执行了

testcase.py::test01 打开浏览器# 返回值返回浏览器PASSED关闭浏览器

usefixtures与传fixture区别

· fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。

· 当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以

· @pytest.mark.usefixtures("装饰器名")

Pytest常用的插件

· pytest-selenium   集成 selenium

· pip install allure-pytest   生成漂亮的allure测试报告

· pip install pytest-sugar   优化运行效果

· pip install pytest-rerunfailures   执行用例失败后重新运行

· pip install pytest-xdist   多线程并行与分布式执行

· pip install pytest-assume   多条断言前面报错后面依然执行

· pip install pytest-cover   测试覆盖率

一键安装多个模块

· 创建requirement.txt文件

selenium==3.0requests

· pip install -r requirement.txt

更多学习资源,公众号主页点击领取资料 查看我评论区置顶

Python自动化测试框架之Pytest教程【让你小鸡变老鹰】相关推荐

  1. Python自动化测试框架之Pytest相关用法-基本使用(1)

    前期准备 需要准备:pytest库 执行命令:pip install pytest.由于已经安装好了,所以执行情况会如下图所示 安装完成后,如果能够导入说明安装成功可以使用了 Pytest相关 1.基 ...

  2. Python自动化测试框架之Pytest相关用法-Fixture(2)

    1.setup和teardown 和unittest一样,pytest也有自己的前置后置条件:setup.teardown.但不同的是,pytest的类型比较多,多达10种,根据不同的生效范围分别为以 ...

  3. Python学习教程:Python自动化测试框架需要学习哪些?

    需要掌握学习Python自动化测试框架有哪些?常用的Python自动化测试框架有Robot Framework.Pytest.UnitTest/PyUnit.Behave.Lettuce.软件测试的自 ...

  4. python自动化测试框架pytest.pdf_Python自动化测试框架

    随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架.只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了开发时间.而且由于这些框架被广泛使用,他们具有很好的 ...

  5. Python自动化测试框架有哪些?怎么选

    目录 自动化测试框架概念 自动化测试框架根据思想理念和深度不同,渐进式的分为以下几种: 模块化测试脚本框架: 测试库框架: 数据驱动测试框架: 关键字驱动或表驱动的测试框架: 混合测试自动化框架: 框 ...

  6. Python单元测试框架之pytest 3 -- fixtures

    From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...

  7. Python自动化测试框架有哪些?

    令开发者万分高兴的是,开发自己的测试框架的日子终于结束了.以前,开发团队接手一个项目并开始开发时,除了项目模块的实际开发之外,他们不得不为这个项目构建一个自动化测试框架.一个测试框架应该具有最佳的测试 ...

  8. 7个实用的Python自动化测试框架

    目录 前言 1.Unittest 2. Doctest 3.pytest 4.Nose 5.tox 6.Unittest2 7.mock unittest. 结语 前言 随着技术的进步和自动化技术的出 ...

  9. Python自动化测试框架【Allure-pytest功能特性介绍】

    Python自动化测试框架[Allure-pytest功能特性介绍] 目录:导读 前言 生成报告 测试代码 目录结构 Allure特性 Environment Categories Fixtures ...

最新文章

  1. ACMNO.12有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。 输入 N 输出 数列前N项和 样例输入 10
  2. Spring 使用注解方式进行事务管理
  3. weiphp----------图灵机器人存在的bug。
  4. 数字断路器获得商用认证
  5. python 中的位置参数和默认参数
  6. Linux C: 为什么C都必须有一个main函数
  7. cadence 常见pcb电阻_从理想到现实,从PCB设计到实际产品,生产制造环节不容忽视……...
  8. python 物联网开发板_物联网学什么开发板好?
  9. s6 android 7.0 国行,三星S6电信版/S6 Edge国行版升级安卓7.0
  10. HDU嵌入式实验课程大作业分析报告
  11. Address already in use:JVM_Bind:8080
  12. 博客系统的设计与实现_企业车辆管理系统设计与实现
  13. 乐观锁、悲观锁,这一篇就够了!
  14. DNS 解析过程详解
  15. 女人不需要哲学,因为哲学不能给她们带来面包
  16. 人脸识别数据集的建立(dlib+opencv)及人脸识别
  17. mac安装指定版本的ruby_Mac 下安装Ruby环境
  18. OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
  19. Centos7.6安装Bugzilla5.0.4
  20. 软件工程(二)——过程模型

热门文章

  1. 使用dplyr进行数据操作(30个实例)
  2. Cell:人体细菌到究竟有多少,再作报告必引此文
  3. 宏基因组实战7. bwa序列比对, samtools查看, bedtools丰度统计
  4. Android酷欧天气实训报告书,萌新求助,第一行代码酷欧天气开发,遇到coolweather keeps s...
  5. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、在折线图上为每个数据点添加日期数据标签
  6. R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包将表格嵌套在可视化图像中
  7. 常用的异常检测算法有哪些?
  8. 如何判断你的数据集是否适合使用深度学习模型?如果数据量太小有什么解决办法?
  9. R语言数据结构之因子
  10. php mysql技术笔试题_PHP面试笔试题--选择题部分(最新整理)