Pytest框架与应用

2.9.1 PO设计模式

在说Pytest之前,我们先来看一下什么是 PO(Page Object)设计模式。
为什么要引用PO设计模式?PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰。
PO(Page Object)页面对象模型是一种设计模式,用来管理维护一组web元素的对象库。在PO模式下,应用程序的每一个页面都有一个对应的page class,每一个page class维护着该web页的元素集和操作这些元素的方法。

2.9.2 Pytest安装和使用

2.9.2.1 Pytest安装

我们使用pip安装,命令pip install -pytest。
查看pytest安装版本,命令 pytest –version。

Pytest框架与应用

; 2.9.2.2 Pytest简介

pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。
pytest的优点:
·语法简单,容易上手
·开源
·方便集成
·支持report框架-allure等

2.9.2.3 Pytest会执行哪些模块?

所有的测试模块文件名都需要满足test_ _.py格式或__test.py格式。
在测试模块文件中,测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以Test_开头,不然pytest是不会去运行该class的)
在测试模类中,可以包含一个或多个test_开头的函数。
此时,在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
2.9.2.4 Pytest执行方式

  1. pycharm
    选择Edit Configrations
    Pytest框架与应用

点击+号,选择pytest

Pytest框架与应用

选择脚本路径,并点击ok

Pytest框架与应用

点击运行:

Pytest框架与应用
  1. 主函数方式
    pytest.main([‘参数’,’脚本名称’])
    示例:
    pytest.main([‘-s’,’test_run.py’])
    如果有多个参数:
    pytest.main([‘参数’ ,…,’参数’,’脚本名称’])
    示例:
    pytest.main([‘-s’,’-n’,’3′,’test_run.py’])
  2. 命令行
    pytest +参数+文件路径/测试文件名
    示例:
    pytest -s ./pytest_examples/test_run.py
  3. 配置文件
    在相应文件夹下面创建pytest.ini配置文件。
    执行pytest时,会读取配置文件的配置运行
    pytest.ini内容如下:
[pytest]

addopts =  -s

python_files = test_*.py

python_classes = Test_*

python_functions = test_*

2.9.2.5 Pytest执行顺序

  1. setup_class
    在测试类中,setup_class方法为类级别的前置操作,就是属于这个测试类的,所有测试用例前,执行这里面的代码。
  2. teardown_class
    在测试类中,teardown_class方法为类级别的后置操作,属于这个测试类的,所有用例后,执行这里面的代码
  3. setup
    在测试类中,setup方法为用例级别的前置操作,属于这个测试类的,每个用例执行前都要执行的代码
  4. teardown
    在测试类中,teardown方法为用例级别的前置操作,属于这个测试类的,每个用例执行后都要执行的代码
  5. @pytest.fixtrue()
    在测试类中,使用@ pytest.fixtrue()修饰的方法,可以被其他测试类引用,其优先级高于setup,在方法中可以使用yield关键字,yield后面的方法,会在用例结束后执行,其优先级低于teardown

示例代码:

import pytest

class Test_Run:
"""
    测试运行原理
"""

    def setup_class(self):
        """类级别的前置操作"""
        print("属于这个测试类的,所有用例前,执行这里面的代码")

    def teardown_class(self):
        """类级别的后置操作"""
        print("属于这个测试类的,所有用例后,执行这里面的代码")

    def setup(self):
        """用例级别的前置操作"""
        print("属于这个测试类的,每个用例执行前都要执行的代码")

    def teardown(self):
        """用例级别的后置操作"""
        print("属于这个测试类的,每个用例执行后都要执行的代码")

    @pytest.fixture()
    def dec_fun(self):
        """组件函数,可以被用例调用"""
        print("特定用例执行前,需要执行的代码")
        yield
        print ( "特定用例执行后,需要执行的代码" )

    def test_run1(self):
"""
        :return:
"""
        print("用例1的运行")

    def test_run2(self,dec_fun):
"""
        :return:
"""
        print("用例2的运行")

    def test_run3(self):
"""
        :return:
"""
        print("用例3的运行")

    def test_run4(self):
"""
        :return:
"""
        print("用例4的运行")

运行结果:

属于这个测试类的,所有用例前,执行这里面的代码
属于这个测试类的,每个用例执行前都要执行的代码
用例1的运行
属于这个测试类的,每个用例执行后都要执行的代码

特定用例执行前,需要执行的代码(组件函数yield之前的代码)
属于这个测试类的,每个用例执行前都要执行的代码
用例2的运行
属于这个测试类的,每个用例执行后都要执行的代码
特定用例执行后,需要执行的代码(组件函数yield之后的代码)
属于这个测试类的,每个用例执行前都要执行的代码
用例3的运行
.属于这个测试类的,每个用例执行后都要执行的代码
属于这个测试类的,每个用例执行前都要执行的代码
用例4的运行
.属于这个测试类的,每个用例执行后都要执行的代码
属于这个测试类的,所有用例后,执行这里面的代码

2.9.2.6 Pytest Exit Code

• Exit code 0 所有用例执行完毕,全部通过
• Exit code 1 所有用例执行完毕,存在Failed的测试用例
• Exit code 2 用户中断了测试的执行
• Exit code 3 测试执行过程发生了内部错误
• Exit code 4 pytest 命令行使用错误
• Exit code 5 未采集到可用测试用例文件

2.9.2.7 Pytest参数化

参数化是指把函数的多组参数值序列化。
在pytest使用参数化的方法是parametrize(arguments,argvalues)
说明:
arguments:参数名
argvalues:参数值,类型必须为list
当参数为一个时格式为:[value]
当参数为多个时格式为:
[(param_value1,param_value2),…,(param_valuen,param_valuen)]

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

在测试方法中,使用arguments[0]调用第一个参数,同理使用arguments[1],表示调用第二个参数。
示例代码:

class Test_DS:
    """电商网站PO设计模式"""

    def setup_class(self):
        """执行前创建Web对象"""
        self.web = Web ()
        self.web.openbrowser ( 'gc' )

@pytest.mark.parametrize('loginparams',[('密码错误','13800138006','12345611'),
                                        ('账号不存在','13110138006', '123456'),
                                        ('登录成功', '13800138006', '123456')])

    def test_login_success(self,loginparams):

         self.web.geturl ( '测试网址' )
        self.web.input ( '//*[@id="username"]', loginparams[1] )
        self.web.input ( '//*[@id="password"]', loginparams[2] )

        self.web.input ( '//*[@id="verify_code"]', '1111' )

        self.web.click ( '//*[@id="loginform"]/div/div[6]/a' )

    def teardown_class(self):

    self.web.sleep('3')
        self.web.quit()

运行结果:

Pytest框架与应用

2.9.2.8 Pytest断言

pytest使用assert进行断言。
示例:

class Test_Assert:
"""
    断言
"""
    def test_run1(self):

        a=0
        print ( a)
        assert a

    def test_run2(self):

        assert 3==4

运行结果:

Pytest框架与应用

2.9.2.9 Pytest常用参数

显示print内容:
在运行测试脚本时,为了调试或打印一些内容,我们会在代码中加一些print内容,但是在运行pytest时,这些内容不会显示出来。如果带上-s,就可以显示了。
运行模式:

pytest test_se.py -s

另外,pytest的多种运行模式是可以叠加执行的,比如说,你想同时运行4个进程,又想打印出print的内容。可以用:

pytest test_se.py -s -n 4

多进程运行cases:
当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。
安装pytest-xdist:

pip install -U pytest-xdist

运行模式:

pytest test_se.py -n NUM

其中NUM填写并发的进程数。

失败用例重试:
安装pytest-rerunfailures:

pip install -U pytest-rerunfailures

运行模式:

pytest test_se.py --reruns NUM

2.9.3 Pytest集成allure报告

2.9.3.1 allure的原始报告

allure下载地址:
https://github.com/allure-framework/allure2/releases

下载这个:

Pytest框架与应用

解压缩后配置环境变量:

Pytest框架与应用

allure就安装完成了,python需要安装allure-pytest库。

pip install allure-pytest

在执行pytest时候加上参数:

pytest.main ( ['-s','test_param.py', '--alluredir', 'result'] )

这个时候就会有一个result的文件

Pytest框架与应用

在文件夹(有result的文件,这里是pytest_example),命令行执行

allure generate result  -o reports

我们可以让代码帮我们执行这个命令。命令如下:

os.system ( 'allure generate  result -o reports --clean' )

Pytest框架与应用

就会生成reports文件夹,打开文件下index_html 就获取到一份干净的测试报告

Pytest框架与应用
Pytest框架与应用

2.9.3.2 allure报告DIY

1.注解优化

使用方法参数值参数说明@allure.epic()epic描述项目描述,往下是feature@allure.feature()模块名称功能点的描述,往下是story@allure.story()用户故事用户故事,往下是title@allure.title用例的标题重命名html报告名称@allure.testcase()测试用例的链接地址对应功能测试用例系统里面的case@allure.issue()缺陷对应缺陷管理系统里面的链接@allure.description()用例描述测试用例的描述@allure.step()操作步骤测试用例的步骤@allure.severity()用例等级blocker,critical,normal,minor,trivial@allure.link()链接定义一个链接,在测试报告展现@allure.attachment()附件报告添加附件

Pytest框架与应用

2.设置logo
a.修改logo图片
打开allure文件夹:
G:\allure-2.15.0\plugins\custom-logo-plugin\static
static文件夹下custom-logo.svg这是就是默认logo,我们要把我们的logo图片放到这里。
然后打开styles.css

Pytest框架与应用
这里需要调样式—找个关系好的前端!

b.启用插件
G:\allure-2.15.0\config \allure.yaml
在最后添加一个行: – custom-logo-plugin
重新生成报告就好了。

Original: https://blog.csdn.net/qq_15650277/article/details/121596359
Author: 谷雨飞鱼
Title: Pytest框架与应用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/772692/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关于flask入门教程-分页的几种方式

    关于flask的分页,大家都知道有一个Flask-SQLAlchemy提供的paginate()方法,这个方法配合bootstrap简化了分页连接代码的生成,但其实关于分页数据的返…

    Python 2023年8月10日
    059
  • 学会开会|成为有连接感组织的重要技能

    远程会议在疫情中逐渐显得尤为重要,而当线下接触变得更加安全时,人们关注到未来的许多会议将是混合的——现场人员和远程参与者共同参加。文章提出了需从技术、设计和协调三个要素创建更好的混…

    Python 2023年10月25日
    054
  • Python第10章 NumPy库

    例 10-2 绘制:随机生成 10000 数据,服从均值为 0 、方差为 1 的正态分布的直方图(间隔个数: 50 ) 例 10-4 数组、矩阵之间的线性代数运算 例 10-5 文…

    Python 2023年8月25日
    045
  • ChatGPT被玩坏了

    大家好,欢迎来到 Crossin的编程教室 ! 体验了一下最近火出圈的 ChatGPT,聊聊使用感受。 ChatGPT让我下岗? 原理就不展开说了,因为我也不懂,写出来估计大家也都…

    Python 2023年9月29日
    053
  • 浅谈-动态路由之OSPF的理解

    在网络中,路由相当于就是一张地图,让路由器知道这个对应的IP数据包应该往哪端口、网段走;而这个”地图”我们称之为路由表,不同的目的IP路由表的下一个跳也不同…

    Python 2023年10月19日
    035
  • 【面试实战】面试基本流程【第一版】

    但笔者相信更多的同学选择互联网行业,干程序猿,都是冲着那份高薪来的 不管同学们出于什么样的原因选择了这一行,既然干了就一定要干好 那么势必我们最后一定要落实到那个老生常谈的问题:工…

    Python 2023年6月10日
    074
  • 完全 PR 指南

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 弹尽粮绝,会员救园:…

    Python 2023年10月22日
    020
  • Python数据科学库06(pandas)(End)

    Python数据科学库06(pandas) 学习06 练习 1、现在我们有2015到2017年25万条911的紧急电话的数据,请统计出出这些数据中不同类型的紧急情况的次数,如果我们…

    Python 2023年8月7日
    051
  • 第十四章 记分

    记分 14.1 添加 Play 按钮 * 14.1.1 创建Button类 14.1.2 在屏幕上绘制按钮 14.1.3 开始游戏 14.1.4 重置游戏 14.1.5 将Play…

    Python 2023年9月19日
    037
  • 处理文件、摄像头和图形用户界面

    1、基本I/O脚本 1.1 读/写图像文件 import numpy import cv2 img = numpy.zeros((3,3),dtype=numpy.uint8) i…

    Python 2023年8月29日
    053
  • MapStruct与lombok加载顺序问题与annotationProcessorPaths的关系?

    MapStruct是什么? MapStruct is a code generator that greatly simplifies the implementation of …

    Python 2023年10月13日
    048
  • Python中常见的模块

    为了解决维护问题,一般情况下,在一个完整的项目中,会将特定的功能分组,分别放到不同的 文件中,在使用的过程中,可以单独维护,各个不同的文件之间互不影响,每个.py 文件就被称为一个…

    Python 2023年8月9日
    057
  • 解决Python中matplotlib 库画图中文和负号显示为方框的问题

    解决Python中matplotlib 库画图中文和负号显示为方框的问题 注意:​ 语言版本:Python 3.10.4​ 编译器版本:PyCharm 2021.3.2​ 操作系统…

    Python 2023年8月31日
    042
  • 1.支付系统

    项目场景: 用户购买东西时支付的场景,这里以电脑支付为例 支付的流程 支付宝沙箱的配置 登录 – 支付宝 登陆上支付宝之后进入到上边的网址,然后进入到控制台,找到沙箱应…

    Python 2023年8月14日
    0108
  • 价值上万的Python逆向教程,模拟登陆微博

    0x00 抓包分析 简单的搜索之后发现,很多参数都是登陆上面这个请求返回的值,这个请求在输入完账号光标到达密码框时就会生成! 很多小伙伴在学习Python的过程中往往因为没有资料或…

    Python 2023年11月9日
    037
  • Python调用matlab

    在 “MatLabInstall\extern\engines\python”路径中,执行如下操作:使用管理员权限打开命令行界面,执行如下命令: pytho…

    Python 2023年8月2日
    051
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球