网页建站价格,熊掌号 西安网站建设,自己制作网页查询系统,网站构建的基本流程五个环节具备功能
关键技术#xff1a;
pylaywright测试库pytest单元测试框架pytest-playwright插件
非关键技术#xff1a;
pytest-html插件pytest-rerunfailures插件seldom 测试框架
实现功能#xff1a;
元素定位与操作分离失败自动截图并保存到HTML报告失败重跑可配置不同…具备功能
关键技术
pylaywright测试库pytest单元测试框架pytest-playwright插件
非关键技术
pytest-html插件pytest-rerunfailures插件seldom 测试框架
实现功能
元素定位与操作分离失败自动截图并保存到HTML报告失败重跑可配置不同的浏览器执行可配置headless/headful 模式实现参数化读取数据文件
一个自动化具备的基本功能差不多就这些了。其实主要是使用了一堆框架和插件主要是整合能力。
使用方式
安装依赖
$ pip install -r requirements.txt注安装requirements.txt指定依赖库的版本这是经过测试的有时候新的版本可会有错。
配置
在 config.py 文件配置
class RunConfig:运行测试配置# 运行测试用例的目录或文件cases_path ./test_dir/test_parametrize.py# 配置浏览器驱动类型(chromium, firefox, webkit)。browser chromium# 运行模式headless, headfulmode headful# 配置运行的 URLurl https://www.baidu.com# 失败重跑次数rerun 0# 当达到最大失败数停止执行max_fail 5运行
运行测试
$ python run.py设计细节
关于page object设计模式
page object是自动化测试最常用的设计模式。
但 playwright 中的只提供了操作方法元素定位和测试数据都只是参数。
# 输入
page.type(#kw, playwright)
# 点击
page.click(#su)我们依然可以将元素定位单独封装一层。
class BaiduElem:search_input #kw # 搜索框search_button #su # 搜索按钮settings #s-usersetting-top # 设置search_setting #s-user-setting-menu div a.setpref # 搜索设置save_setting text保存设置 # 保存设置在测试用例中的使用
from element.baidu_element import BaiduElem
from playwright.sync_api import Pagedef test_baidu_search(page: Page, base_url):page.goto(base_url)page.type(BaiduElem.search_input, textplaywright)page.click(BaiduElem.search_button)sleep(2)assert page.title() playwright_百度搜索这肯定不是什么好的设计。用例层写起来会比较啰嗦 最好可以page.elem.type(playwright) 的语法实现这就需要在playwright的基础上再封装一套API, 看playwright 源码还是有些复杂的主要是用了很多就异步成本比较大暂时先这么用。
关于自动截图
自动截图需要 pytest/pytest-html 和 playwright 配合完成 pytest/pytest-html 判断用例实现并把图片插入到报告中。 playwright 实现截图动作。
pytest.mark.hookwrapper
def pytest_runtest_makereport(item):用于向测试用例中添加用例的开始时间、内部注释和失败截图等.:param item:pytest_html item.config.pluginmanager.getplugin(html)outcome yieldreport outcome.get_result()report.description description_html(item.function.__doc__)extra getattr(report, extra, [])page item.funcargs[page]if report.when call:xfail hasattr(report, wasxfail)if (report.skipped and xfail) or (report.failed and not xfail):case_path report.nodeid.replace(::, _) .pngif [ in case_path:case_name case_path.split(-)[0] ].pngelse:case_name case_pathcapture_screenshots(case_name, page)img_path image/ case_name.split(/)[-1]if img_path:html divimg src%s altscreenshot stylewidth:304px;height:228px; \onclickwindow.open(this.src) alignright//div % img_pathextra.append(pytest_html.extras.html(html))report.extra extradef capture_screenshots(case_name, page):配置用例失败截图路径:param case_name: 用例名:return:global driverfile_name case_name.split(/)[-1]if RunConfig.NEW_REPORT is None:raise NameError(没有初始化测试报告目录)else:image_dir os.path.join(RunConfig.NEW_REPORT, image, file_name)page.screenshot(pathimage_dir)通过page item.funcargs[page] 拿到playwright的驱动截图判断逻辑有点复杂不过我已经实现了。
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你