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。
; 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执行方式
- pycharm
选择Edit Configrations
点击+号,选择pytest
选择脚本路径,并点击ok
点击运行:
- 主函数方式
pytest.main([‘参数’,’脚本名称’])
示例:
pytest.main([‘-s’,’test_run.py’])
如果有多个参数:
pytest.main([‘参数’ ,…,’参数’,’脚本名称’])
示例:
pytest.main([‘-s’,’-n’,’3′,’test_run.py’]) - 命令行
pytest +参数+文件路径/测试文件名
示例:
pytest -s ./pytest_examples/test_run.py - 配置文件
在相应文件夹下面创建pytest.ini配置文件。
执行pytest时,会读取配置文件的配置运行
pytest.ini内容如下:
[pytest]
addopts = -s
python_files = test_*.py
python_classes = Test_*
python_functions = test_*
2.9.2.5 Pytest执行顺序
- setup_class
在测试类中,setup_class方法为类级别的前置操作,就是属于这个测试类的,所有测试用例前,执行这里面的代码。 - teardown_class
在测试类中,teardown_class方法为类级别的后置操作,属于这个测试类的,所有用例后,执行这里面的代码 - setup
在测试类中,setup方法为用例级别的前置操作,属于这个测试类的,每个用例执行前都要执行的代码 - teardown
在测试类中,teardown方法为用例级别的前置操作,属于这个测试类的,每个用例执行后都要执行的代码 - @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()
运行结果:
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
重新生成报告就好了。
Original: https://blog.csdn.net/qq_15650277/article/details/121596359
Author: 谷雨飞鱼
Title: Pytest框架与应用
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/772692/
转载文章受原作者版权保护。转载请注明原作者出处!