自动化框架pytest(1)
文章目录
- 1 安装
- 2 用例运行规则
- 3. pytest命令参数
- 4. pytest配置文件
- 5. 前后置
- 6. 断言
- 7. 参数化
pytest 是⼀个非常流行且高效的Python测试框架,它提供了丰富的功能和灵活的用法,使得编写和运行测试用例变得简单而高效
1 安装
pip install pytest==8.3.2
2 用例运行规则
- 文件名以test_开头或_test结尾
test01 文件名不规范 不会执行里面的测试用例
- 测试类以Test开头, 并且不能有 __init__方法。
类的初始化方法: __init__
由于 pytest 的测试收集机制,测试类中不可以定义 __ init __ 方法。 pytest 采用自动发现机制来收集测试用例。它会自动实例化测试类并调用其所有以 test 结尾的方法作为测试用例。如果测试类中定义了 __ init __ 方法,那么当 pytest 实例化该类时, __ init __ 方法会被调用,这可能会掩盖测试类的实际测试逻辑,并引⼊额外的副作用,影响测试结果的准确性。
若测试类中存在初始化操作该采取什么⽅案?
为了避免使用 __ init __ 方法,建议在 pytest 中使用其他替代方案,如使用setUp() 和tearDown() 方法、使用类属性、使用 fixture 函数(具体使用后续会讲解)
- 测试方法以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() #断言整个返回值jsonassert 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 == expecteddef 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 == expectedclass Test_2:def test1(self, n, expected):assert n + 1 == expecteddef 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