Python自动化测试从零到实战:Selenium、Pytest与项目全流程指南
2026/9/4 4:10:20 网站建设 项目流程

这次我们来看一个面向2026年的Python自动化测试教程。这个教程的核心目标很直接:让零基础的小白也能从环境搭建开始,一步步掌握自动化测试的核心技能,最终能独立完成项目实战。它不满足于只讲Selenium或Appium的某个API,而是试图构建一个从基础概念、常用工具到完整项目实践的完整学习路径。

对于想进入测试领域或提升自动化能力的人来说,最关心的往往是“学完能不能用起来”。这个教程的亮点在于它强调“工具+项目”的结合,不仅介绍Python在自动化测试中的应用,还会涉及接口测试、UI测试等主流场景,并最终落地到实战项目,解决“知道理论但不会写脚本”的痛点。本文将带你快速梳理这套教程的核心内容框架、环境准备要点、关键工具链的使用方法,并通过模拟实战项目来验证学习效果,让你能清晰判断是否值得投入时间,并知道从哪里开始动手。

1. 核心能力速览:教程内容与目标

在深入细节之前,我们先通过一个表格快速了解这个“从零到精通”教程覆盖的核心模块和能帮你达成的目标。

能力项说明与目标
目标读者软件测试初学者、希望转型自动化的手工测试工程师、需要补充测试技能的开发人员。
技术栈核心Python 3.x + Selenium/Playwright (Web UI) + Requests/Pytest (接口) + Appium (移动端,可选) + 单元测试框架。
环境门槛普通Windows/Mac电脑即可,无需高性能GPU。主要依赖Python环境、浏览器驱动、以及各测试库。
核心教学方式基础语法 -> 测试库详解 -> 工具集成 -> 项目实战四段式推进,强调代码与实操结合。
关键工具覆盖预计包含Selenium(Web自动化)、Pytest(测试框架)、Requests(接口测试)、Allure(测试报告)、Jenkins/Git(CI/CD入门)等。
项目实战类型可能包含Web应用全流程测试、REST API接口测试套件、或一个简单的移动端应用测试Demo。
最终产出学员能够搭建自动化测试环境,编写结构化的测试用例,生成测试报告,并对接持续集成流程。
学习建议重点不在于记忆所有API,而在于理解“元素定位-操作-断言-报告”的通用模式,并能移植到自己的项目中。

2. 适用场景与学习边界

这套教程主要解决以下几类人的问题:

  1. 新手入门迷茫:知道自动化测试重要,但不知从何学起,被各种工具和框架吓退。
  2. 技能升级瓶颈:手工测试经验丰富,但写代码困难,无法将测试用例自动化。
  3. 项目实践缺失:学过Python和测试理论,但无法独立完成一个完整的、有结构的自动化测试项目。

它能帮你解决的问题:

  • 环境搭建:一次性配好Python、pip、虚拟环境、浏览器驱动,避开初期最常见的环境坑。
  • 脚本编写:从简单的打开浏览器、搜索操作,到复杂的登录验证、数据驱动测试。
  • 框架搭建:学习如何使用Pytest组织用例、使用Page Object Model (POM) 设计模式提高代码可维护性。
  • 报告与集成:生成直观的HTML测试报告,并了解如何将自动化脚本接入Jenkins等工具实现定时执行。

需要注意的边界:

  • 不是银弹:自动化测试不能完全替代手工探索性测试和用户体验测试。
  • 有维护成本:UI自动化脚本会因前端页面变化而失效,需要持续维护。
  • 深度与广度:作为入门到精通的教程,它可能覆盖较广,但在每个工具(如性能测试、安全测试)的深度上需要学习者后续自行钻研。
  • 实战项目局限性:教程中的实战项目通常是教学演示用的,其复杂度和业务逻辑与真实企业项目有差距,重点在于学习方法和流程。

3. 环境准备与前置条件

开始跟随教程实践前,你需要准备好以下环境。这是后续所有操作的基础,务必确保每一步都成功。

3.1 基础软件安装

  1. Python 3.8+:自动化测试的主力语言。建议从Python官网下载最新稳定版。

    • 安装注意:务必勾选 “Add Python to PATH”,这样可以在命令行任何位置使用pythonpip命令。
    • 验证安装:打开命令行(CMD或Terminal),输入python --versionpip --version,能显示版本号即成功。
  2. 代码编辑器/IDE:推荐使用Visual Studio Code (VS Code)PyCharm (Community版即可)

    • VS Code:轻量、免费,需安装Python扩展。
    • PyCharm:专为Python设计,功能强大,对测试框架支持好。
  3. Git:用于版本管理和克隆教程代码(如果教程提供)。从Git官网下载安装。

3.2 关键工具与驱动安装

自动化测试需要与浏览器或移动设备交互,因此需要对应的驱动。

  1. Web自动化驱动(以Chrome为例)

    • 查看Chrome版本:浏览器地址栏输入chrome://settings/help
    • 下载ChromeDriver:访问ChromeDriver官网,下载与你的Chrome浏览器版本号完全一致的驱动。
    • 配置驱动
      • 方法一(推荐):将下载的chromedriver.exe文件放在Python安装目录的Scripts文件夹下(该目录通常在PATH中)。
      • 方法二:将其放在项目根目录,并在代码中指定路径。
    • 验证:在命令行输入chromedriver --version,能输出版本信息即可。
  2. 包管理工具pip:通常随Python安装。为了快速下载,可以配置国内镜像源。

    # 临时使用清华源安装包 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package # 或永久配置(Windows) # 在用户目录(C:\Users\你的用户名)下创建 pip 文件夹,再创建 pip.ini 文件,内容如下: # [global] # index-url = https://pypi.tuna.tsinghua.edu.cn/simple # trusted-host = pypi.tuna.tsinghua.edu.cn

3.3 创建虚拟环境

为每个项目创建独立的Python环境,避免包版本冲突。

# 在项目目录下打开命令行 # 创建虚拟环境,环境文件夹名为 venv python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate # 激活后,命令行前缀会显示 (venv),表示已进入该环境 # 在此环境下安装的所有包都是独立的

4. 核心测试库安装与验证

教程的核心是使用一系列Python库。我们一次性安装并验证最常用的几个。

# 确保在激活的虚拟环境中执行 pip install selenium # Web UI自动化 pip install playwright # 现代Web自动化,支持多浏览器 pip install requests # 接口测试 pip install pytest # 测试框架,用于组织和运行用例 pip install pytest-html # 生成HTML测试报告 pip install allure-pytest # 生成更美观的Allure报告(可选) pip install openpyxl # 读写Excel,用于数据驱动测试(可选) pip install pymysql # 连接数据库,用于测试数据准备/验证(可选) # 安装Playwright的浏览器内核 playwright install

验证安装:创建一个简单的test_demo.py文件。

import selenium import playwright import requests import pytest print(f"Selenium version: {selenium.__version__}") print(f"Requests version: {requests.__version__}") print(f"Pytest version: {pytest.__version__}") # 运行这个脚本,无报错且能打印出版本号,说明基础库安装成功。

5. 功能测试与效果验证:分模块实战

教程的精华在于将知识应用于实践。下面我们模拟教程中可能出现的几个关键模块的测试场景。

5.1 模块一:Web UI自动化(Selenium实战)

目标:模拟用户操作浏览器,完成一次百度搜索并验证结果。

# test_baidu_search.py from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time def test_baidu_search(): # 1. 启动浏览器(确保chromedriver在PATH或指定路径) driver = webdriver.Chrome() driver.implicitly_wait(10) # 隐式等待,全局等待元素出现 driver.maximize_window() try: # 2. 打开百度 driver.get("https://www.baidu.com") # 3. 定位搜索框,输入关键词 search_box = driver.find_element(By.ID, 'kw') search_box.send_keys("Python自动化测试") # 4. 定位搜索按钮,点击 search_button = driver.find_element(By.ID, 'su') search_button.click() time.sleep(2) # 等待结果加载,实际项目中应用显式等待替代sleep # 5. 断言:验证页面标题或结果中包含关键词 assert "Python自动化测试" in driver.title # 或者验证第一个结果链接的文本 first_result = driver.find_element(By.XPATH, '//*[@id="content_left"]/div[1]/h3/a') assert "Python" in first_result.text print("测试通过!搜索结果页标题包含‘Python自动化测试’。") finally: # 6. 关闭浏览器 driver.quit() if __name__ == "__main__": test_baidu_search()

运行与验证

  1. 保存为.py文件。
  2. 在命令行运行python test_baidu_search.py
  3. 观察浏览器自动打开、搜索、关闭的过程,并在控制台看到“测试通过!”的输出。
  4. 常见问题:如果报错WebDriverException,检查ChromeDriver版本是否与浏览器匹配,以及驱动文件是否在PATH中。

5.2 模块二:接口自动化测试(Requests + Pytest实战)

目标:测试一个公开的API接口,验证其状态码和响应内容。

# test_api.py import requests import pytest # 定义一个测试类,使用Pytest框架 class TestPublicAPI: # 测试用例:获取用户列表 def test_get_users(self): url = "https://jsonplaceholder.typicode.com/users/1" response = requests.get(url) # 断言1:状态码为200 assert response.status_code == 200 # 断言2:响应体是JSON格式,且包含特定字段 data = response.json() assert isinstance(data, dict) assert 'id' in data assert 'name' in data assert data['id'] == 1 print(f"接口测试通过,获取用户: {data['name']}") # 测试用例:创建帖子(模拟POST请求) def test_create_post(self): url = "https://jsonplaceholder.typicode.com/posts" headers = {'Content-Type': 'application/json'} payload = { 'title': 'foo', 'body': 'bar', 'userId': 1 } response = requests.post(url, json=payload, headers=headers) assert response.status_code == 201 # 创建成功 response_data = response.json() assert response_data['title'] == 'foo' print(f"接口测试通过,创建帖子ID: {response_data['id']}") # 使用Pytest运行:在命令行进入文件所在目录,执行 `pytest test_api.py -v`

运行与验证

  1. 保存文件。
  2. 命令行运行pytest test_api.py -v
  3. Pytest会自动发现以test_开头的函数并执行,-v参数显示详细信息。看到两个绿色的PASSED即表示接口测试成功。
  4. 核心要点:接口测试不依赖UI,速度快,稳定性高,是自动化测试的重点。

5.3 模块三:使用Pytest生成测试报告

目标:运行一组测试用例并生成直观的HTML报告。

# conftest.py (Pytest配置文件,可选) # 可以在这里定义全局的fixture,如初始化driver import pytest from selenium import webdriver @pytest.fixture(scope="session") def driver(): """提供一个WebDriver实例,供所有测试用例使用""" d = webdriver.Chrome() d.implicitly_wait(10) yield d # 测试用例执行时使用这个d d.quit() # 所有用例执行完毕后退出 # test_with_report.py import pytest def test_addition(): assert 1 + 1 == 2 def test_subtraction(): assert 5 - 3 == 2 @pytest.mark.skip(reason="示例:跳过这个测试") def test_skip_example(): assert True == False def test_failure_example(): # 这个测试会失败 assert 10 / 2 == 6

运行与生成报告

# 1. 运行测试并生成pytest-html报告 pytest test_with_report.py --html=report.html --self-contained-html # 2. 运行测试并生成Allure报告(需要先安装allure命令行工具) pytest test_with_report.py --alluredir=./allure-results # 生成可查看的HTML报告 allure serve ./allure-results

效果验证:执行命令后,会在当前目录生成report.html文件,用浏览器打开即可看到详细的测试结果汇总、通过率、失败用例的堆栈信息等。Allure报告则更加美观和交互式。

6. 项目实战模拟:一个简易的Web登录测试套件

我们将上面学到的知识组合起来,模拟一个教程中可能会涉及的小型项目实战:测试一个登录页面。

项目结构

login_test_project/ │ ├── pages/ # 页面对象模型(POM)目录 │ └── login_page.py # 登录页面的元素定位和操作封装 │ ├── tests/ # 测试用例目录 │ ├── conftest.py # Pytest共享配置(如driver fixture) │ └── test_login.py # 登录测试用例 │ ├── data/ # 测试数据目录(如Excel、JSON) │ └── test_accounts.json │ ├── reports/ # 测试报告输出目录 │ └── requirements.txt # 项目依赖列表

1. 页面对象模型 (LoginPage)

# pages/login_page.py from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class LoginPage: def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(driver, 10) # 定位器 USERNAME_INPUT = (By.ID, 'username') PASSWORD_INPUT = (By.ID, 'password') LOGIN_BUTTON = (By.ID, 'loginBtn') ERROR_MSG = (By.CLASS_NAME, 'error-message') SUCCESS_MSG = (By.ID, 'welcome') # 页面操作方法 def open(self, url): self.driver.get(url) return self def enter_username(self, username): element = self.wait.until(EC.presence_of_element_located(self.USERNAME_INPUT)) element.clear() element.send_keys(username) return self def enter_password(self, password): self.driver.find_element(*self.PASSWORD_INPUT).clear() self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password) return self def click_login(self): self.driver.find_element(*self.LOGIN_BUTTON).click() return self def get_error_message(self): try: return self.driver.find_element(*self.ERROR_MSG).text except: return None def get_welcome_message(self): try: return self.driver.find_element(*self.SUCCESS_MSG).text except: return None

2. Pytest 共享配置

# tests/conftest.py import pytest from selenium import webdriver @pytest.fixture(scope="function") # 每个测试函数一个driver实例 def driver(): d = webdriver.Chrome() d.implicitly_wait(5) d.maximize_window() yield d d.quit() @pytest.fixture def login_page(driver): from pages.login_page import LoginPage return LoginPage(driver)

3. 测试用例与数据驱动

# tests/test_login.py import pytest import json import os # 从JSON文件加载测试数据 def load_test_data(): data_file = os.path.join(os.path.dirname(__file__), '..', 'data', 'test_accounts.json') with open(data_file, 'r', encoding='utf-8') as f: return json.load(f) class TestLogin: # 使用fixture ‘login_page’,它依赖于 ‘driver’ @pytest.mark.parametrize("account", load_test_data()['valid_accounts']) def test_login_success(self, login_page, account): """测试有效账号登录成功""" login_page.open("https://example.com/login") # 替换为实际登录页URL login_page.enter_username(account['username'])\ .enter_password(account['password'])\ .click_login() # 断言:登录后应出现欢迎语 welcome_text = login_page.get_welcome_message() assert welcome_text is not None assert account['username'] in welcome_text @pytest.mark.parametrize("account", load_test_data()['invalid_accounts']) def test_login_failure(self, login_page, account): """测试无效账号登录失败""" login_page.open("https://example.com/login") login_page.enter_username(account['username'])\ .enter_password(account['password'])\ .click_login() # 断言:应出现错误提示信息 error_msg = login_page.get_error_message() assert error_msg is not None assert account['expected_error'] in error_msg

4. 测试数据文件

# data/test_accounts.json { "valid_accounts": [ {"username": "test_user1", "password": "correct_password"}, {"username": "admin", "password": "admin123"} ], "invalid_accounts": [ {"username": "wrong_user", "password": "any", "expected_error": "用户名不存在"}, {"username": "test_user1", "password": "wrong_pass", "expected_error": "密码错误"} ] }

5. 运行项目测试

# 进入项目根目录 cd login_test_project # 安装依赖(如果requirements.txt存在) pip install -r requirements.txt # 运行所有测试,并生成Allure报告 pytest tests/ -v --alluredir=./reports/allure-results # 查看报告 allure serve ./reports/allure-results

实战验证:通过这个微型项目,你实践了POM设计模式、Pytest框架、数据驱动测试和测试报告生成。虽然目标网站是示例,但整个代码结构、模式和流程完全适用于真实的企业级Web应用测试。

7. 资源占用与性能观察

自动化测试脚本本身对硬件资源要求不高,但执行效率是项目成功的关键。

  1. CPU/内存占用

    • Python解释器和浏览器进程(尤其是Chrome)会占用一定内存。一个典型的Selenium测试用例执行时,可能会占用200-500MB内存,取决于页面复杂度。
    • 多线程或并行执行用例时,内存消耗会成倍增加。需要监控系统资源,避免因内存不足导致脚本崩溃。
  2. 执行速度优化

    • 减少time.sleep():尽量使用Selenium的显式等待(WebDriverWait)代替固定休眠,让脚本在元素出现后立即操作。
    • 并行执行:使用Pytest的pytest-xdist插件可以并行运行测试,大幅缩短总执行时间。
      pip install pytest-xdist pytest tests/ -n 4 # 使用4个worker并行执行
    • 无头模式:在不需要观察浏览器界面的环境(如CI服务器),使用无头模式可以节省资源并加快执行。
      from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless') # 启用无头模式 driver = webdriver.Chrome(options=options)
  3. 网络与稳定性

    • 自动化测试受网络环境影响大。对于UI测试,建议在稳定的内网环境进行。
    • 接口测试相对稳定,但也要处理超时、重试机制。
    • 使用try...except块和断言后清理操作,确保一个用例失败不影响后续用例。

8. 常见问题与排查方法

在学习和实践过程中,你几乎一定会遇到以下问题。这里提供快速排查思路。

问题现象可能原因排查方式解决方案
ModuleNotFoundError: No module named ‘selenium’Python环境问题,包未安装或安装在错误的环境。1. 命令行输入pip list查看已安装包。
2. 确认当前命令行前缀是否有(venv)
1. 激活正确的虚拟环境。
2. 在目标环境中重新执行pip install selenium
WebDriverException: Message: ‘chromedriver’ executable needs to be in PATHChromeDriver未正确配置。1. 检查Chrome浏览器版本。
2. 检查chromedriver.exe文件路径。
1. 下载匹配版本的ChromeDriver。
2. 将其所在目录添加到系统PATH,或直接在代码中指定路径:webdriver.Chrome(executable_path=‘你的路径/chromedriver’)
元素找不到 (NoSuchElementException)1. 页面未加载完成。
2. 元素定位器(如ID、XPath)写错或页面已变更。
3. 元素在iframe或shadow DOM内。
1. 添加显式等待。
2. 使用浏览器开发者工具重新检查元素属性。
3. 检查页面结构。
1. 使用WebDriverWait等待元素出现。
2. 使用更稳定的定位方式(如优先用ID)。
3. 切换到对应的iframe或使用shadow DOM相关API。
脚本在本地运行成功,在CI服务器失败1. CI服务器无图形界面。
2. 浏览器或驱动版本不一致。
3. 文件路径问题。
1. 查看CI运行日志。
2. 对比本地与CI环境。
1. 使用无头模式 (--headless)。
2. 在CI构建脚本中明确安装指定版本的浏览器和驱动。
3. 使用绝对路径或相对于项目根目录的路径。
Pytest找不到测试用例1. 测试文件/函数命名不符合规则(非test_开头)。
2. 执行目录不正确。
1. 检查文件名和函数名。
2. 在命令行使用pytest --collect-only查看收集到的用例。
1. 确保测试文件以test_开头,测试函数/类以Testtest_开头。
2. 在项目根目录执行,或使用pytest /path/to/tests指定路径。
接口测试返回403/404等错误1. 接口URL错误。
2. 需要请求头(如Token、Content-Type)。
3. 请求方法(GET/POST)错误。
1. 使用Postman等工具先验证接口。
2. 打印完整的请求和响应信息。
1. 核对URL和参数。
2. 在代码中正确添加headers
3. 使用正确的HTTP方法。

9. 最佳实践与进阶建议

遵循以下实践,能让你的自动化测试代码更健壮、更易维护。

  1. 设计模式为王:务必采用Page Object Model (POM)。将页面元素定位和操作封装成类,测试用例只调用这些方法。这样前端页面修改时,你只需要改一个PO类,而不是散落在各处的测试脚本。
  2. 数据与代码分离:将测试数据(账号、参数、预期结果)放在外部文件(JSON、YAML、Excel)或数据库中。使用pytest.mark.parametrize实现数据驱动测试,提高用例复用性。
  3. 善用Fixture:Pytest的fixture是管理测试前置和后置操作的利器。用它来初始化driver、登录、清理测试数据,可以使测试用例函数非常简洁。
  4. 日志与报告:不要只用print。使用Python的logging模块记录关键步骤和错误。集成Allurepytest-html生成可视化报告,便于结果分析和分享。
  5. 持续集成:尽早将自动化测试脚本接入Jenkins、GitLab CI等工具。实现代码提交后自动触发测试,快速反馈问题。
  6. 稳定性建设
    • 重试机制:对于不稳定的操作或网络请求,可以添加重试逻辑。
    • 失败截图:在测试失败时自动截屏,帮助快速定位问题。
      def test_example(driver): try: # ... 测试操作 ... assert something except AssertionError as e: driver.save_screenshot("failure.png") raise e
  7. 安全与合规:自动化测试脚本可能涉及测试环境的账号密码。切勿将敏感信息硬编码在代码中或提交到版本库。使用环境变量或专门的密钥管理服务来存储。

10. 总结与下一步

这套“从零到精通”的教程,其最大价值在于提供了一个结构化、可落地的学习地图。它告诉你第一步装Python,第二步学Selenium定位元素,第三步用Pytest组织用例,第四步用Page Object模式优化代码,最后整合成一个有报告、可集成的实战项目。

对于初学者,最应该立刻动手验证的是环境搭建第一个Selenium脚本。只要你能让浏览器自动打开百度并完成一次搜索,最难的“从0到1”就突破了。接下来,按照“模仿->理解->修改->创造”的路径,将教程中的示例代码,一点点改成测试你自己感兴趣网站的功能。

最容易踩的坑无非是环境配置和元素定位。环境问题通过本文第8部分的排查表基本能解决。元素定位则需要耐心,多使用浏览器的开发者工具,并理解XPath、CSS选择器等不同定位策略的优缺点。

完成教程的基础部分后,你可以选择以下方向深入:

  • 深入某个框架:深入研究Pytest的插件系统,或学习Playwright这个更现代、功能更强的Web自动化工具。
  • 移动端自动化:如果你的业务涉及App,学习Appium是自然延伸。
  • 接口测试进阶:学习使用pytest-base-urlrequests-mock等工具,构建更复杂的接口测试套件。
  • 性能测试入门:了解如何使用locustpytest-benchmark进行简单的压力测试或性能基准测试。
  • 测试平台搭建:尝试将你的测试脚本服务化,搭建一个简单的Web测试平台,实现用例管理和任务调度。

自动化测试是一个实践性极强的领域,代码量积累到一定程度后,很多概念会自然贯通。建议你将这篇指南作为手边参考,在遇到具体问题时回来查阅对应章节。现在,就从安装Python和ChromeDriver开始吧。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询