Pytest框架

一、简介

pytest:基于unittest之上的单元测试框架

有什么特点?
  • 自动发现测试模块和测试方法
  • 断言更加方便,assert + 表达式,例如 assert 1 == 1
  • 灵活运行指定的测试用例,标签化,适合回归、正向、冒烟、登录
  • 夹具)环境管理灵活。会话、模块,哪个用,哪个不用
  • 丰富的插件,例如测试报告插件
  • 和unittest兼容
安装
pip install pytest
# 更新
pip install -U pytest
# 只安装到当前用户
pip install -U --user pytest
# 安装html报告的插件
pip install pytest-html

二、pytest收集测试用例的规则

  1. 默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索

  2. 搜索规则

    • 模块名称test_*.py*_test.py开头或者结尾,不要同时满足
    • 函数名称test_开头
      • Test开头的测试类(没有__init__函数)
      • 如果使用了 unittest, 遵循 unittest 的规则
      • 如果没有继承 unittest.TestCase, 不要使用__init__ ,一旦使用 __init__,就是一个普通的类,不会被当成测试类了
    • 模块中可以只有测试方法函数,不用类,也可以识别
  3. 自定义查找规则pytest.ini

    [pytest]
    python_files =
    test_*.py
    check_ *.py
    python_functions = *_test
    python_classes = Check_*

三、fixture测试夹具——前置后置条件

1. 定义和作用

  • 测试用例执行的环境准备和清理,前置条件和后置条件
  • unittest中是setUp()等

2.定义fixture

  • 在一个普通函数申明前加 @pytest.fixture
  • 在函数内使用 yield 关键字
    • 关键字以后的代码,就是环境清理的代码,即在测试用例执行完毕之后执行

3.fixture作用域

@pytest.fixture(scope="fuction")
# function:每个函数中都运行一次,默认,类比setUp
# class:每个类中运行一次,类比setUpClass
# module:每个模块中只运行一次
# session:全局只运行一次

4.调用fixture

  • 在测试用例中直接调用它

    def test_login(self, fixture函数名)

  • 用pytest装饰器调用

    @pytest.mark.usefixtures("fixture函数名字")

5.conftest.py

  • 存储fixture
  • 固定的文件,不需要导入

6.使用实例

conftest.py文件

import pytest
from selenium import webdriver @pytest.fixture(scope="fuction")
def before_test_and_after():
"""启动浏览器"""
print("正在启动浏览器")
driver = webdriver.Chrome()
yield driver # 生成器,惰性求值。
driver.quit()

test_demo.py测试用例文件:

import pytest

# 方法一:
@pytest.mark.usefixtures("before_test_and_after")
class TestAdd:
@pytest.mark.parametrize("case_info", cases)
def test_add(self,case_info):
assert case_info["expected"] == 3

四、paramtrize参数化——数据驱动

  • ddt和unittest搭配使用

  • 在pytest中用@pytest.mark.paramtrize("data", cases)

    cases = [
    {"expected": 1},
    {"expected": 2},
    {"expected": 3}
    ] class TestAdd:
    @pytest.mark.parametrize("case_info", cases)
    def test_add(self,case_info):
    assert case_info["expected"] == 3

五、assert断言

直接用内置关键字, assert 条件表达式

expected = "yuz"
actual = "yuz wang"
assert expected not in actual, "这次真的断言失败了,可能是因为元素的定位问题"

六、测试报告

pytest -html插件

  1. 安装html报告的插件:pytest -html

    pip install pytest -html
  2. 生成html格式的测试报告

    # 命令行
    pytest --html=reports\test.html
    # python程序
    if __name__ == '__main__':
    pytest.main(["-m invest", f"--html=reports\test.html"])

allure报告插件

  1. 安装allure插件

    • 解压后,复制bin文件所在路径,配置环江变量

  • cmd中输入allure,碰到以下错误

解决:安装jdk,配置JAVA_HOME环境变量

  1. 安装allure-pytest 绑定包

    pip install allure-pytest
  2. allure的使用

    • 生成测试报告

    首次安装allure,需要重启,allure命令才生效

    # 命令行运行
    # 生成一个test_invest的文件
    pytest tests\test_invest.py --alluredir=reports\test_invest
    # 预览测试报告,会生成临时报告,自动用网页打开
    allure serve reports\test_invest
    # 生成静态文件
    allure generate reports\test_invest
    • 添加注释

七、mark 功能——用例筛选

作用:给测试用例打标签,在运行测试用例的时候,可根据标签名来过滤要运行的用例

使用步骤

  1. 注册,修改pytest.ini文件

    [pytest]
    markers =
    success
    demo
    linux
  2. 在测试方法或测试类上打标签,可以同时打多个标签

    import pytest
    
    @pytest.mark.demo
    class TestDemo: @pytest.mark.linux
    @pytest.mark.success
    def test_demo(self):
    pass
  3. 运行用例。命令行运行

    pytest -m  "success"
    # 标签表达式
    # 表达式只支持双引号,不支持单引号
    pytest -m "success and demo"
    pytest -m "success or demo"
    pytest -m "success and not demo"
  4. 特殊标签——跳过函数

    # 某个功能被废弃,不需要测试。
    @pytest.mark.skip(reason="跳过原因")
    # 有条件地跳过某些内容
    import sys
    @pytest.mark.skipif(sys.version_info < (3.6), reson="requires python3.6 or higher")
    @pytest.mark.skipif(sys.platform=="linux", reason="window系统因为环境不同跳过。")

八、pytest运行的几种方式

  • 右击运行

  • 命令行运行

    # 运行当前目录下的所有用例
    pytest
    # 指定测试模块
    pytest test_demo.py
    # 指定测试目录
    pytest testing/
    # 通过关键字表达式过滤执行
    pytest -k "MyClass and not method"
    # 通过节点id来运行,节点id: 模块名::类名::函数名
    pytest test_login.py::test_demo
    # 通过标签表达式
    pytest -m "success"
  • python程序运行:

    if __name__ == '__main__':
    # main()函数里可以加表达式
    pytest.main()
    # pytest.main(["-m success"])

设置默认的测试用例运行器

九、重运行机制

重运行表示如果断言失败,测试用例没有通过,则重新运行一次。如果测试用例通过了,就不会重新运行。

在web自动化测试当中,元素定位, 元素操作不是很稳定,例如网络不稳定

  • 安装

    pip install pytest-rerunfailures
  • 运行

    # 执行2次
    pytest --reruns 2
    # 间隔5s再执行
    pytest --reruns 2 --reruns-delay 5

十、打印输出信息

pytest -s

十一、pytest 和unittest的区别

  1. pytest支持更加丰富的插件
  2. pytest是第三方库,unittest是标准库,标准库是和python绑定,稳定性更强,pytest的稳定性会差一些,pytest版本和python版本不匹配
  3. 运行用例,管理用例更加灵活,@pytest.mark标记功能,运行时用标记表达式
  4. 断言更加方便和智能,用assert 关键字,而且有智能提示,预期结果和实际结果。
  5. 有更加灵活更加强大的环境管理,fixture
  6. 自动收集用例
  7. pytest 和 unittest 是可以兼容的,但是不是完全兼容。
    • 使用了pytest的paramatrize和fixture,不能再使用unittest,强制二选一

十二、web自动化方案选择

  • 方案1: 全部使用 pytest, 完全不用 unittest

  • 方案2:

    • unittest 去实现测试用例方法和ddt,setUp, tearDown,

      • pytest 用来运行和管理用例,mark
      • allure 生成报告

pytest框架使用教程的更多相关文章

  1. 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍  <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制 一.综述 SuperIO(SIO)定位 ...

  2. 《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  4. 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  5. 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  6. 《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  7. 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

随机推荐

  1. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  2. 微信小程序生命周期,事件

    目录 双线程模型 小程序中 app.js 中的生命周期 小程序的页面的生命周期 小程序的事件 双线程模型 像 Vue 的双向数据绑定 总结: 在渲染层将wxml文件与wxss文件转成js对象,也就是虚 ...

  3. thinkphp5.0使用官方验证码插件

    1.首先使用Composer下载验证码插件. 安装完成后,使用以下命令修改composer配置文件,使用国内镜像.原因你懂的. composer config -g repo.packagist co ...

  4. easypoi 读取 Excel 简单应用

    背景 在做接口测试的时候,经常会使用 Excel 来存储对应的接口信息和用例信息,为了方便程序的读取,引入easypoi 工具来读取 Excel 内容.easypoi 比起 poi 使用更加的方便,代 ...

  5. Node.js 学习笔记(一)

    node.js说白了就是JavaScript. node.js的性能是php的86倍(大概). 在下载完后可以用命令行打开及运行.   什么是 Web 服务器? Web服务器一般指网站服务器,是指驻留 ...

  6. LR字符串处理函数-lr_save_string

    int lr_save_string( const char *param_value, const char *param_name) 指定字符串保存至参数 Action() { lr_save_s ...

  7. 前后端分离项目 nginx配置实践

    新项目采用前后端分离的方式开发,前后端代码打算分开部署(同机器且同域名),但打算支持后端依然可访问静态资源. 搜索nginx配置大部分都通过url前缀进行转发来做前后端分离,不适用目前项目. 说明 前 ...

  8. 《Java核心技术》笔记:第7章 异常、断言和日志

    1. 异常 (P 280)异常处理需要考虑的问题: 用户输入错误 设备错误 物理限制 代码错误 (P 280)传统的处理错误的方法是:返回一个特殊的错误码,常见的是返回-1或者null引用 (P 28 ...

  9. Linux中bash的一些命令

    Linux——bash的简单使用 bash及其特性: 1.bash实质上是一个可执行的程序,一个用户的工作环境. 2.每一个shell下可以再打开一个shell,新打开的shell称为子shell,每 ...

  10. Downloadmanager实现app实现的升级下载使用

    1.app升级下载现在不推荐使用downloadmanager下载: 原因有下面的几个方面: (1)三星note系列部分手机需要手动打开这个权限才能用这个功能,而有些国产手机更加nb了直接个阉割了(d ...