
Selene 与 Pytest 集成构建企业级 Python 测试框架的完整方案【免费下载链接】seleneUser-oriented Web UI browser tests in Python项目地址: https://gitcode.com/gh_mirrors/sel/seleneSelene 是一个面向用户的 Python Web UI 测试框架结合 Pytest 强大的测试管理能力可以构建高效、可维护的企业级测试解决方案。本文将详细介绍如何将 Selene 与 Pytest 无缝集成从环境配置到高级功能实现帮助测试团队快速搭建专业的自动化测试框架。为什么选择 Selene 与 Pytest 集成在企业级测试场景中选择合适的工具组合至关重要。Selene 提供了简洁直观的 API 和智能等待机制而 Pytest 则以灵活的测试组织、丰富的插件生态和强大的 fixture 系统著称。两者结合可以带来以下优势简洁的测试代码Selene 的链式 API 设计使测试逻辑更清晰减少冗余代码智能等待机制内置的等待策略减少了显式等待的使用提高测试稳定性灵活的测试组织Pytest 的模块化设计支持复杂测试场景的组织与管理丰富的插件生态通过 Pytest 插件扩展报告、并行执行等高级功能强大的依赖注入利用 Pytest fixture 实现测试资源的高效管理环境准备与基础配置安装必要依赖首先确保你的环境中安装了 Python 3.7然后通过以下命令安装 Selene 和 Pytestpip install selene pytest如果你使用 Poetry 进行依赖管理可以通过项目根目录下的 pyproject.toml 文件安装依赖poetry install配置 Pytest 作为默认测试运行器在 PyCharm 等 IDE 中建议将 Pytest 配置为默认测试运行器以便获得更好的集成体验。通过File Settings Tools Python Integrated Tools路径在 Testing 部分将 Default test runner 设置为 pytest。基本集成方案浏览器管理与 Fixture简单的浏览器 Fixture在测试中我们通常需要为每个测试函数创建一个独立的浏览器实例。通过 Pytest fixture 可以轻松实现这一点# tests/acceptance/custom_driver_via_fixtures/conftest.py import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service from selene import Config, Browser pytest.fixture(scopefunction) def driver_per_test(): chrome_driver webdriver.Chrome(serviceService()) yield chrome_driver chrome_driver.quit() pytest.fixture(scopefunction) def browser(driver_per_test): yield Browser(Config(driverdriver_per_test))这个简单的配置创建了两个 fixturedriver_per_test负责管理浏览器驱动的生命周期browser则提供 Selene 的浏览器实例。通过将 fixture 作用域设置为function确保每个测试函数都获得一个全新的浏览器实例避免测试间的相互干扰。使用共享浏览器实例在某些情况下为了提高测试执行效率我们可能希望在多个测试函数间共享一个浏览器实例。可以通过将 fixture 作用域设置为module或session来实现# tests/integration/conftest.py import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service from selene import Config, Browser pytest.fixture(scopesession) def chrome_driver(): chrome_driver webdriver.Chrome(serviceService()) yield chrome_driver chrome_driver.quit() pytest.fixture(scopefunction) def session_browser(chrome_driver): yield Browser(Config(driverchrome_driver))chrome_driverfixture 会在整个测试会话期间创建并复用一个浏览器驱动实例而session_browserfixture 则为每个测试函数提供一个新的 Selene Browser 实例共享同一个驱动。这种方式在保持测试隔离性的同时减少了浏览器启动和关闭的开销。高级配置跨平台测试与并行执行跨平台测试配置企业级测试通常需要在多种环境中执行包括不同的浏览器、操作系统甚至移动设备。Selene 与 Pytest 结合可以轻松实现跨平台测试# examples/run_cross_platform/tests/conftest.py import pytest from appium.options.android import UiAutomator2Options from examples.run_cross_platform import project from selene import browser pytest.fixture(scopefunction, autouseTrue) def driver_management(): if project.config.context is project.Context.bstack_android: android_options UiAutomator2Options() android_options.app bs://c700ce60cf13ae8ed97705a55b8e022f13c5827c android_options.set_capability( bstack:options, { deviceName: Google Pixel 7, **project.config.bstack_creds, }, ) browser.config.driver_options android_options browser.config.driver_remote_url http://hub.browserstack.com/wd/hub elif project.config.context is project.Context.local_web: browser.config.base_url https://www.wikipedia.org yield browser.quit()这个示例展示了如何通过 Pytest fixture 根据不同的测试上下文配置不同的驱动选项实现 Web 和移动平台的测试。通过环境变量或配置文件你可以轻松切换测试环境无需修改测试代码。并行测试执行随着测试套件的增长执行时间会成为瓶颈。Pytest-xdist 插件可以帮助我们实现测试的并行执行大幅缩短测试周期pytest -n auto这个命令会根据你的 CPU 核心数量自动分配并行测试进程。在大型测试套件中这可以将执行时间减少数倍。为了确保并行测试的稳定性需要注意以下几点确保测试用例之间没有共享状态使用独立的测试数据为每个并行进程配置独立的资源如浏览器实例实际案例TodoMVC 测试实现让我们通过一个实际案例来展示 Selene 与 Pytest 集成的强大功能。我们将测试 TodoMVC 应用这是一个常见的前端框架演示项目。测试场景我们将实现以下测试场景添加新任务标记任务为完成过滤任务列表清除已完成任务测试实现# tests/examples/todomvc/pagemodules_approach/todomvc_test.py import pytest from selene import browser, have from tests.examples.todomvc.pagemodules_approach.pages import tasks pytest.fixture(scopefunction, autouseTrue) def visit_todomvc(): browser.open(https://todomvc.com/examples/emberjs/) browser.should(have.title(Ember TodoMVC)) yield def test_add_new_tasks(): tasks.add(Learn Selene) tasks.add(Integrate with Pytest) tasks.should_have(Learn Selene, Integrate with Pytest) def test_complete_task(): tasks.add(Test task completion) tasks.complete(Test task completion) tasks.should_have_completed(Test task completion) tasks.should_have_active(0) def test_filter_tasks(): tasks.add(Active task) tasks.add(Completed task) tasks.complete(Completed task) tasks.filter.active() tasks.should_have(Active task) tasks.should_not_have(Completed task) tasks.filter.completed() tasks.should_have(Completed task) tasks.should_not_have(Active task) tasks.filter.all() tasks.should_have(Active task, Completed task) def test_clear_completed_tasks(): tasks.add(Task to keep) tasks.add(Task to complete) tasks.complete(Task to complete) tasks.clear_completed() tasks.should_have(Task to keep) tasks.should_not_have(Task to complete)页面对象模块为了保持测试代码的可维护性我们使用页面对象模式组织元素定位和操作# tests/examples/todomvc/pagemodules_approach/pages/tasks.py from selene import browser, by, be class Tasks: def __init__(self): self.new_task_input browser.element(by.id(new-todo)) self.task_list browser.all(by.css(#todo-list li)) self.clear_completed_button browser.element(by.css(#clear-completed)) self.footer browser.element(by.css(#footer)) def add(self, text): self.new_task_input.type(text).press_enter() def complete(self, text): self.task_list.element_by(have.exact_text(text)).element(by.css(.toggle)).click() def should_have(self, *texts): self.task_list.should(have.exact_texts(*texts)) def should_not_have(self, text): self.task_list.element_by(have.exact_text(text)).should(be.absent) def should_have_completed(self, text): self.task_list.element_by(have.exact_text(text)).should(have.css_class(completed)) def should_have_active(self, count): self.footer.element(by.css(.todo-count)).should(have.text(f{count} items left)) def clear_completed(self): self.clear_completed_button.click() class Filter: def active(self): browser.element(by.link_text(Active)).click() def completed(self): browser.element(by.link_text(Completed)).click() def all(self): browser.element(by.link_text(All)).click() filter Filter() tasks Tasks()测试执行与结果通过 Pytest 运行测试非常简单只需在项目根目录执行以下命令pytest tests/examples/todomvc/在 IDE 中你可以直接点击测试函数旁边的运行按钮执行单个测试执行成功后你将看到类似 TodoMVC 应用界面的测试结果最佳实践与高级技巧测试数据管理对于企业级测试良好的测试数据管理至关重要。可以使用 Pytest 参数化功能结合外部数据文件import pytest import json with open(tests/data/task_scenarios.json) as f: task_scenarios json.load(f) pytest.mark.parametrize(scenario, task_scenarios) def test_task_management(scenario): for action in scenario[actions]: if action[type] add: tasks.add(action[text]) elif action[type] complete: tasks.complete(action[text]) for assertion in scenario[assertions]: if assertion[type] should_have: tasks.should_have(*assertion[texts])测试报告与可视化Pytest 提供了多种报告插件可以生成详细的测试报告pytest-html生成交互式 HTML 报告allure-pytest生成美观的 Allure 报告pytest-metadata添加环境信息到报告中安装并使用 pytest-htmlpip install pytest-html pytest --htmlreport.html失败自动截图在测试失败时自动捕获屏幕截图对于问题诊断非常有帮助。可以通过 Pytest 的钩子函数实现# conftest.py import pytest from selene import browser pytest.hookimpl(tryfirstTrue, hookwrapperTrue) def pytest_runtest_makereport(item, call): outcome yield rep outcome.get_result() if rep.when call and rep.failed: browser.save_screenshot(fscreenshots/{item.name}.png)自定义条件与命令Selene 允许你扩展自定义条件和命令以满足特定项目需求# examples/custom_conditions.py from selene import have, command from selene.core.condition import Condition from selene.core.element import Element def have_value_containing(text: str) - Condition[Element]: return have.attribute(value).value_containing(text) Element.type_and_enter command(lambda element, text: element.type(text).press_enter()) # 在测试中使用 browser.element(#search).should(have_value_containing(selene)) browser.element(#new-todo).type_and_enter(Learn custom commands)总结与下一步Selene 与 Pytest 的集成提供了一个强大而灵活的企业级测试解决方案。通过本文介绍的方法你可以构建一个高效、可维护的自动化测试框架支持从简单到复杂的各种测试场景。下一步你可以探索以下高级主题CI/CD 集成将测试集成到 Jenkins、GitHub Actions 等 CI/CD 系统视觉测试结合 Applitools 等工具实现视觉回归测试API 测试集成结合 requests 库实现端到端 APIUI 测试性能测试添加性能监控和基准测试通过不断优化和扩展你的测试框架你可以为团队提供更快、更可靠的质量反馈从而加速产品迭代并提高软件质量。Selene 和 Pytest 都是活跃的开源项目建议定期查看它们的官方文档和更新日志以充分利用最新功能和最佳实践。【免费下载链接】seleneUser-oriented Web UI browser tests in Python项目地址: https://gitcode.com/gh_mirrors/sel/selene创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考