Pytest 自动化测试框架

python+selenium+pytest 自动化测试框架pytest的应用 再新建一个目录初始化清除,在test文件下面新建conftest.py文件,文件名要固定conftest.py。pytest中用例检查直接用python的assert断言,上述表明两个通过,一个不通过,并标明详细的位置。(3)在这些目录中,搜索由其测试包名称导入的 test_*.py 或 *_test.py 文件。在(一)中,简单对selenium常用问题方法进行介绍,在二中详细介绍结合框架的使用。需要打印的信息则加上-s。将上述的test_mod.py文件放在新建test目录中,执行。 阅读详情

Pytest和Unittest测试框架的区别?

如何区分这两者,很简单unittest作为官方的测试框架,在测试方面更加基础,并且可以再次基础上进行二次开发,同时在用法上格式会更加复杂;而pytest框架作为第三方框架,方便的地方就在于使用更加灵活,并且能够对原有unittest风格的测试用例有很好的兼容性,同时在扩展上更加丰富,可通过扩展的插件增加使用的场景,比如一些并发测试等;

Pytest 安装

pip安装:

pip install pytest

测试安装成功:

pytest --help

py.test --help

检查安装版本:

pytest --version

Pytest 示例

Pytest编写规则:

  • 测试文件以test_开头(以_test为结尾)
  • 测试的类以Test开头;
  • 测试的方法以test_开头
  • 断言使用基本的assert
test_example.py

def count_num(a: list) -> int:
    return len(a)

def test_count():
    assert count_num([1, 2, 3]) != 3

执行测试:

pytest test_example.py

执行结果:

C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest>pytest test_example.py -v
================================================================= test session starts =================================================================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- d:\coding\python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collected 1 item                                                                                                                                       

test_example.py::test_count FAILED                                                                                                               [100%]

====================================================================== FAILURES =======================================================================
_____________________________________________________________________ test_count ______________________________________________________________________

    def test_count():
>       assert count_num([1, 2, 3]) != 3
E       assert 3 != 3
E        +  where 3 = count_num([1, 2, 3])

test_example.py:11: AssertionError
=============================================================== short test summary info ===============================================================
FAILED test_example.py::test_count - assert 3 != 3
================================================================== 1 failed in 0.16s ==================================================================

备注:

  • 代表测试通过,F代表测试失败;
  • -v显示详细的测试信息, -h显示pytest命令详细的帮助信息;

标记

默认情况下,pytest会在当前目录下寻找以test_为开头(以_test结尾)的测试文件,并且执行文件内所有以test_为开头(以_test为结尾)的所有函数和方法;

1.指定运行测试用例,可以通过::显示标记(文件名::类名::方法名)(文件名::函数名)

pytest test_example3.py::test_odd

2.指定一些测试用例测试运行,可以使用-k模糊匹配

pytest -k example

3.通过pytest.mark.skip()或者pytest.makr.skipif()条件表达式,跳过指定的测试用例

import pytest

test_flag = False

@pytest.mark.skip()
def test_odd():
    num = random.randint(0, 100)
    assert num % 2 == 1

@pytest.mark.skipif(test_flag is False, reason="test_flag is False")
def test_even():
    num = random.randint(0, 1000)
    assert num % 2 == 0

4.通过pytest.raises()捕获测试用例可能抛出的异常

def test_zero():
    num = 0
    with pytest.raises(ZeroDivisionError) as e:
        num = 1/0
    exc_msg = e.value.args[0]
    print(exc_msg)
    assert num == 0

5.预先知道测试用例会失败,但是不想跳过,需要显示提示信息,使用pytest.mark.xfail()

@pytest.mark.xfail()
def test_sum():
    random_list = [random.randint(0, 100)  for x in range(10)]
    num = sum(random_list)
    assert num < 20

6.对测试用例进行多组数据测试,每组参数都能够独立执行一次(可以避免测试用例内部执行单组数据测试不通过后停止测试)

@pytest.mark.parametrize('num,num2', [(1,2),(3,4)])
def test_many_odd(num: int, num2: int):
    assert num % 2 == 1
    assert num2 % 2 == 0

固件(Fixture)

固件就是一些预处理的函数,pytest会在执行测试函数前(或者执行后)加载运行这些固件,常见的应用场景就有数据库的连接和关闭(设备连接和关闭)

简单使用

import pytest

@pytest.fixture()
def postcode():
    return "hello"

def test_count(postcode):
    assert postcode == "hello"

按照官方的解释就是当运行测试函数,会首先检测运行函数的参数,搜索与参数同名的fixture,一旦pytest找到,就会运行这些固件,获取这些固件的返回值(如果有),并将这些返回值作为参数传递给测试函数;

预处理和后处理
接下来进一步验证关于官方的说法:

import pytest

@pytest.fixture()
def connect_db():
    print("Connect Database in .......")
    yield
    print("Close Database out .......")

def read_database(key: str):
    p_info = {
        "name": "zhangsan",
        "address": "China Guangzhou",
        "age": 99
    }
    return p_info[key]

def test_count(connect_db):
    assert read_database("name") == "zhangsan"

执行测试函数结果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 1 item

test_example.py::test_count Connect Database in .......
PASSED                                       [100%]Close Database out .......


============================== 1 passed in 0.07s ==============================

备注:

  • 首先从结果上看验证了官方的解释,pytest执行测试函数前会寻找同名的固件加载运行;
  • connect_db固件中有yield,这里pytest默认会判断yield关键词之前的代码属于预处理,会在测试前执行,yield之后的代码则是属于后处理,将在测试后执行;

作用域

从前面大致了解了固件的作用,抽离出一些重复的工作方便复用,同时pytest框架中为了更加精细化控制固件,会使用作用域来进行指定固件的使用范围,(比如在这一模块中的测试函数执行一次即可,不需要模块中的函数重复执行)更加具体的例子就是数据库的连接,这一连接的操作可能是耗时的,我只需要在这一模块的测试函数运行一次即可,不需要每次都运行。

而定义固件是,一般通过scop参数来声明作用,常用的有:

  • function: 函数级,每个测试函数都会执行一次固件;
  • class: 类级别,每个测试类执行一次,所有方法都可以使用;
  • module: 模块级,每个模块执行一次,模块内函数和方法都可使用;
  • session: 会话级,一次测试只执行一次,所有被找到的函数和方法都可用。
import pytest

@pytest.fixture(scope="function")
def func_scope():
    print("func_scope")

@pytest.fixture(scope="module")
def mod_scope():
    print("mod_scope")

@pytest.fixture(scope="session")
def sess_scope():
    print("session_scope")

def test_scope(sess_scope, mod_scope, func_scope):
    pass

def test_scope2(sess_scope, mod_scope, func_scope):
    pass

执`行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 2 items

test_example2.py::test_scope session_scope
mod_scope
func_scope
PASSED                                      [ 50%]
test_example2.py::test_scope2 func_scope
PASSED                                     [100%]

============================== 2 passed in 0.07s ==============================

从这里可以看出module,session作用域的固件只执行了一次,可以验证官方的使用介绍

自动执行

有人可能会说,这样子怎么那么麻烦,unittest框架中直接定义setUp就能自动执行预处理,同样的pytest框架也有类似的自动执行;
pytest框架中固件一般通过参数autouse控制自动运行。

import pytest

@pytest.fixture(scope='session', autouse=True)
def connect_db():
   print("Connect Database in .......")
   yield
   print("Close Database out .......")

def test1():
   print("test1")

def test2():
   print("test")

执行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 2 items

test_example.py::test1 Connect Database in .......
PASSED                                            [ 50%]test1

test_example.py::test2 PASSED                                            [100%]test
Close Database out .......


============================== 2 passed in 0.07s ==============================

从结果看到,测试函数运行前后自动执行了connect_db固件;

参数化

前面简单的提到过了@pytest.mark.parametrize通过参数化测试,而关于固件传入参数时则需要通过pytest框架中内置的固件request,并且通过request.param获取参数

import pytest

@pytest.fixture(params=[
    ('redis', '6379'),
    ('elasticsearch', '9200')
])
def param(request):
    return request.param

@pytest.fixture(autouse=True)
def db(param):
    print('\nSucceed to connect %s:%s' % param)

    yield

    print('\nSucceed to close %s:%s' % param)

def test_api():
    assert 1 == 1

执行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- D:\Coding\Python3.6\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\libuliduobuqiuqiu\Desktop\GitProjects\PythonDemo\pytest
plugins: Faker-8.11.0
collecting ... collected 2 items

test_example.py::test_api[param0] 
Succeed to connect redis:6379
PASSED                                 [ 50%]
Succeed to close redis:6379

test_example.py::test_api[param1] 
Succeed to connect elasticsearch:9200
PASSED                                 [100%]
Succeed to close elasticsearch:9200


============================== 2 passed in 0.07s ==============================

这里模拟连接redis和elasticsearch,加载固件自动执行连接然后执行测试函数再断开连接。

总结

对于开发来说为什么也要学习自动化测试这一块,很重要的一点就是通过自动化测试节省一些重复工作的时间,同时对于优化代码结构,提高代码覆盖率,以及后续项目重构都是有着很重要的意义,同时理解pytest和unittest在基础上有何区别有助于不同的业务场景中选择适合自己的测试工具。
这篇文章只是简单的介绍了pytest的基本使用,有兴趣的可以去看看官方文档,官方文档中还提到了如内置固件的使用,常用测试的场景等等。

读者福利:知道你对Python感兴趣,便准备了这套python学习资料

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等习教程。带你从零基础系统性的学好Python!

👉[[[优快云大礼包:《python兼职资源&全套学习资料》免费分享]]](安全链接,放心点击)

👉Python所有方向的学习路线👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。图片

👉Python必备开发工具👈

图片

👉Python600视频合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 图片

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。 图片

👉Python副业兼职与全职路线👈

在这里插入图片描述

👉面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。 图片

上述这份完整版的Python全套学习资料已经上传优快云官方,朋友们如果需要可以微信扫描下方优快云官方认证二维码 即可领取↓↓↓

【python篇】pytest框架(图文详解) pytest是纯python编写的自动化测试框架,可以支持python语法编写测试用例,是一个非常成熟的全功能的Python测试框架。简单灵活,容易上手;支持参数化;能够支持简单的单元测试和复杂的功能测试,还可以结合selenium、requests做自动化测试;pytest具有很多第三方插件,并且可以自定义扩展。 阅读详情

相关推荐

pytest自动化测试框架基础篇

pytest是一个基于Python语言的自动化测试框架,它可以帮助测试人员更加高效地管理和执行测试用例,并提供了丰富的插件和扩展功能。使用pytest可以使我们更加轻松地编写测试脚本,自动化执行测试,快速完成测试工作,并且pytest支持使用各种主流的Python测试库(如unittest)编写的测试代码,使得我们可以平滑地从使用其他测试框架过渡到使用pytest。1、pytest是一个非常成熟的单元测试框架,灵活和简单。2、它可以结合selenium、request、appium完成各种不同的自动化。

DJ355的博客 1979

Python自动化框架 【pytest 框架介绍】

首先说下为什么要学 pytest,在此之前相信大家已经掌握了python 里面的unittest 单元测试框架,那再学一个框架肯定是需要学习时间成本的。刚开始我的内心是拒绝的,我想我用unittest 也能完成自动化测试, 干嘛要去学pytest 呢?最近看到越来越多的招聘要求会pytest 框架了, 也有小伙伴出去面试说会unittest 框架被鄙视的。学会了可以装逼可以避免被面试官鄙视1.1。

weixin_67553250的博客 3461

基于pytest框架自动化测试

前言 pytest是python2自带的自动化测试框架,python3的版本的话pytest框架独立出来,需要pip进行安装 选取pytest框架作为自动化的框架,是经过多个框架对比之后的结果,它有一些相对的优势 相对比于unittest框架几个优势: 1.fixture前置功能 2.用例标记,用例重跑等功能。  3.用例参数化  4.兼容unittest,nose框架 其中的亮点...

Jolting的博客 6272

Python测试框架之pytest详解

前言 Python测试框架之前一直用的是unittest+HTMLTestRunner,听到有人说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 mi

lixiaomei0623的专栏 7947

pytest接口自动化测试框架搭建

由于用例中用到了@pytest.mark.httptest给用例打标,因此需要创建pytest.ini文件,并在里面添加markers = httptest,不然会有warning,说这个Mark有问题。从Excel文件中读取数据的工具类:get_excel_data_utils.py(虽然本次框架中暂时未采用存放接口数据到Excel中,但也写了个工具类,需要的时候可以用)因此数据文件中url只填写后半段,不填域名。除了上面提到的读取Json文件工具类:read_jsonfile_utils.py,

Java_fenxiang的博客 1131

pytest自动化测试框架简介

pytest自动化测试框架简介 总所周总结,自动化测试的快速运行,都离不开框架,有了合适的框架,自动化代码程序的管理和使用,真的真的真的 方便太多了,接下来介绍一款拥有众多插件,公司主流使用的框架 ———pytest !!! 一、单元测试 1. 含义 = 组织代码单位(包含函数、类、模块、包); = 其中最小单位; = python不能测试 java 写的单元测试,但是国内测试一般不做单元测试; 2. 单元测试执行方式 ===> 不用任何框架也可进行自动化测试,方式如下: 1)if , 通过条件判

m0_53628535的博客 5121

pytest自动化测试框架

本文介绍了Python自动化测试框架Pytest的基础知识,包括安装配置、测试运行、断言验证和参数化测试等核心功能。Pytest通过简单直观的语法和丰富扩展性,支持单元测试、集成测试等多种场景。其优势包括易用性、强大的断言库、参数化测试支持、插件扩展性以及跨平台兼容性。文章推荐Pytest作为提高Python项目测试效率和质量的有效工具,并提供了相关学习资源获取方式。

2301_78843735的博客 845

Selenium+Pytest自动化测试框架实战

1、测试框架的优点代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一些高级功能。提高元素等数据的可维护性,元素发生变化时,只需要更新一下配置文件。使用更灵活的PageObject设计模式。2、测试框架的整体目录【注意】 __init__.py文件用以标识此目录为一个python包。

m0_73409141的博客 8688

Pytest自动化测试框架介绍

单元测试框架单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。

nhb687096的博客 851

八、Pytest自动化测试框架 — Pytest测试报告

1、pytest-html插件 Pytest可以通过命令⾏⽅式,⽣成xml/html格式的测试报告,并存储于⽤户指定路径。 需要用到pytest-html插件。 安装⽅式:pip install pytest-html 插件使用方式: 命令格式:--html=⽤户路径/report.html 运⾏⽅式: main()函数方式: pytest.main(['--html=./report/report_01.html'])(不好使,可能配置了pytest.ini文件) 命令行方

测试-八戒 2753

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2683

Pytest自动化测试框架

本文介绍了Pytest自动化测试框架的基础知识,包括安装、配置、运行、测试、断言和参数化等方面。Pytest框架简单易用,功能丰富,可以满足各种不同类型的测试需求。以下是该框架的一些优点:1、简单易用:Pytest采用了简洁而直观的语法,使得测试代码更加易读易懂。2、丰富的断言库:Pytest内置了大量的断言函数,同时也支持第三方断言库,可以进行更加全面的测试覆盖。3、参数化:使用Pytest的参数化功能,可以快速编写多组输入参数的测试用例,提高测试效率。

huace3852的博客 700

MT4/MT5数据源接入全攻略:从买服务、自研API到低成本DDE,哪种方案适合你?

本文全面解析MT4/MT5数据源接入的三种主流方案:商业服务、自研API和低成本DDE,详细对比其技术参数、成本结构和适用场景。帮助技术团队根据业务需求选择最优方案,确保外汇交易系统的数据流稳定性和实时性,提升交易体验和业务连续性。

weixin_42568801的博客 176

pytest接口自动化测试框架 | 汇总

视频来源B站《冒死上传!pytest接口自动化测试框架(基础理论到项目实战及二次开发)教学视频【软件测试】》一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!...

团爸讲算法 9725

eMMC FFU固件更新实战:从协议解析到设备修复

本文详细解析eMMC FFU固件更新技术,从协议原理到实战操作,涵盖EXT_CSD寄存器操作、命令流状态机解析及专业工具使用指南。通过真实维修案例,展示如何利用FFU机制修复设备故障,并提供高级优化技巧与安全注意事项,是硬件工程师和维修技术人员的实用参考。

weixin_29191761的博客 383

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

本文详细介绍了从Design Compiler(DC)过渡到DC Topographical(DCT)和DC Graphical(DCG)的完整操作框架,特别针对DEF文件处理提供避坑方案。通过环境准备、工具升级、DEF文件处理、DCG综合配置等步骤,帮助开发者高效应对28nm以下工艺节点的物理感知综合挑战,显著提升时序收敛效率。

weixin_27966471的博客 381
上一篇: 应届毕业生的Python学习之路,直言:如果大学可以重来,我一定,一定大一就开始努力学习
下一篇: 史上最详细的python学习路线,只需3个月时间,从入门到精通!
python_One1
博客等级 码龄4年 52粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值