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. rgb格式颜色与#000000格式颜色的转换

    首先,#000000格式的颜色被成为十六进制颜色码: 6位数分为三组,每两位数一组,依次是红.黄.蓝颜色的强度: 而与此对应的,rgb(39,137,202)依次是十进制的红黄蓝颜色: 因此将rgb格 ...

  2. Centos 7 k8s Deployment新副本控制器

    一.概念 Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment.通过在Deployment中描述你所期望的集群状态,Deployment Controller会将在 ...

  3. Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理

    前言 在 Java 中通过锁来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关 ...

  4. curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to storage.googleapis.com:443

    安装nvm的时候, ➜  ~ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash 错 ...

  5. cubic-bezier() 函数

    2020-03-13 cubic-bezier() 函数 ubic-bezier() 函数定义了一个贝塞尔曲线(Cubic Bezier). 贝塞尔曲线曲线由四个点 P0,P1,P2 和 P3 定义. ...

  6. centos7 hadoop 单机模式安装配置

    前言 由于现在要用spark,而学习spark会和hdfs和hive打交道,之前在公司服务器配的分布式集群,离开公司之后,自己就不能用了,后来用ambari搭的三台虚拟机的集群太卡了,所以就上网查了一 ...

  7. python 函数式编程 高阶函数 装饰器

    # -*- coding:gb2312 -*- #coding=utf-8 # 高阶函数 import math def is_sqr(x): y = int(math.sqrt(x)) return ...

  8. redis过期键的策略

    一.过期时间设置: 127.0.0.1:6379> expire key seconds //设置键的过期时间为多少秒 127.0.0.1:6379> setex key seconds ...

  9. elk2

    如果使用codec->json进行解码,表示输入到logstast中的input数据必须是json的格式,否则会解码失败 java中一句代码异常会抛出多条的堆栈日志,我们可以使用上面的mutil ...

  10. RabbitMQ:二、客户端开发向导

    建立Connection,创建Channel,注意Channel不能在线程间共享(非线程安全) 创建交换器和队列 消费者消费消息支持推和拉两种模式 推:通过consume方法订阅队列 拉:通过chan ...