python pytest测试框架
文章目录
嗨!收到一张超级美丽的风景图,愿你每天都能顺心!
框架介绍
测试框架概念
测试框架是指为自动化测试而设计的一组工具、库;提供了一种标准的方法来编写、运行和维护自动化测试用例。自动化测试框架由一个或多个模块集合组成,例如测试用例的管理、测试环境的配置和管理、测试数据的准备、测试结果的分析和报告等方面。使用自动化测试框架可以有效地提高软件测试的效率和质量,缩短测试周期。
pytest测试框架的好处
无框架的自动化测试,存在的问题:
- 用例代码较多寻找不便捷,管理混乱;
- 多个文件无法同时执行,效率低;
- 用例执行失败了无法重跑;
- 无法生成美观的测试报告;
Pytest 是一个成熟的测试框架,简单灵活易上手,支持参数化 ,失败自动重试等,支持很多第三方插件并可以自定义进行扩展,有allure(完美的测试报告) ,更符合项目中使用的自动化测试框架。
注:要安装好测试环境
python web自动化测试环境搭建
pytest以及插件安装
-
安装pytest:pip install pytest==7.2.0
-
cmd中查看版本:pytest --version
-
插件安装: pip install allure-pytest==2.12.0
pytest基础
pytest使用规则
- python文件名称要求以test_xxx开头,或者是 xx_test结尾
- 测试用例使用以test开头的函数进行设计 例:def testAAA()
- 注意事项,不用面向对象思想编写测试用例, 也不使用`init特殊构造方法(会导致执行用例时无法找到文件)
pytest运行
(1) pytest的运行方式有:主函数模式运行 、读取配置文件方式运行(主要的运用方式)主函数运行----执行所有符合pytest规则的python文件: pytest.main()
import pytest
def test_a(self):
print("这是类里面的测试用例1")
def test_b(self):
print("这是类里面的测试用例2")
if __name__ == '__main__':
pytest.main() # 主函数模式运行所有符合pytest规则的文件
我们以打开百度为例:
from selenium import webdriver
from time import sleep
import pytest
def test_baidu():
# 控制Chrome浏览器窗口
drive = webdriver.Chrome()
# 将浏览器窗口设置为全屏
drive.maximize_window()
# 全局等待5s
drive.implicitly_wait(5)
# 打开百度
drive.get('https://www.baidu.com/')
sleep(2)
# 主函数模式运行所有符合pytest规则的文件
if __name__ == '__main__':
pytest.main()
- pytest: 这是Python的测试框架pytest,用于执行单元测试和集成测试。
- test_framework_learning.py: 这是你想要测试的Python文件的路径,通常包含测试用例。
- ::test_baidu: 这是一个测试标识符,表示你想运行的是名为test_baidu的特定测试函数或类方法。::符号用于指定模块和测试方法的层次结构。
- –no-header: 选项表示在测试结果中不显示标题行,通常用于控制输出的简洁性。
- –no-summary: 类似于上面的选项,这个参数意味着不提供测试的总结信息,只显示测试执行的详细情况。
- -q: 这个选项代表“quiet”或“quiet mode”,表示测试运行时输出的详细程度较低,仅显示错误和失败的测试。
- collected 1 item只收集符合规则的函数
显示了一个名为test_baidu的测试用例在test_框架学习.py文件中成功通过(PASSED),执行时间大约为6.08秒。这个结果表明您的代码在进行百度相关的测试时没有遇到问题。
(2) pytest执行时可以携带参数,完成特定的功能,参数解释如下
-vs 打印调试详细信息
if __name__ == '__main__':
pytest.main(['-vs'])
--disable-warnings 禁用告警信息
if __name__ == '__main__':
pytest.main(['--disable-warnings'])
参数组合使用
if __name__ == '__main__':
pytest.main(['-vs', '--disable-warnings'])
接下来以打开博主的csdn为例
注:接下来的代码会使用到python web自动化基本操作,对代码不熟悉的可以看这篇文章。
python web自动化基本操作
注:1、验证时必须刷新一次页面,有可能网页会给一个随机生成数或字母的XPath,每一次打开页面都不一样,这个时候就需要我们自己手写了!!!
2、一定要家时间暂停,不然代码运行太快了。
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div[1]/div[1]/span[4]').click()
sleep(2)
由于登录过的账号密码可能已经保存过了,这里我们先进行一个删除操作。
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').clear()
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').send_keys('账号')
sleep(2)
第三步输入密,同理
接下来就是三个点击操作
方法一样,接下来我们来看总代码吧
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import pytest
def test_xuexitong():
# 控制Chrome浏览器窗口
drive = webdriver.Chrome()
# 将浏览器窗口设置为全屏
drive.maximize_window()
# 全局等待5s
drive.implicitly_wait(5)
# 打开学习通
drive.get('https://passport.csdn.net/login?code=applets')
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div[1]/div[1]/span[4]').click()
sleep(2)
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').clear()
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[1]/div/input').send_keys('账号')
sleep(2)
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[2]/div/input').clear()
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[2]/div/input').send_keys('密码')
sleep(2)
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[2]/div[1]/i').click()
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[2]/div[2]/i').click()
drive.find_element(By.XPATH, '/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div[1]/div[4]/button').click()
sleep(5)
print('执行完成')
# 主函数模式运行所有符合pytest规则的文件
if __name__ == '__main__':
pytest.main(['-vs', '--disable-warnings']) # -vs输出调试信息,--disable-warning警用告警信息
看看运行效果吧!
是不是帮我们自动打开了浏览器,并登录了我的博客账号,在5s后关闭了浏览器。
那如果我们想运行多个文件呢?
直接再创一个文件就好了(注意命名规范)
注:pytest写一个就可以跑所有文件了(所以以后我们会单独创建一个文件去写pytest。)
pytest.ini配置文件
pytest.ini 是用于全局的配置文件,主要管理 执行的参数配置,当项目中添加了 ini配置文件,pytest在执行时会读取配置信息,按配置的参数去运行。
创建名字为pytest.ini的文件放在项目根目录下,文件名称固定是pytest.ini不能更改
文件的顶部 加类型识别 [pytest]
注释使用的是 #
pytest中不要使用注释不要用中文,避免造成编码格式问题。
(1)常用的配置项
运行的参数:addopts 常用的参数如: -vs --alluredir 路径 --clean-alluredir (每个参数需要间隔)
执行目录参数:testpaths 会运行此目录下的用例
执行文件参数:python_files 可以指定文件运行,也可以全部文件运行
接下来我们就再控制台运行一个指定的文件(运行上述test_baidu.py)
1467bbd9eef35366f41f7.png#pic_center)
这样以后我们想运行那个文件就运行那个文件,可以是多个。
pytest进阶
当我们有成千上万个文件的时候,复制上万次显然不可取,那么有什么办法解决呢?
conftest + fixture结合使用(全局应用)
Pytest支持在测试的目录中,创建conftest.py文件,进行全局fixture配置使用
1、conftest.py文件名是固定的不能修改,文件放在项目根目录下
import pytest
@pytest.fixture
def my_fix():
print('开始执行了......')
现在在conftest.py文件里写了这么一串代码,那么如果我想要调用怎么用呢?
a8fad8c0579.png#pic_center)
需要把my_fix()当作形参,放进函数里面去
一个文件需用用另一个文件的函数,前提条件是不是应该先把函数导进来。
但是需要注意的是这是用的框架,框架有自己的特性,这是一个全局的配置。
既然如此
我们直接把我们开头需要重复操作的代码剪切到我们的conftest.py文件里
依然可以帮我们执行想要的操作
既然有前置操作,那么肯定也有后置操作,不过今天的分享就到这里,后置操作以及其他内容会在下次分享。
结语
本次分享就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区留言,如果给小伙伴们带来了一些收获,请留下你的小赞,你的点赞和关注将会成为博主分享每日学习的动力。