第一幕:《霸道测试不想跑》
import pytest
@pytest.mark.skip(reason="今天心情不好") # 测试届的"姨妈假"
def test_import_data():
"""数据导入测试(其实只是不想干活)"""
assert 1 + 1 == 3 # 故意写错反正也不会执行
# 执行效果:
# test_lazy.py::test_import_data SKIPPED (今天心情不好)
编剧笔记:
第二幕:《看人下菜碟的测试》
@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
(你以为在玩超级玛丽?)条件翻车现场
# 年度迷惑行为大奖
@pytest.mark.skipif(1 == 1, reason="因为数学真理") # 这条件永远成立!
# 高情商写法
@pytest.mark.skipif(not is_my_birthday(), reason="寿星最大")
作用域认知误区
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打造让老板点头的自动化测试报告——毕竟,好看的报告是通往加薪的捷径!
# 先确保你安装了pytest和allure-pytest
pip install pytest allure-pytest
# 验证安装是否成功(别像我第一次输错命令)
pytest --version # 应该输出类似 7.1.2
allure --version # 应该输出类似 2.18.1
避坑指南:
# 假装这是一段检查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的注册验证邮件”(实际上你正在刷微博)
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
报告解读技巧:
给报告加点"人情味":
@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
)Fixture使用原则:
环境问题终极甩锅指南:
try:
执行测试()
except Exception as e:
allure.attach("错误日志", str(e), allure.attachment_type.TEXT)
pytest.skip(f"跳过测试,因为环境问题:{str(e)}")
记住,好的测试报告就像好的简历——要让看的人快速找到重点,同时隐藏你的不足(比如那个凌晨3点偷偷修复的bug)。现在,去生成让团队惊艳的Allure报告吧!