画布 1
pytest 学习路线
  Pytest 测试框架-L1
    Pytest 简介、安装与准备
      命令行：pip install -U pytest
    Pytest 命名规则
      文件 test_ 开头 或者 _test 结尾
      类 Test 开头
      方法 test_ 开头
    pycharm 配置与界面化运行
      Pycharm 界面化安装 Pytest
      Pycharm 默认测试执行器为 Pytest
        1. 进入 Tools->Python Intergrated Tools
        2. 选择 Default test runner 为 pytest
    Pytest 测试用例结构
      用例名称
        nodeid
      用例步骤
      用例断言
    Pytest 测试用例断言
      assert <表达式>
      assert <表达式>,<描述>
    Pytest 测试框架结构（测试装置）
      模块级(setup_module/teardown_module)模块始末，全局的（优先最高）
      函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
      类级(setup_class/teardown_class)只在类中前后运行一次（在类中） （重点）
      方法级(setup_method/teardown_methond)开始于方法始末（在类中）
      类里面的（setup/teardown）运行在调用方法的前后（重点）
  Pytest 测试框架-L2
    Pytest 参数化用例
      参数化：@pytest.mark.parametrize
        参数化装饰函数
        ids参数增加可读性
    Pytest 标记测试用例
      添加标签
        @pytest.mark.标签名
      执行某个标签的用例
        pytest -m=标签名
    Pytest 设置跳过、预期失败用例
      跳过(Skip)
        添加装饰器
          @pytest.mark.skip
          @pytest.mark.skipif
        代码中添加
          pytest.skip(reason)
      预期失败(xFail)
        添加装饰器
          @pytest.mark.xfail
    Pytest 运行用例
      运行用例
        执行包下所有的用例：`pytest/py.test [包名]`
        执行单独一个 pytest 模块：`pytest 文件名.py`
        运行某个模块里面某个类：`pytest 文件名.py::类名`
        运行某个模块里面某个类里面的方法：`pytest 文件名.py::类名::方法名`
      运行结果
        pass
        fail
        error
        warning
        deselect
    Pytest 测试用例调度与运行
      只重新运行故障
        --lf
          （--last-failed）
      先运行故障然后再运行其余的测试
        --ff
          （--failed-first）
    Pytest 命令行常用参数
      —help
      -x 用例一旦失败(fail/error)，就立刻停止执行
      --maxfail=num 用例达到
      -m 标记用例
      -k 执行包含某个关键字的测试用例
      -v 打印详细日志
      -s 打印输出日志（一般-vs一块儿使用）
      —collect-only（测试平台，pytest 自动导入功能 ）
    Python 执行 Pytest
      使用 main 函数
      使用 python -m pytest 调用 pytest
        jenkins 持续集成用到
      Python 代码执行 pytest.main()
    Pytest 异常处理
      try...except
      pytest.raises()
  Pytest 测试框架-L3
    Pytest 结合数据驱动-yaml
      yaml 基本语法
        大小写敏感
        使用缩进表示层级关系
        缩进不允许使用tab，只允许空格
        缩进的空格数不重要，只要相同层级的元素左对齐即可
        '#'表示注释
      数据类型
        对象：键值对的集合，又称为映射（mapping）/ 哈希（hashes） / 字典（dictionary）
        数组：一组按次序排列的值，又称为序列（sequence） / 列表（list）
        纯量（scalars）：单个的、不可再分的值
      yaml 对象
        字典
        列表
      python 操作yaml 需要安装 pyyaml
        yaml.safe_load()
        yaml.safe_dump()
    Pytest 结合数据驱动-excel
      使用 openpyxl 第三方库
        获取工作簿
          book = openpyxl.load_workbook()
        读取工作表
          sheet = book.active
        读取单个单元格
          sheet['A1']
          sheet.cell(column=1, row=3)
        读取多个连续单元格
          sheet["A1":"C3"]
        获取单元格的值
          cell_a1.value
    Pytest 结合数据驱动-csv
      使用内置库 csv
        with open('demo.csv', 'r') as file:
raw = csv.reader(file)
    Pytest 结合数据驱动-json
      使用内置库 json
        json.loads()
        json.dumps()
    Pytest 测试用例生命周期管理
      1、pytest fixture的作用
      调用方法
        直接通过函数名字调⽤
        使用装饰器
          @pytest.mark.usefixtures('test1')
      允许使用多个 fixture
      使用 autouse 自动应用，如果要返回值，需要传fixture 函数名
      作用域（session>module>class>function）
      conftest.py 进行数据共享
    Pytest fixture 实现参数化
      @pytest.fixture(params=[1, 2, 3, 'linda'])
      ⽅法参数写 request
      方法体里面使用 request.param 接收参数
  Pytest 测试框架-L4
    Pytest 配置文件
      [pytest]
markers 自定义mark 标签名
addopts 运行时参数（可添加多个命令行参数，空格分隔，所有参数与命令行一致）
python_files 自定义测试文件命名规则
python_classes = Test_* 自定义测试类命名规则
python_functions= test_* check_* 自定义测试方法命名规则
testpaths = bilibili baidu
norecursedirs = result logs datas test_demo* 运行时忽略某些文件夹
    Pytest 插件
      外部插件：pip install 安装的插件
      本地插件：pytest 自动模块发现机制（conftest.py 存放的）
      内置插件：代码内部的 \_pytest 目录加载
    Pytest 测试用例执行顺序自定义 Pytest-ordering
      安装
        pip install pytest-ordering
      用法
        @pytest.mark.run(order=2)
    Pytest 测试用例并行运行与分布式运行
      安装
        pip install pytest-xdist
    Pytest 内置插件 hook 体系
      勾子函数
        名字固定
        会被自动执行
        使用时直接编写函数体
    Pytest 插件开发
      收集上来的测试用例实现定制化功能
        pytest_collection_modifyitems
      解决问题
        自定义用例的执行顺序
        解决中文的测试用例名称编码问题
        自动添加标签
      打包发布
  Pytest 测试框架应用
    【后续课程】自动化测试（app/web/接口）及数据驱动
    pytest 结合Jenkins 集成allure 报告并根据错误率发送邮件实现持续集成
  Allure 测试报告
    Allure2 安装
      依赖
        Java环境
      本地安装
        先下载 Allure 源码包到本地
        解压后将 bin 目录加入 PATH 环境变量
      安装 python 插件
        pip install allure-pytest
      环境验证
        allure --version
    在测试执行期间收集结果
      pytest [测试用例/模块/包] --alluredir=./result/
    生成在线的测试报告
      allure serve ./result
    生成报告
      allure generate ./result
    打开报告
      allure open ./report/
    生成报告，指定输出路径，清理报告
      allure generate ./result -o ./report --clean
    Allure 用法
      epic 描述
        @allure.epic()
      模块名称
        @allure.feature()
      用户故事
        @allure.story()
      用例的标题
        @allure.title(用例的标题)
      测试用例的链接地址
        @allure.testcase()
      缺陷的链接地址
        @allure.issue()
      用例描述
        @allure.description()
      用例等级
        @allure.severity()
      链接
        @allure.link()
      附件
        @allure.attachment()
          日志
            在测试报告中使用 `logger` 对象生成对应级别的日志
          图片
            allure.attach.file("pic.png",
name="图片",
attachment_type=allure.attachment_type.PNG,
extension="png")
          视频
            allure.attach.file("xxx.mp4",
name="视频",
attachment_type=allure.attachment_type.MP4,
extension="mp4")
          网页
            allure.attach('<head></head><body> a page </body>',
'附件是HTML类型',
allure.attachment_type.HTML)
      用例步骤
        @allure.step
        with allure.step()
      用例标签
        @pytest.xfail()
        @pytest.skipif()