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
在这里插入图片描述

选择脚本路径,并点击ok
在这里插入图片描述

点击运行:
在这里插入图片描述

  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.get_verify ( '//*[@id="verify_code_img"]' )

        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()

运行结果:

在这里插入图片描述

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

运行结果:
在这里插入图片描述

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

下载这个:
在这里插入图片描述

解压缩后配置环境变量:
在这里插入图片描述

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

pip install allure-pytest

在执行pytest时候加上参数:

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

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

在这里插入图片描述

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

`allure generate result  -o reports` 

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

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

在这里插入图片描述

就会生成reports文件夹,打开文件下index_html 就获取到一份干净的测试报告
在这里插入图片描述
在这里插入图片描述

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()附件报告添加附件

在这里插入图片描述

2.设置logo
a.修改logo图片
打开allure文件夹:
G:\allure-2.15.0\plugins\custom-logo-plugin\static
static文件夹下custom-logo.svg这是就是默认logo,我们要把我们的logo图片放到这里。
然后打开styles.css
在这里插入图片描述
这里需要调样式—找个关系好的前端!

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷雨飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值