软件测试学习笔记丨Pytest的使用

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22158

1. 简介

  • pytest是一个成熟的全功能python测试框架
  • 测试用例的skip和xfail,自动失败重试等处理
  • 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试,接口自动化测试
  • pytest有很多第三方插件,并且可以自定义扩展,如pytest-allure(完美html测试报告生成)等

2. 测试文件:

  • test_*py *_test.py

用例识别

  • 测试方法都要以test开头
  • 测试类中不要添加__init__方法
  • Test*类包含的所有test_*的方法 (测试类不能带有_init_方法)
  • 不在class中的所有test_*方法

安装:

bash 复制代码
pip install pytest

示例:

bash 复制代码
def inc(x):
        return x + 1
     
    def test_answer():
        assert inc(3) == 5

在pycharm中运行pytest

python 复制代码
import pytest
     
    def func(x):
        return x+1
     
    def test_answer():                #使用pytest解释器执行,pytest test_a.py
        assert func(4)==5
     
    class TestDemo:         #测试类
        def test_a(self):       #测试方法,以test开头
            print('a')
        def test_b(self):
            print('b')
        def c(self):            #没有以test开头,虽然在测试类中,但不会执行
            print('c')
     
    if __name__ == '__main__':            #使用python解释器运行,入口函数
        pytest.main(['test_a.py::TestDemo','-v'])       
        #使用python运行的话,参数要在列表里增加
        #指定文件名::方法名调用,-v显示详细日志

pytest的框架结构

python 复制代码
# 模块级:模块始末,全局(优先级最高)    (setup_module/teardown_module)
    # 函数级:只对函数用例生效(不在类中)    (setup_function/teardown_function)
    # 类级:只在类中前后运行一次        (setup_class/teardown_class)
    # 方法级:开始于方法的始末 ( 在类中 )    (setup_method/teardown_method)
    # 类里的运行在调用方法的前后  (setup/teardown)
     
    import pytest                执行步骤
    def setup_module():
        print("这是一个setup_module方法")          1
     
    def teardown_module():            11
        print("这是teardown_module方法")
     
    def setup_function():            2
        print("setup_function")
     
    def teardown_function():            4
        print("teardown_function")
     
    def test_login():                3
        print("这是一个外部的方法")
     
    class testDemo():                类开始
        def setup_class(self):            5
            print("setup_class")
     
        def setup_method(self):            6
            print("setup_method")
     
        def setup(self):                7
            print("setup")
     
        def teardown_class(self):            10
            print("teardown_class")
     
        def teardown_method(self):            9
            print("teardown_method")
     
        def teardown(self):            8
            print("teardown")
  • setup代表在每一个测试函数前执行
  • teardown代表在每一个测试函数后执行

3. 参数化

  • mark是pytest内置的标签,可以处理一些特殊的测试用例
python 复制代码
#pytest参数化,通过参数化的方法,生成多条测试用例
    import pytest
    # 1.参数化的名字,要与方法中的参数名一一对应
    # 2. 如果传递多个参数的话,要放在列表中,列表中可以嵌套列表/元组
    # 3. 可以通过ids参数设定测试用例名称,而且ids设置的个数要与传递数据个数一致
    @pytest.mark.parametrize("test_input,expected",[
        ("3+5",8),
        ("6+6",12),
        ("2+3",5)
    ],ids=["num1","num2",'num3'])
    def test_mark(test_input,expected):
        assert eval(test_input) == expected

4. 标记测试用例:对于只执行某些符合要求的测试用例的场景中使用

实现:在测试用例方法上加@pytest.mark.标签名

执行:-m 执行自定义标记的相关用例

  • pytest -s test_mark.py -m apptest
  • pytest -s test_mark.py -m=webtest
  • pytest -s test_mark.py -m "not ios" #使用逻辑运算符的情况

注意:在执行测试用例的时候,会抛出警告,主要是因为自定义的标签名并没有被pytest识别导致的,可以创建一个名为pytest.ini的文件,在里面写入如下格式解决:

python 复制代码
[pytest]
markers = str
          bignum
          float
          int
          minus
          zero

根据实际情况自行更改

5. 跳过,预期失败用例的设置

  • skip - 始终跳过该测试用例
  • skipif - 遇到特定情况跳过该测试用例
  • xfail - 遇到特定情况,产生一个期望失败输出

skip应用场景

  • 调试时不想运行某个测试用例
  • 标记无法中某些平台运行的测试功能
  • 在某些版本中执行,其他版本跳过

方法1:添加装饰器

@pytest.mark.skip
@pytest.mark.skipif

python 复制代码
a = True
    @pytest.mark.skipif(a,reason="跳过")
    def test_a():
        print(a)
    #skipif第一个参数是表达式,满足这个表达式的测试用例不会执行,后面必须指定原因reason(字符串)。

xfail

与skip类似,预期结果为fail,标记用例为fail。

  • 用法:添加装饰器@pytest.mark.xfail
python 复制代码
def test_xfail():
        print("开始测试")
        # 代码内加入跳过,下面的代码不会被执行
        pytest.xfail(reason="跳过测试用例")
        print('执行测试用例')
        assert 1==1

注意:加了xfail装饰器的测试用例还是会执行,但是不会标红,会当作预期失败的用例执行

6. 命令行方式运行多条测试用例

  • 执行包下所有的用例:pytest/py.test 包名
  • 执行单独一个pytest模块:pytest 文件名.py
  • 运行某个模块里面的某个类:pytest 文件名::类名
  • 运行某个模块里某个类的方法:pytest 文件名.py::类名::方法名

常用命令行参数:

python 复制代码
-v  打印详细日志(一般vs一起用)
 -s 打印输出日志
 -x 用例一旦失败(fail/error)就立刻停止执行
 --maxfail=num 失败用例达到峰值立刻停止
 -m 标记测试用例
 -k 执行包含某个关键字的测试用例
 -collect-only (测试平台,pytest自动导入功能)
 --lf    只重新执行上一次故障的测试用例,如果上一次没有失败的用例,将会执行所有测试用例
 --ff    先运行失败的测试用例,再运行其他的用例

pytest的异常处理方法:pytest.raise()

  • 可以捕获特定的异常
  • 获取捕获的异常细节(异常类型,异常信息)
  • 发生异常,后面的代码将不会执行

方法的第一个参数是捕获的预期异常,如果指定多个异常,可以用元组包起来。

推荐学习

【霍格沃兹测试开发】7天软件测试快速入门带你从零基础/转行/小白/就业/测试用例设计实战

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (上集)

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (下集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(上集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(下集)

【霍格沃兹测试开发】精品课合集/ 自动化测试/ 性能测试/ 精准测试/ 测试左移/ 测试右移/ 人工智能测试

【霍格沃兹测试开发】腾讯/ 百度/ 阿里/ 字节测试专家技术沙龙分享合集/ 精准化测试/ 流量回放/Diff

【霍格沃兹测试开发】Pytest 用例结构/ 编写规范 / 免费分享

【霍格沃兹测试开发】JMeter 实时性能监控平台/ 数据分析展示系统Grafana/Docker 安装

【霍格沃兹测试开发】接口自动化测试的场景有哪些?为什么要做接口自动化测试?如何一键生成测试报告?

【霍格沃兹测试开发】面试技巧指导/ 测试开发能力评级/1V1 模拟面试实战/ 冲刺年薪百万!

【霍格沃兹测试开发】腾讯软件测试能力评级标准/ 要评级表格的联系我

【霍格沃兹测试开发】Pytest 与Allure2 一键生成测试报告/ 测试用例断言/ 数据驱动/ 参数化

【霍格沃兹测试开发】App 功能测试实战快速入门/adb 常用命令/adb 压力测试

【霍格沃兹测试开发】阿里/ 百度/ 腾讯/ 滴滴/ 字节/ 一线大厂面试真题讲解,卷完拿高薪Offer !

【霍格沃兹测试开发】App自动化测试零基础快速入门/Appium/自动化用例录制/参数配置

【霍格沃兹测试开发】如何用Postman 做接口测试,从入门到实战/ 接口抓包(最新最全教程)

相关推荐
无心水10 分钟前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd24 分钟前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Zhao-Jichao4 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李4 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga5 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd5 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白7 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李7 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
测试界的小码农7 小时前
【让 AI 生成的测试用例变成 pytest API 自动化脚本】
人工智能·测试用例·pytest
Zhao-Jichao9 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记