python web自动化(Pytest实战)

news2024/9/21 4:24:59

1.UnitTest框架与Pytest框架对⽐

                1) unittest框架介绍
                Unittest则是Python语⾔的标准单元测试框架。 Unittest⽀持⾃动化测试,测试⽤例的初                始化、关闭和测试⽤例的聚合等功能,它有⼀个很重要的特性:它是通过类(class)的⽅                   式,将测试⽤例组织在⼀起

                2) pytest框架介绍:

                        Pytest是Python的另⼀个第三⽅单元测试库。提供更简单、更灵活、更强⼤的测试                    框架,以便于编写和执⾏测试⽤例。它提供了许多有⽤的功能和插件,能够⾃动发现                    测试⽤例、丰富的断⾔⽀持、参数化测试、丰富的插件系统等等,使得测试更加容易 管 

                    理和执⾏。

                        

                pytest 安装和配置:

                1.使⽤命令进⾏安装: pip install pytest 2.验证安装成功的命令: pytest --version 3.运                     ⾏模式的配置,把pycharm的运⾏模式改为pytest

                 pytest框架默认的⽤例运⾏规则:

                1.pytest将在当前⽬录及其⼦⽬录中运⾏所有格式为 test**.py 或者 **test.py ⽂件

                2.测试⽅法/测试函数 默认必须是 test开头

                3.测试类必须是 Test开头

                4. 测试类不能有构造⽅法__init__

2.Pytest的常⽤应⽤

               断⾔pytest

                借助Python的运算符号 和 assert关键字 来实现的。

                

def test_kkk_01():
print("kkk")
# 测试相等
assert 1 == 2

        

        pytest框架的常⽤参数:


                -s 输出打印信息到控制台:pytest.main(['-s'])

                 " -s" 参数 ⽤于关闭捕捉,从⽽输出打印信息到控制台

                -v ⽤于显示具体的⽤例执⾏信息:pytest.main(['-v'])

                -k 运⾏名称中包含某字符串的测试⽤例:pytest.main(['-k','kkk'])
 

                -q 简化输出信息:pytest.main(['-q'])

                -x 失败就退出:pytest.main(['-x'])



                指定⽬录以及特定类或⽅法执⾏:

                 pytest.main(['-s','./doc/test_112233.py::TestShopping::test03'])

                ⽣成简单的测试报告:

                    pytest.main(['--junit-xml=./report/junit_report01.xml'])

                ⽤例失败控制:

                在第N个很⽤例失败之后,结束测试执⾏:

                pytest.main(['--maxfail=2'])

                通过标记表达式取执⾏:
                这条命令会执⾏被装饰器 @pytest.mark.smoke 装饰的所有测试⽤例

                注:需要先在pytest.ini ⽂件中注册⾃定义标记

                pytest.main(['-m','smoke'])

                

                多进程运⾏⽤例:

                        

# 单线程运行方式
    # pytest.main(['-vs', 'test_02 多线程执行用例.py'])

    # 将测试执行发送给多个cpu
    # pytest.main(['-vs', '-n', '3', 'test_02 多线程执行用例.py'])

    # 使用与计算机具有cpu内核一样多的进程
    # pytest.main(['-vs', '-n', 'auto', 'test_02 多线程执行用例.py'])
   

                        

重新运⾏失败⽤例:
 

 # 在每次重跑之间,增加⼀次延迟时间
    pytest.main(['--reruns', '3','--reruns-delay','2','test_rerun.py'])

    # 重新运⾏所有测试失败⽤例
    pytest.main(['--reruns', '3', 'test_rerun.py'])

 pytest的 setup 和 teardown 函数

           setup_module/teardown_module: 在当前⽂件中,所有的⽤例执⾏之前执⾏

# ---> 在当前⽂件中,所有的⽤例执⾏之前/后执⾏
# def setup_module(module):
# print("setup_module --->")
# #
# def teardown_module(module):
# print("teardown_module --->")


        setup_function/teardown_function: 在每个测试函数之前和之后执⾏
        

# ---> 在每个测试函数之前和之后执⾏
# def setup_function(function):
# print("setup_function --->")
# #
# def teardown_function(function):
# print("teardown_function --->")

setup_method/teardown_method:在每个测试函数之前和之后执⾏(现在常用的方法)

# ---> 在每个测试函数之前和之后执⾏(在类中每次都执⾏,在类的外⾯,只执⾏⼀次)
class TestDemo:
def setup_method(self):
print("setup --->")
def teardown_method(self):
print("teardown --->")
# --- 测试⽤例 ---
def test_multiply_3_4(self):
print("test_multiply_3_4")
assert multiply(3, 4) == 12




                

  修改pytest框架的基本规则 

        我们在pytest.ini中修改规则

                

[pytest]
addopts = -vs
testpaths = ./testcase_set
python_files = demo_*.py
python_classes = Demo*
python_functions = demo*

        

[pytest]
; 01 命令行参数,默认加到执行过程中
addopts = -vs
; 02 指定要运行的测试目录
testpaths = ./testcase_set
; 03 指定要运行的测试文件规则
python_files = demo_*.py
; 04 指定要运行的类名规则
python_classes = Demo_*
; 05 指定要运行的测试用例名称规则
python_functions = demo*

                

                

3.Pytest⾼阶⽤法之函数数据参数化

                        parametrize⽅法:

                        

parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)

argnames:参数名
argvalues:参数对应值,类型必须为list
当参数为⼀个时格式: [value]
当参数个数⼤于⼀个时,格式为:[(param_value1,param_value2.....),
(param_value1,param_value2.....)]

使用方法
@pytest.mark.parametrize(argnames,argvalues)

代码示例:(单个参数)


import pytest


def get_data():
    return [("qsdd的账号", "qsdd的密码"), ("wang的账号", "wang的密码"), ("yeye的账号", "yeye的密码")]


@pytest.mark.parametrize('get_value', get_data())  # 第一个值,用引号括起来,是自定义的参数
def test_login01(get_value):
    print(f"获取的账号信息:{get_value[0]}")
    print(f"获取的密码信息:{get_value[1]}")


if __name__ == '__main__':
    pytest.main(['-vs', 'test_01 单个参数接收函数传值.py'])

多个参数:

        

""""""

import pytest


def get_data():
    return [("qsdd的账号", "qsdd的密码"), ("wang的账号", "wang的密码"), ("yeye的账号", "yeye的密码")]


@pytest.mark.parametrize('get_value', get_data())  # 第一个值,用引号括起来,是自定义的参数
def test_login01(get_value):
    print(f"获取的账号信息:{get_value[0]}")
    print(f"获取的密码信息:{get_value[1]}")


if __name__ == '__main__':
    pytest.main(['-vs', 'test_01 单个参数接收函数传值.py'])

引用框架的装饰器完成单个传值

        

""""""

import pytest


@pytest.mark.parametrize('get_value', [("qsdd的账号", "qsdd的密码"), ("qq的账号", "qq的密码"), ("ss的账号", "ss的密码")])
def test_login01(get_value):
    print(f"获取的账号信息:{get_value[0]}")
    print(f"获取的密码信息:{get_value[1]}")


if __name__ == '__main__':
    pytest.main(['-vs', 'test_03 引用框架的装饰器完成单个传值.py'])

引用框架的装饰器完成多个传值           

""""""

import pytest


@pytest.mark.parametrize('username, password', [("qsdd的账号", "qsdd的密码"), ("qs的账号", "qs的密码"), ("dd的账号", "dd的密码")])
def test_login01(username, password):
    print(f"获取的账号信息:{username}")
    print(f"获取的密码信息:{password}")


if __name__ == '__main__':
    pytest.main(['-vs', 'test_04 引用框架的装饰器完成多个传值.py'])

        

4.Pytest之Fixture介绍

                        什么是fixture:在软件测试中, Fixture 是⼀种⽤于管理测试环境和测试数据的机制。它允许在测试函数或⽅法运⾏之前和之后执⾏特定的代码,以确保测试的可重复性和⼀致性。 Fixture 主要⽤于设置测试环境、准备测试数据、执⾏清理操作等,以便测试能够按预期运⾏

简单理解: 就是可以⽤它对需要执⾏的测试⽤例,设置前置或者后置操作

                示例如下

        

""""""
import pytest

"""
    fixturn 快速入门
"""


@pytest.fixture
def first_fix():
    return ['a']


def test_01(first_fix):
    first_fix.append("qsdd")
    print("first_fix: ", first_fix)


def test_02(first_fix):
    first_fix.append("测试")
    print("first_fix: ", first_fix)


if __name__ == '__main__':
    pytest.main(['-vs', "test_01_fixture简单演示.py"])

        2.fixture配置作⽤域       

""""""
import pytest

"""
# 知识拓展:

1.当用例很多的时候,每次通过传参来调用fixture,会很麻烦。
fixture里面有个参数autouse,默认是False,没有开启的,
可以设置为True开启自动使用fixture功能,
这样用例就不用每次都去传参了。

2.fixture里面还有个参数,scope,
定义被标记方法的作用域:session > module > class > function

3."function":作用于每个测试方法,每个test都运行一次
4."class":作⽤于整个类,每个class的所有test只运⾏⼀次 ⼀个类中可以有多个⽅法
5."module":作⽤于整个模块,每个module的所有test只运⾏⼀次;每⼀个.py⽂件调⽤⼀次,该⽂件内⼜有多个
function和class
6."session":作⽤于整个session(慎⽤),每个session只运⾏⼀次;是多个⽂件调⽤⼀次,可以跨.py⽂件调⽤,每
个.py⽂件就是module
"""


@pytest.fixture(autouse=True, scope="session")
def fix01():
    print("session 级别的fixture")


@pytest.fixture(autouse=True, scope="module")
def fix02():
    print("module 级别的fixture")


@pytest.fixture(autouse=True, scope="class")
def fix03():
    print("class 级别的fixture")


# 测试用例:

def test_a():
    print("test_a 用例执行")


def test_d():
    print("test_d 用例执行")


class TestCase:
    def test_b(self):
        print("test_b 用例执行")

    def test_c(self):
        print("test_c 用例执行")


if __name__ == '__main__':
    pytest.main(['-vs', "test_02_fixture的作用域.py"])


 

5.Conftest.py(重要)

        conftest.py是pytest特有的本地测试配置⽂件,既可以⽤来设置项⽬级的Fixture,也可以⽤来导⼊外部插件,还可以⽤来指定Hook函数(钩⼦函数)
         conftest.py⽂件名称是固定 , pytest会⾃动识别该⽂件, 只作⽤于它所在的⽬录及⼦⽬录

                

""""""
import pytest

"""
    不能自定义名称: conftest.py
"""


@pytest.fixture
def fix1():
    print("conftest 中的 fix1 方法")

""""""
import pytest


def test01(fix1):
    print("test01 测试用例执行")
    assert 1 == 1


if __name__ == '__main__':
    pytest.main(['-vs'])

结果看出,可以调用conftest中的函数

        

6.Conftest.py+fixture+yield 实现⽤例前置后置

提前在conftest.py中配置好前置、后置操作(通过conftest.py+fixture+yield,可轻松实现⽤例前置后置,包括项⽬级的

                

""""""
import pytest


def test01(fix1):
    print("test01 测试用例执行")


if __name__ == '__main__':
    pytest.main(['-vs'])

""""""
import pytest


@pytest.fixture
def fix1():
    a = "123"
    print("\n 测试用例的前置步骤/条件")

    yield a

    print("\n 测试用例的后置步骤/条件")

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

勒索病毒的策略与建议

随着网络技术的快速发展,勒索病毒攻击成为全球范围内日益严重的网络安全威胁。勒索病毒通过加密用户文件或锁定系统来勒索赎金,给个人和企业带来了巨大的损失。因此,了解如何应对勒索病毒攻击至关重要。本文将概述一些有效的防范措施和应对策…

深入Django项目实战与最佳实践

title: 深入Django项目实战与最佳实践 date: 2024/5/19 21:41:38 updated: 2024/5/19 21:41:38 categories: 后端开发 tags: Django 基础项目实战最佳实践数据库配置静态文件部署高级特性 第一章:Django项目架构与设计原则 Django框架概述 Django是一个高级的P…

目前流行的前端框架有哪些?

目前流行的前端框架有很多,它们可以帮助开发者快速构建高质量的前端应用程序。本文将介绍一些目前比较受欢迎的前端框架,并分析它们的优缺点。 React React 是一个由 Facebook 开发的开源前端JavaScript库,用于构建用户界面,尤其…

如何从Android恢复已删除的文件?3 种有效的方式

有时我们可能会错误地删除Android设备上的重要文件。更疯狂的是,Android手机上的文件在一夜之间消失了,我们不知道为什么。我们感到非常遗憾和恼火,但不知道。但是,此时学习如何从Android手机恢复已删除的文件为时已晚&#xff0c…

二.常见算法--贪心算法

&#xff08;1&#xff09;单源点最短路径问题 问题描述&#xff1a; 给定一个图&#xff0c;任取其中一个节点为固定的起点&#xff0c;求从起点到任意节点的最短路径距离。 例如&#xff1a; 思路与关键点&#xff1a; 以下代码中涉及到宏INT_MAX,存在于<limits.h>中…

怎么压缩pdf pdf在线压缩 pdf文件压缩大小

pdf文件无论在何种设备上打开&#xff0c;PDF文件都能保持其原始的布局和格式&#xff0c;这对于文档共享和打印非常重要。PDF不仅支持文本&#xff0c;还能嵌入图像、视频、音频以及动态链接等元素。PDF文件支持加密和密码保护&#xff0c;可以限制访问、编辑、复制或打印文档…

Dalle2学习

Dalle2 mini有GitHub库并且有网页可以直接测试

[图解]产品经理创新模式03封装领域逻辑

1 00:00:02,530 --> 00:00:06,840 第三个改进模式就是封装领域逻辑 2 00:00:06,840 --> 00:00:12,860 把人脑里面的封装的逻辑提炼出来 3 00:00:12,870 --> 00:00:13,740 放到电脑里面去 4 00:00:16,100 --> 00:00:21,440 比如说&#xff0c;销售员的&#xff0…

Zookeeper 安装教程和使用指南

一、Zookeeper介绍 ZooKeeper 是 Apache 软件基金会的一个开源项目&#xff0c;主要基于 Java 语言实现。 Apache ZooKeeper 是一个开源的分布式应用程序协调服务&#xff0c;提供可靠的数据管理通知、数据同步、命名服务、分布式配置服务、分布式协调等服务。 关键特性 分布…

《王者荣耀》4月狂揽2.34亿美元 单日流水1亿美元 全球销量第二

易采游戏网5月24日消息&#xff0c;在刚刚过去的四月&#xff0c;全球手游市场迎来了一场收益的盛宴&#xff0c;其中《王者荣耀》以其惊人的吸金能力&#xff0c;以2.34亿美元的月收入在全球手游排行榜上位列第二。4月5日&#xff0c;这款由腾讯游戏开发的多人在线战斗竞技游戏…

JS、Go、Rust 错误处理的不同 - JS 可以不用 Try/Catch 吗?

原文&#xff1a;Mateusz Piorowski - 2023.07.24 先来了解一下我的背景吧。我是一名软件开发人员&#xff0c;有大约十年的工作经验&#xff0c;最初使用 PHP&#xff0c;后来逐渐转向 JavaScript。 大约五年前&#xff0c;我开始使用 TypeScript&#xff0c;从那时起&#…

10、SpringBoot 源码分析 - 自动配置深度分析三

SpringBoot 源码分析 - 自动配置深度分析三 refresh和自动配置大致流程AutoConfigurationImportSelector的getAutoConfigurationEntry获取自动配置实体(重点)AutoConfigurationImportSelector的getCandidateConfigurations获取EnableAutoConfiguration类型的名字集合AutoConfig…

一个超级简单的Python UI库:NiceGUI

大家好&#xff0c;图形用户界面&#xff08;GUI&#xff09;的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言&#xff0c;提供了许多优秀的库来帮助开发者实现这一目标。今天&#xff0c;我们将介绍一个名为NiceGUI的库&#xff0c;它能帮助你轻松构建…

基于Tensorflow+Keras的卷积神经网络(CNN)人脸识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别是计算机视觉领域的一个重要研究方向&#xff0c;广泛应用于安全监控、身份验证、人机…

弘君资本股市资讯:深夜,利空突袭!美股大跳水!

昨夜&#xff0c;两大利空音讯突袭美股。 隔夜&#xff0c;最新披露的两则数据引发商场忧虑。其一是&#xff0c;美国5月Markit归纳PMI初值报54.4&#xff0c;创25个月新高&#xff0c;大幅高于预期的51.2&#xff0c;前值为51.3&#xff1b;其二是&#xff0c;在到5月18日的一…

05Django项目--前端公共文件和其他html文件的适配

对应视频链接点击直达 Django项目--前端公共文件和其他html文件的适配 对应视频链接点击直达前端页面准备Pubilc页面设置 OVER&#xff0c;不会有人不会吧不会的加Q1394006513结语 接着上一节 前端页面准备 为了方便大家更好的复制&#xff0c;我把整个项目及templates文件夹和…

docker如何拉取redis最新镜像并运行

要拉取Docker Hub上最新版本的Redis镜像&#xff0c;您可以使用以下命令&#xff1a; docker pull redis:latest 这里的latest标签会自动获取Redis镜像的最新版本。如果您希望指定一个确切的版本号&#xff0c;可以直接使用该版本号替换latest。例如&#xff0c;要拉取Redis版…

C++ (week5):Linux系统编程2:进程

文章目录 二、进程1.CPU的虚拟化2.进程命令(1)ps 3.进程的基本操作 (API)(1)获取进程的标识 (获得进程id)&#xff1a;getpid、getppid(2)创建进程&#xff1a;fork()(3)终止进程&#xff1a;exit()、_exit()、abort()、wait()、waitpid()①正常终止&#xff1a;exit()、_exit(…

Redis 源码学习记录:散列 (dict)

散列 Redis 源码版本&#xff1a;Redis-6.0.9&#xff0c;本篇文章的代码均在 dict.h / dict.c 文件中。 散列类型可以存储一组无需的键值对&#xff0c;他特别适用于存储一个对象数据。 字典 Redis 通常使用字典结构体存储用户散列数据。字典是 Redis 的重要数据结构。除了散…

AGM AG32 (MCU + FPGA)在音频处理上的应用案例

AGM AG32 (MCU FPGA)在音频处理&#xff0c;比如语音识别、降噪、声音增强等方面上的应用很多&#xff0c;结合AG32的特点&#xff0c;这里做一个简单的分享。 AGM AG32的架构是FPGA MCU&#xff0c;并且AG32与STM32的关键兼容&#xff0c;这个低成本的AG32器件&#xff0c;在…