自动化框架pytest(1)

发布于:2025-08-18 ⋅ 阅读:(10) ⋅ 点赞:(0)


pytest 是⼀个非常流行且高效的Python测试框架,它提供了丰富的功能和灵活的用法,使得编写和运行测试用例变得简单而高效

1 安装
pip install pytest==8.3.2

在这里插入图片描述

2 用例运行规则
  1. 文件名以test_开头或_test结尾

在这里插入图片描述
test01 文件名不规范 不会执行里面的测试用例

  1. 测试类以Test开头, 并且不能有 __init__方法。

在这里插入图片描述
类的初始化方法: __init__
由于 pytest 的测试收集机制,测试类中不可以定义 __ init __ 方法。 pytest 采用自动发现机制来收集测试用例。它会自动实例化测试类并调用其所有以 test 结尾的方法作为测试用例。如果测试类中定义了 __ init __ 方法,那么当 pytest 实例化该类时, __ init __ 方法会被调用,这可能会掩盖测试类的实际测试逻辑,并引⼊额外的副作用,影响测试结果的准确性。
若测试类中存在初始化操作该采取什么⽅案?
为了避免使用 __ init __ 方法,建议在 pytest 中使用其他替代方案,如使用setUp() 和tearDown() 方法、使用类属性、使用 fixture 函数(具体使用后续会讲解)

  1. 测试方法以test开头

在这里插入图片描述

3. pytest命令参数

pytest 提供了丰富的命令行选项来控制测试的执行。以下是⼀些常用的 pytest 命令行参数及其
使用说明。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4. pytest配置文件

在当前项目下创建pytest.ini文件,该文件为 pytest 的配置文件,以下为常见的配置选项:
在这里插入图片描述
在这里插入图片描述

5. 前后置

三种实现方式:

方法类型 作用范围 执行时机说明
setup_method/teardown_method 每个测试方法 每个test_方法前后各执行一次
setup_class/teardown_class 整个测试类 类中第一个测试开始前/最后一个测试结束后执行
Fixture 自定义作用域 根据scope参数控制

在这里插入图片描述
在这里插入图片描述

6. 断言

断言( assert )是⼀种调试辅助工具,用于检查程序的状态是否符合预期。如果断言失败(即条件
为假),Python解释器将抛出⼀个 AssertionError 异常。断言通常用于检测程序中的逻辑错误。
pytest 允许你在 Python 测试中使用标准的 Python assert 语句来验证预期和值。

assert 条件, 错误信息

#断⾔整数
a = 1
b = 2
assert a == b

#断⾔字符串
str = "hello"
assert "hello" == str

# 断⾔列表
expect_list = [1, 'apple', 3.14]
actual_list = [1, 'apple', 3.14]
# 断⾔元组
expect_tuple = (1, 'apple', 3.14)
actual_tuple = (1, 'apple', 3.14)
# 断⾔字典
expect_dict = {'name': 'Alice', 'age': 25}
actual_dict = {'name': 'Alice', 'age': 25}
# 断⾔集合
expect_set = {1, 2, 3, 'apple'}
actual_set = {1, 2, 3, 'apple'}
assert expect_list == actual_list
assert expect_tuple == actual_tuple
assert expect_dict == actual_dict
assert expect_set == actual_set

json接口返回值断言:

class Test_case2:
    def test(self):
        url = "https://jsonplaceholder.typicode.com/posts/1"
        r = requests.get(url=url)
        data = {
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
        assert data == r.json() #断言整个返回值json
        assert r.json()["id"] == 1 #断言返回值json的某个字段

在这里插入图片描述

html接口返回值断言:

 def test2(self):
        url = "https://jsonplaceholder.typicode.com/"
        r = requests.get(url=url)
        text = "{JSON} Placeholder"
        assert text in r.text

在这里插入图片描述

7. 参数化

参数化设计是自动化设计中的⼀个重要组成部分,它通过定义设计参数和规则,使得设计过程更加灵活和可控。
pytest中内置的 pytest.mark.parametrize 装饰器允许对测试函数的参数进行参数化。

示例1:在用例上使用参数化

    @pytest.mark.parametrize("test_input, expected", [("3+5", 8), ("5+8", 13)])
    def test3(self, test_input, expected):
        assert eval(test_input) == expected

在这里插入图片描述
示例2:在类上使用参数化

@pytest.mark.parametrize("n, expected", [(1, 2), (3, 4)])
class Test_2:
    def test1(self, n, expected):
        assert n + 1 == expected

    def test2(self, n, expected):
        assert n * 1 + 1 == expected

在这里插入图片描述
要对模块中的所有测试进行参数化,你可以将pytestmark全局变量赋值:

pytestmark = pytest.mark.parametrize("n, expected", [(1, 2), (3, 4)])
class Test_case2:
    def test3(self, n, expected):
        assert n + 1 == expected

class Test_2:
    def test1(self, n, expected):
        assert n + 1 == expected

    def test2(self, n, expected):
        assert n * 1 + 1 == expected

在这里插入图片描述
除了使用 @parametrize 添加参数化外, pytest.fixture() 允许对 fixture 函数进行参数化。

示例3:自定义参数化数据源

def data_provider():
return ["a", "b"]
# 定义⼀个测试函数,它依赖于上⾯函数的返回值
@pytest.mark.parametrize("data", data_provider())
def test_data(data):
assert data != None

网站公告

今日签到

点亮在社区的每一天
去签到