Selenium3+Pytest+Allure落地Python Web自动化测试
在软件测试的面试中,只会“点点点”的手工测试已经很难在这个内卷的时代立足。当面试官问起 “如何构建企业级自动化测试框架” 时,如果你能熟练运用 Selenium3 + Pytest + Allure 这一黄金组合,绝对会让你的技术脱颖而出。
这套技术栈不仅覆盖了 UI 自动化的核心,更展现了你在代码封装、测试用例管理以及测试报告可视化方面的完整能力。下面我将通过实战代码,带你从零搭建一个高可用的自动化测试框架。
一、 框架设计的核心逻辑
一个成熟的自动化框架,绝不是把脚本写在主函数里就完事了。我们需要遵循“高内聚、低耦合”的原则。
- Selenium3:负责与浏览器交互,模拟用户操作。
- Pytest:负责测试用例的组织、执行、前置后置处理以及参数化驱动。
- Allure:负责将运行结果生成美观、详尽的 HTML 报告,用于 Jenkins 集成或团队复盘。
二、 封装 Selenium WebDriver(基础层)
不要在每个用例里都写一遍 driver.get() 或 driver.find_element(),我们需要一个 BasePage 类来封装底层操作,实现维护性提升。
python
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class BasePage:
def __init__(self, driver):
self.driver = driver
def open(self, url):
"""打开页面"""
self.driver.get(url)
def find_element(self, locator, timeout=10):
"""
显式等待查找元素
:param locator: 元组,例如 (By.ID, "kw")
"""
try:
element = WebDriverWait(self.driver, timeout).until(
EC.presence_of_element_located(locator)
)
return element
except Exception as e:
print(f"元素查找失败: {locator}, 错误信息: {e}")
return None
def click(self, locator):
"""点击操作"""
element = self.find_element(locator)
if element:
element.click()
def send_keys(self, locator, text):
"""输入操作"""
element = self.find_element(locator)
if element:
element.clear()
element.send_keys(text)
三、 Pytest 进阶应用:Fixture 与 参数化(核心层)
Pytest 之所以强大,在于它的 Fixture(夹具)机制,这相当于 TestNG 中的 @BeforeMethod 和 @AfterMethod,但更灵活。
1. 定义 Fixture
我们可以把浏览器的启动和关闭放在 conftest.py 中,这样所有测试类都能自动调用,无需手动传递 driver。
python
复制
# conftest.py
import pytest
from selenium import webdriver
@pytest.fixture(scope="function")
def driver():
# 初始化浏览器
service = webdriver.ChromeService(executable_path="chromedriver") # 确保路径正确
driver = webdriver.Chrome(service=service)
driver.maximize_window()
driver.implicitly_wait(10)
yield driver # yield 之前的代码是前置,yield 之后是后置
# 测试结束后的清理工作
driver.quit()
2. 编写测试用例
这里我们演示最核心的参数化测试。比如验证登录功能,我们不需要写 5 个 test 方法,只需 1 个方法 + 5 组数据。
python
复制
import pytest
from page_object.login_page import LoginPage
from utils.base_page import BasePage
# 定义测试数据:账号、密码、预期结果(这里简化为 True/False)
test_data = [
("admin", "123456", True),
("admin", "wrong_pwd", False),
("", "123456", False)
]
@pytest.mark.login
@pytest.mark.parametrize("username, password, expected", test_data)
def test_login(driver, username, password, expected):
"""
使用参数化驱动测试登录场景
"""
# 初始化页面对象
login_page = LoginPage(driver)
login_page.open("https://example.com/login")
# 执行登录
login_page.login_action(username, password)
# 断言
# 这里通过是否找到特定元素来判断登录是否成功
result = login_page.is_login_success()
assert result == expected, f"登录失败:用户 {username}, 预期 {expected}, 实际 {result}"
四、 Allure 测试报告集成(展示层)
代码跑通了,还要给老板和产品经理看。Allure 是目前最漂亮的测试报告之一。
1. 配置 Pytest 生成 Allure 数据
在项目根目录下运行命令:
bash
复制
# 安装插件
pip install pytest-allure-adaptor
# 运行测试并生成 json 数据
pytest --alluredir=./report/allure-raw
2. 生成 HTML 报告
bash
复制
allure generate ./report/allure-raw -o ./report/allure-html --clean
3. 在代码中增强 Allure 信息
为了让报告更易读,我们可以在代码中添加描述和步骤:
python
复制
import allure
@allure.feature("登录模块")
@allure.story("用户登录测试")
def test_login_with_allure(driver):
"""
Allure 注解使用示例
"""
# Allure.step 可以让报告显示测试步骤
with allure.step("打开登录页面"):
driver.get("https://example.com/login")
with allure.step("输入用户名和密码"):
driver.find_element(By.ID, "user").send_keys("admin")
driver.find_element(By.ID, "pass").send_keys("123456")
with allure.step("点击登录按钮"):
driver.find_element(By.ID, "btn").click()
生成的报告会包含:用例通过率、失败截图、环境信息、甚至运行步骤的截图。这就是面试中你可以展示的 “可视化质量保障体系” 。
五、 总结
掌握了 Selenium3+Pytest+Allure,你实际上掌握了一套完整的自动化测试解决方案:
- Selenium3 提供了底层的操作能力。
- Pytest 提供了强大的用例管理、并发执行和参数化能力。
- 优秀的代码封装体现了你的工程化思维。
- Allure 提供了高质量的交付物。
这套组合拳不仅能解决工作中的实际问题,更是你面试自动化测试岗位时的核心加分项。从今天开始,试着搭建属于你自己的框架吧!