软件测试入门到精通-第9周-接口自动化测试-fixture实现测试控制+集成allure

《Pytest跳过测试的艺术:让测试用例学会"偷懒"的正确姿势》幽默指南


核心原理:测试界的"请假条"系统
想偷懒
批准
条件批准
测试用例
举手申请
HR审批(@pytest.mark)
带薪休假skip
弹性办公skipif
提交证明文件

技术剧场:两幕喜剧

第一幕:《霸道测试不想跑》

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()) “专注功能验证” “我的代码像蜗牛”

作死行为大赏
  1. 语法迷惑行为

    • 作死写法:@pytest.jump(你以为在玩超级玛丽?)
    • 正确咒语:"mark.skip"才是正经请假流程
  2. 条件翻车现场

    # 年度迷惑行为大奖
    @pytest.mark.skipif(1 == 1, reason="因为数学真理")  # 这条件永远成立!
    
    # 高情商写法
    @pytest.mark.skipif(not is_my_birthday(), reason="寿星最大")
    
  3. 作用域认知误区

    • 试图用装饰器跳过整个模块(醒醒,得每个用例单独写)
    • 在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点偷偷修复
  • 黄色的感叹号:假装是测试环境问题

职场加分项

  1. 给报告加点"人情味"

    @allure.epic("电商系统测试")
    @allure.feature("购物车模块")
    @allure.story("用户添加商品到购物车")
    @allure.description("""
    这是一个非常复杂的测试案例,涉及到:
    - 用户登录状态检查
    - 商品库存验证
    - 购物车容量限制
    我花了3天时间才写出这个测试,求加薪!
    """)
    def test_add_to_cart():
        pass
    
  2. 失败时自动截图(需要配合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()
    

考试重点(老板关心啥)

  1. Allure报告三要素

    • 步骤清晰(用with allure.step
    • 附件丰富(截图、日志、数据)
    • 分类明确(Feature/Story/Epic)
  2. Fixture使用原则

    • 作用域越小越好(function < class < module < session)
    • 不要在一个fixture里做太多事(像极了不要把所有功能写在一个函数里)
  3. 环境问题终极甩锅指南

    try:
        执行测试()
    except Exception as e:
        allure.attach("错误日志", str(e), allure.attachment_type.TEXT)
        pytest.skip(f"跳过测试,因为环境问题:{str(e)}")
    

记住,好的测试报告就像好的简历——要让看的人快速找到重点,同时隐藏你的不足(比如那个凌晨3点偷偷修复的bug)。现在,去生成让团队惊艳的Allure报告吧!

你可能感兴趣的:(软件测试入门到精通,python,功能测试)