🔧《Pytest跳过测试的艺术:让测试用例学会"偷懒"的正确姿势》幽默指南
🌟 核心原理:测试界的"请假条"系统
🎭 技术剧场:两幕喜剧
第一幕:《霸道测试不想跑》
import pytest
@pytest.mark.skip(reason="今天心情不好") # 测试届的"姨妈假"
def test_import_data():
"""数据导入测试(其实只是不想干活)"""
assert 1 + 1 == 3 # 故意写错反正也不会执行
# 执行效果:
# test_lazy.py::test_import_data SKIPPED (今天心情不好)
编剧笔记:
- 🚨 紧急制动按钮:比Ctrl+C更优雅的终止方式
- 📜 请假必备:没有reason就像请假不写原因(等着被HR追查吧)
- 🤖 钢铁直男:说跳就跳,不带任何商量余地
第二幕:《看人下菜碟的测试》
@pytest.mark.skipif(
not user_is_vip(), # 检测是不是尊贵的VIP
reason="穷X勿扰,VIP专属通道" # 这理由写出来容易挨打
)
def test_exclusive_feature():
"""测试只有充钱才能变强的功能"""
assert make_magic() == "pay_to_win"
参数黑话词典:
装X参数 | 真实含义 | 社畜示例 | 生存技巧 |
---|---|---|---|
条件表达式 | 找借口的能力 | time.localtime().tm_hour < 9 (上午9点前不起床) | 能用lambda绝不用if |
reason | 请假演技 | “生产环境着火啦”(其实只是忘写代码) | 字数越多显得越真实 |
💼 职场生存对照表
摸鱼场景 | 对应代码 | 专业话术 | 实际心理 |
---|---|---|---|
不想改祖传代码 | @pytest.mark.skip | “保持历史稳定性” | “动一下可能会炸” |
环境配置太麻烦 | skipif(not has_docker()) | “确保环境一致性” | “装docker好累啊” |
新功能还没写完 | skipif(True, reason="设计评审中") | “遵循开发流程” | “产品经理又改需求” |
躲避性能测试 | skipif(not is_benchmark_day()) | “专注功能验证” | “我的代码像蜗牛” |
💣 作死行为大赏
-
语法迷惑行为
- 💥 作死写法:
@pytest.jump
(你以为在玩超级玛丽?) - 🧠 正确咒语:"mark.skip"才是正经请假流程
- 💥 作死写法:
-
条件翻车现场
# 年度迷惑行为大奖 @pytest.mark.skipif(1 == 1, reason="因为数学真理") # 这条件永远成立! # 高情商写法 @pytest.mark.skipif(not is_my_birthday(), reason="寿星最大")
-
作用域认知误区
- 试图用装饰器跳过整个模块(醒醒,得每个用例单独写)
- 在fixture里用skip(应该用
pytest.skip()
动态跳楼…哦不,跳过)
🕵️ 侦探技巧:抓出假条伪造者
1. 查看请假记录
pytest -rs # 'r'=查看理由(reason),'s'=抓偷懒(skipped)
2. 集体旷工模板
# conftest.py里的黑暗兵法
def pytest_runtest_setup(item):
if "stress" in item.name and not has_coffee():
pytest.skip("咖啡因不足,拒绝压力测试")
3. 智能偷懒系统
# 自动检测老板距离
def boss_is_near():
return wifi_ssid() == "Boss_5G_Hotspot"
@pytest.mark.skipif(boss_is_near(), reason="老板靠近中,假装在测试")
def test_important():
print("正在努力工作...(假装)")
📅 版本更新生存手册
Pytest年代 | 重大变革 | 摸鱼适应策略 |
---|---|---|
远古时期(3.0前) | 需要额外装请假条插件 | 要么升级要么多装个包 |
工业革命(5.0) | 取消直接@pytest.skip | 记住一定要走mark人力资源部 |
赛博时代(7.0+) | reason变成必填项 | 请假理由要编得更认真 |
💡 专业建议:把这套"偷懒"技术写到pytest.ini
里,让你的测试代码拥有带薪年假般的优雅~
🤖 当Allure遇上Fixture:测试报告的艺术与科学
作为一名曾因测试报告被项目经理"追杀"的程序员,我想分享如何用Allure和Fixture打造让老板点头的自动化测试报告——毕竟,好看的报告是通往加薪的捷径!
🛠️ 环境搭建:从"秃头"到"秀发"
1. Allure安装:优雅如喝下午茶
# 先确保你安装了pytest和allure-pytest
pip install pytest allure-pytest
# 验证安装是否成功(别像我第一次输错命令)
pytest --version # 应该输出类似 7.1.2
allure --version # 应该输出类似 2.18.1
避坑指南:
- 如果报"allure不是内部命令",可能是你把环境变量配到了"用户变量"而不是"系统变量"(别问我怎么知道的)
- 路径中有空格?比如"C:\Program Files\allure"?恭喜你获得一个周末debug大礼包!
2. Java环境:老古董也有春天
# 假装这是一段检查Java版本的代码
import subprocess
def check_java():
try:
result = subprocess.run(['java', '-version'],
stderr=subprocess.PIPE,
text=True)
print("你的Java版本是:", result.stderr.split('\n')[0])
except FileNotFoundError:
print("Java未安装!快去Oracle官网下载JDK8")
职场生存技巧:
当项目经理问"为什么环境还没好"时,你可以优雅地说:“我在等待Oracle的注册验证邮件”(实际上你正在刷微博)
🎨 Fixture与Allure的"罗曼史"
基础版Fixture - 像写情书一样写测试
import pytest
import allure
@pytest.fixture
def login_setup():
with allure.step("准备登录数据"):
user = {"username": "test_user", "password": "123456"}
yield user
with allure.step("清理登录痕迹"):
print("假装这里清理了cookie")
@allure.feature("登录模块")
def test_login(login_setup):
with allure.step("输入用户名密码"):
print(f"正在使用{login_setup['username']}登录")
with allure.step("点击登录按钮"):
# 假装点击了登录按钮
assert True
with allure.step("验证登录成功"):
allure.attach("登录成功截图", "假装这是截图二进制数据", allure.attachment_type.PNG)
高阶玩法 - 给你的报告加点"特效"
import random
@pytest.fixture(scope="module")
def db_connection():
with allure.step("建立数据库连接"):
print("假装连接了数据库")
yield "active_connection"
with allure.step("关闭数据库连接"):
print("假装关闭了连接")
@allure.feature("数据库测试")
@allure.story("CRUD操作")
class TestDatabase:
@allure.severity(allure.severity_level.CRITICAL)
@allure.title("测试数据插入")
def test_insert(self, db_connection):
with allure.step("生成测试数据"):
test_data = {"id": random.randint(1000, 9999)}
with allure.step("执行插入操作"):
allure.attach(str(test_data), "插入的数据", allure.attachment_type.TEXT)
assert db_connection == "active_connection"
@allure.severity(allure.severity_level.NORMAL)
@allure.title("测试数据查询")
def test_query(self, db_connection):
with allure.step("执行查询操作"):
result = ["数据1", "数据2"]
allure.attach('\n'.join(result), "查询结果", allure.attachment_type.TEXT)
assert len(result) > 0
📊 生成报告:让数据讲故事
运行测试并生成报告:
pytest --alluredir=./allure_results
allure serve ./allure_results
报告解读技巧:
- 绿色的勾:发给老板看
- 红色的叉:凌晨3点偷偷修复
- 黄色的感叹号:假装是测试环境问题
💡 职场加分项
-
给报告加点"人情味":
@allure.epic("电商系统测试") @allure.feature("购物车模块") @allure.story("用户添加商品到购物车") @allure.description(""" 这是一个非常复杂的测试案例,涉及到: - 用户登录状态检查 - 商品库存验证 - 购物车容量限制 我花了3天时间才写出这个测试,求加薪! """) def test_add_to_cart(): pass
-
失败时自动截图(需要配合Selenium等UI自动化工具):
@pytest.fixture def browser(request): driver = webdriver.Chrome() yield driver if request.node.rep_call.failed: allure.attach(driver.get_screenshot_as_png(), name="失败截图", attachment_type=allure.attachment_type.PNG) driver.quit()
🎯 考试重点(老板关心啥)
-
Allure报告三要素:
- 步骤清晰(用
with allure.step
) - 附件丰富(截图、日志、数据)
- 分类明确(Feature/Story/Epic)
- 步骤清晰(用
-
Fixture使用原则:
- 作用域越小越好(function < class < module < session)
- 不要在一个fixture里做太多事(像极了不要把所有功能写在一个函数里)
-
环境问题终极甩锅指南:
try: 执行测试() except Exception as e: allure.attach("错误日志", str(e), allure.attachment_type.TEXT) pytest.skip(f"跳过测试,因为环境问题:{str(e)}")
记住,好的测试报告就像好的简历——要让看的人快速找到重点,同时隐藏你的不足(比如那个凌晨3点偷偷修复的bug)。现在,去生成让团队惊艳的Allure报告吧!