2026年Python自动化测试完全指南:8个实战框架教你从零基础到测试开发工程师
一、新手入门指南
1.1 环境安装
Python自动化测试的环境搭建非常简单,只需要以下几步:
1. 安装Python 3.10+版本(推荐3.12 LTS,兼容性最好)
2. 配置pip国内源(提高包下载速度)
3. 安装虚拟环境工具`python -m pip install virtualenv`
4. 创建并激活虚拟环境:
virtualenv venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
1.2 测试基础概念
**单元测试**:对软件中的最小可测试单元进行检查和验证,通常是函数或方法
**集成测试**:测试多个模块或组件之间的交互是否正常
**系统测试**:对整个系统进行全面测试,验证是否满足需求
**回归测试**:修改代码后重新测试,确保修改没有引入新的问题
**冒烟测试**:版本发布前的基础测试,验证核心功能是否正常运行
1.3 常用测试库介绍
Python生态拥有丰富的自动化测试工具,最常用的包括:
`unittest`:Python标准库自带的单元测试框架,入门简单
`pytest`:最流行的第三方测试框架,功能强大,插件丰富
`requests`:接口测试必备的HTTP请求库
`Selenium`:最经典的UI自动化测试工具,支持多浏览器
`Playwright`:微软推出的新一代UI测试工具,比Selenium更稳定
`locust`:性能测试工具,使用Python代码编写测试场景
`pytest-html`:生成美观的HTML测试报告
`allure-pytest`:生成更专业的Allure测试报告
二、8个实战自动化测试脚本
2.1 单元测试:pytest测试数学工具函数
# test_math_utils.py
import pytest
# 待测试的工具函数
def add(a: int, b: int) -> int:
return a + b
def divide(a: float, b: float) -> float:
if b == 0:
raise ValueError("除数不能为0")
return a / b
# 测试用例
def test_add_positive_numbers():
"""测试两个正数相加"""
assert add(2, 3) == 5
def test_add_negative_numbers():
"""测试两个负数相加"""
assert add(-1, -1) == -2
def test_divide_normal():
"""测试正常除法"""
assert divide(10, 2) == 5.0
def test_divide_zero():
"""测试除以0的异常情况"""
with pytest.raises(ValueError, match="除数不能为0"):
divide(10, 0)
# 参数化测试:一次测试多组数据
@pytest.mark.parametrize("a, b, expected", [
(0, 0, 0),
(100, 200, 300),
(-5, 5, 0),
(3, -3, 0),
])
def test_add_parametrized(a, b, expected):
"""参数化测试加法函数"""
assert add(a, b) == expected
使用说明:
1. 安装依赖:`pip install pytest`
2. 运行测试:`pytest test_math_utils.py -v`
3. 特点:pytest会自动发现所有以`test_`开头的函数和文件
2.2 接口测试:requests测试RESTful API
# test_api.py
import requests
import pytest
BASE_URL = "https://jsonplaceholder.typicode.com"
def test_get_posts():
"""测试获取文章列表接口"""
response = requests.get(f"{BASE_URL}/posts")
# 断言状态码为200
assert response.status_code == 200
# 断言返回内容是JSON格式
posts = response.json()
# 断言返回至少10篇文章
assert len(posts) >= 10
# 断言第一篇文章有id和title字段
assert "id" in posts[0]
assert "title" in posts[0]
def test_create_post():
"""测试创建新文章接口"""
payload = {
"title": "Python自动化测试教程",
"body": "这是一篇关于Python自动化测试的文章",
"userId": 1
}
response = requests.post(f"{BASE_URL}/posts", json=payload)
assert response.status_code == 201
new_post = response.json()
assert new_post["title"] == payload["title"]
assert new_post["body"] == payload["body"]
assert "id" in new_post
def test_get_post_by_id():
"""测试根据ID获取单篇文章"""
post_id = 1
response = requests.get(f"{BASE_URL}/posts/{post_id}")
assert response.status_code == 200
post = response.json()
assert post["id"] == post_id
assert "userId" in post
使用说明:
1. 安装依赖:`pip install requests pytest`
2. 运行测试:`pytest test_api.py -v`
3. 扩展:可以使用`pytest-html`生成测试报告,`pytest-xdist`并行执行测试
2.3 UI测试:Playwright自动化网页操作
# test_ui_playwright.py
from playwright.sync_api import Page, expect
import pytest
def test_baidu_search(page: Page):
"""测试百度搜索功能"""
# 打开百度首页
page.goto("https://www.baidu.com")
# 验证页面标题包含"百度"
expect(page).to_have_title("百度一下,你就知道")
# 在搜索框输入"Python自动化测试"
page.locator("#kw").fill("Python自动化测试")
# 点击搜索按钮
page.locator("#su").click()
# 等待搜索结果加载完成
page.wait_for_selector("#content_left")
# 验证搜索结果包含相关内容
expect(page.locator("#content_left")).to_contain_text("Python自动化测试")
# 截图保存结果
page.screenshot(path="search_result.png", full_page=True)
def test_douban_movie(page: Page):
"""测试豆瓣电影排行榜"""
page.goto("https://movie.douban.com/chart")
# 验证页面标题
expect(page).to_have_title("豆瓣电影排行榜")
# 获取排名前10的电影
movies = page.locator(".item").all()[:10]
assert len(movies) == 10
# 打印前10名电影名称
for i, movie in enumerate(movies, 1):
title = movie.locator(".pl2 a").first.text_content().strip()
print(f"第{i}名:{title}")
使用说明:
1. 安装依赖:`pip install playwright pytest-playwright`
2. 安装浏览器:`playwright install`
3. 运行测试:`pytest test_ui_playwright.py –headed`(–headed参数显示浏览器界面)
4. 特点:Playwright自动等待元素加载,比Selenium稳定性高很多
2.4 性能测试:Locust模拟高并发用户
# locustfile.py
from locust import HttpUser, task, between, tag
class WebsiteUser(HttpUser):
# 每个用户之间等待1-3秒
wait_time = between(1, 3)
# 测试的目标域名
host = "https://www.baidu.com"
@tag("search")
@task(3) # 权重3,执行频率是其他任务的3倍
def search_test(self):
"""搜索测试"""
self.client.get("/s?wd=Python自动化测试")
@tag("homepage")
@task(1)
def visit_homepage(self):
"""访问首页"""
self.client.get("/")
def on_start(self):
"""每个用户启动时执行的操作"""
print("新用户开始访问")
def on_stop(self):
"""每个用户结束时执行的操作"""
print("用户结束访问")
使用说明:
1. 安装依赖:`pip install locust`
2. 启动测试:`locust -f locustfile.py`
3. 打开浏览器访问`http://localhost:8089`,输入并发用户数和每秒新增用户数,点击开始
4. 特点:可以直观地看到QPS、响应时间、错误率等性能指标
2.5 兼容性测试:Selenium测试多浏览器兼容性
# test_compatibility.py
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
import pytest
# 测试不同浏览器
@pytest.mark.parametrize("browser", ["chrome", "firefox", "edge"])
def test_browser_compatibility(browser):
"""测试网站在不同浏览器下的兼容性"""
driver = None
try:
# 初始化不同浏览器的驱动
if browser == "chrome":
driver = webdriver.Chrome()
elif browser == "firefox":
driver = webdriver.Firefox()
elif browser == "edge":
driver = webdriver.Edge()
driver.maximize_window()
driver.get("https://www.baidu.com")
# 等待搜索框出现
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "kw"))
)
search_box.send_keys(f"兼容性测试 - {browser}")
# 点击搜索按钮
search_btn = driver.find_element(By.ID, "su")
search_btn.click()
# 等待结果加载
WebDriverWait(driver, 10).until(
EC.title_contains("兼容性测试")
)
# 验证页面加载成功
assert f"兼容性测试 - {browser}" in driver.title
print(f"{browser} 浏览器测试通过")
finally:
if driver:
driver.quit()
使用说明:
1. 安装依赖:`pip install selenium pytest`
2. 下载对应浏览器的驱动并放到PATH路径下
3. 运行测试:`pytest test_compatibility.py -v`
4. 特点:一次编写测试用例,自动在多个浏览器上执行
2.6 安全测试:检测网站常见安全漏洞
# test_security.py
import requests
import re
from urllib.parse import urljoin, urlparse
def test_sql_injection(url: str):
"""测试SQL注入漏洞"""
payloads = ["'", "' OR '1'='1", "' OR 1=1--", "\" OR \"1\"=\"1"]
vulnerable = False
for payload in payloads:
test_url = f"{url}?id={payload}"
try:
response = requests.get(test_url, timeout=5)
# 检查响应中是否包含SQL错误信息
if any(error in response.text.lower() for error in ["sql syntax", "mysql error", "postgresql error", "ora-"]):
print(f"[!] 可能存在SQL注入漏洞: {test_url}")
vulnerable = True
except Exception as e:
print(f"[-] 请求失败: {e}")
return vulnerable
def test_xss_vulnerability(url: str):
"""测试XSS跨站脚本漏洞"""
payload = ""
test_url = f"{url}?q={payload}"
try:
response = requests.get(test_url, timeout=5)
if payload in response.text:
print(f"[!] 可能存在XSS漏洞: {test_url}")
return True
except Exception as e:
print(f"[-] 请求失败: {e}")
return False
def test_https_security(url: str):
"""测试HTTPS配置是否安全"""
parsed = urlparse(url)
if parsed.scheme != "https":
print(f"[!] 网站未使用HTTPS协议")
return False
try:
response = requests.get(url, timeout=5, verify=True)
if response.status_code == 200:
print(f"[+] HTTPS配置正常")
return True
except requests.exceptions.SSLError:
print(f"[!] SSL证书无效或过期")
return False
return False
if __name__ == "__main__":
target_url = "http://example.com" # 替换为要测试的网站
print(f"开始安全测试: {target_url}")
test_sql_injection(target_url)
test_xss_vulnerability(target_url)
test_https_security(target_url)
使用说明:
1. 安装依赖:`pip install requests`
2. 运行测试:`python test_security.py`
3. 注意:测试他人网站前请获得授权,避免触犯法律
2.7 持续集成:GitHub Actions自动运行测试
# .github/workflows/test.yml
name: 自动化测试
on:
push:
branches: [ main, develop ] # 推送到main或develop分支时触发
pull_request:
branches: [ main ] # PR到main分支时触发
schedule:
- cron: '0 1 * * *' # 每天凌晨1点自动执行
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"] # 测试多个Python版本
steps:
- uses: actions/checkout@v4
- name: 设置Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: 安装依赖
run: |
python -m pip install --upgrade pip
pip install pytest requests playwright pytest-playwright
playwright install --with-deps chromium
- name: 运行单元测试
run: |
pytest tests/unit -v --junitxml=unit-test-results.xml
- name: 运行接口测试
run: |
pytest tests/api -v --junitxml=api-test-results.xml
- name: 运行UI测试
run: |
pytest tests/ui -v --junitxml=ui-test-results.xml
- name: 上传测试结果
uses: actions/upload-artifact@v4
if: always() # 即使测试失败也上传
with:
name: test-results
path: '*-test-results.xml'
使用说明:
1. 在GitHub仓库中创建`.github/workflows`目录
2. 将上述内容保存为`test.yml`文件
3. 推送代码到GitHub,Actions会自动运行测试
4. 特点:每次代码变更都自动运行测试,及时发现问题
2.8 测试报告生成:Allure美观测试报告
# test_allure_report.py
import allure
import pytest
from datetime import datetime
@allure.feature("用户管理模块")
@allure.story("用户登录功能")
class TestUserLogin:
@allure.title("正常登录测试")
@allure.severity(allure.severity_level.CRITICAL)
def test_login_success(self):
"""测试使用正确的用户名和密码登录"""
with allure.step("步骤1:输入正确的用户名"):
print("输入用户名:admin")
with allure.step("步骤2:输入正确的密码"):
print("输入密码:123456")
with allure.step("步骤3:点击登录按钮"):
print("点击登录")
with allure.step("步骤4:验证登录成功"):
assert True, "登录成功"
# 附加测试截图
allure.attach.file("search_result.png", name="登录成功截图", attachment_type=allure.attachment_type.PNG)
@allure.title("密码错误登录测试")
@allure.severity(allure.severity_level.NORMAL)
def test_login_wrong_password(self):
"""测试使用错误的密码登录"""
with allure.step("步骤1:输入正确的用户名"):
print("输入用户名:admin")
with allure.step("步骤2:输入错误的密码"):
print("输入密码:wrongpass")
with allure.step("步骤3:点击登录按钮"):
print("点击登录")
with allure.step("步骤4:验证登录失败,提示密码错误"):
assert False, "密码错误" # 模拟测试失败
@allure.title("用户不存在登录测试")
@allure.severity(allure.severity_level.NORMAL)
def test_login_user_not_exist(self):
"""测试使用不存在的用户名登录"""
with allure.step("步骤1:输入不存在的用户名"):
print("输入用户名:nonexist")
with allure.step("步骤2:输入任意密码"):
print("输入密码:123456")
with allure.step("步骤3:点击登录按钮"):
print("点击登录")
with allure.step("步骤4:验证登录失败,提示用户不存在"):
assert False, "用户不存在" # 模拟测试失败
@allure.feature("商品管理模块")
@allure.story("商品查询功能")
def test_product_search():
"""测试商品搜索功能"""
with allure.step("输入商品关键词"):
print("输入关键词:Python自动化测试")
with allure.step("点击搜索按钮"):
print("点击搜索")
with allure.step("验证搜索结果"):
assert True, "搜索结果正确"
使用说明:
1. 安装依赖:`pip install allure-pytest pytest`
2. 运行测试并生成结果:`pytest test_allure_report.py –alluredir=./allure-results`
3. 生成并打开报告:`allure serve ./allure-results`
4. 特点:生成的报告美观专业,包含测试步骤、截图、严重级别等详细信息
三、新手常见踩坑指南
3.1 元素定位问题
**问题**:UI测试中元素定位经常失败,导致用例不稳定
**解决方案**:
1. 优先使用ID、CSS选择器定位,避免使用XPath和绝对路径
2. 给开发提需求,给关键元素加上唯一的`data-testid`属性
3. 使用显式等待代替强制等待,Playwright和Selenium都有自动等待机制
4. 页面元素变化时及时更新定位器
3.2 测试环境不一致
**问题**:测试脚本在本地运行正常,在CI/CD环境运行失败
**解决方案**:
1. 使用Docker容器化测试环境,保证所有环境一致
2. 用`requirements.txt`或`pyproject.toml`固定依赖版本
3. 测试配置文件不要硬编码,使用环境变量传递敏感信息
4. 测试数据和测试脚本分离,避免环境差异导致的失败
3.3 测试用例不稳定
**问题**:同样的测试用例有时候通过有时候失败,没有规律
**解决方案**:
1. 每个测试用例保持独立,不要依赖其他用例的执行结果
2. 测试前清理测试数据,测试后恢复环境,避免脏数据影响
3. 增加重试机制,对于不稳定的用例可以设置自动重试2-3次
4. 避免测试之间共享状态,每个用例都有独立的运行环境
3.4 测试维护成本高
**问题**:项目迭代快,测试用例更新跟不上,大量用例失效
**解决方案**:
1. 采用Page Object设计模式,把页面元素和操作封装起来
2. 测试用例尽量简洁,只关注业务逻辑,不关心具体实现
3. 优先自动化稳定的核心功能,不要盲目追求100%测试覆盖率
4. 定期清理失效的测试用例,保持测试套件的简洁高效
四、变现盈利方向:测试工程师的多元收入路径
自动化测试是互联网行业的刚需岗位,掌握Python自动化测试技能后,不仅可以找到高薪工作,还可以通过多种方式增加收入。
4.1 测试外包接单
**接单平台**:程序员客栈、码市、猪八戒、淘宝、闲鱼等
**常见需求**:自动化测试脚本开发、测试用例编写、性能测试、安全测试、兼容性测试等
**报价参考**:简单测试脚本开发1000-3000元/个,完整项目测试5000-20000元/项目
**接单技巧**:先从简单需求做起,积累案例和客户口碑,后续会有大量复购
4.2 企业测试服务
**目标客户**:中小微互联网公司,他们需要测试服务但养不起专职测试团队
**服务内容**:企业内部测试体系搭建、自动化测试框架开发、定期安全测试、版本发布测试等
**收费模式**:项目制收费1-10万/项目,或者按年收取服务费5-20万/年
**优势**:客户粘性高,长期合作收益稳定,不需要频繁找新客户
4.3 测试培训课程
**变现方式**:录制自动化测试课程在知识付费平台售卖,或者做1对1私教辅导
**热门方向**:Python自动化测试入门、接口测试实战、Playwright/UI自动化、性能测试、测试开发进阶等
**定价参考**:录播课程99-399元/套,1对1辅导200-500元/小时,系统培训班2000-10000元/人
**优势**:一次录制,多次售卖,边际成本为零,做好了可以带来长期被动收入
4.4 测试工具开发
**产品方向**:开发通用测试工具、测试平台、测试插件等
**变现方式**:开源+付费增值服务、企业授权、SaaS订阅等
**成功案例**:很多知名测试工具都是个人开发者开发的,做好了可以获得不错的收入甚至获得融资
**适合人群**:有一定开发能力的测试开发工程师,喜欢钻研技术
五、职业发展路径
5.1 测试工程师成长路线
1. 初级测试工程师:掌握基础测试理论和手工测试,月薪6-12k
2. 中级测试工程师:掌握一门编程语言和自动化测试,月薪12-20k
3. 高级测试工程师:精通自动化测试框架,能独立搭建测试体系,月薪20-35k
4. 测试开发工程师:能开发测试工具和平台,懂持续集成和DevOps,月薪30-60k
5. 测试架构师/测试经理:负责整个公司的测试体系建设,月薪50k+
5.2 学习建议
1. 打好基础:先掌握测试基础理论和Python编程语言,不要一上来就学复杂框架
2. 多做实战:找实际项目练手,参与开源项目贡献代码,积累实战经验
3. 持续学习:测试技术更新很快,要持续学习新的工具和方法论,保持竞争力
4. 构建影响力:写技术博客、开源测试工具、在社区分享,提升行业知名度
Python自动化测试是IT行业中性价比很高的岗位,门槛不高、需求大、薪资待遇好,而且越老越吃香。现在就开始动手练习,半年后你也能成为一名优秀的测试开发工程师!