pytest用例之间数据依赖
时间: 2023-09-13 20:08:24 浏览: 107
在 pytest 中,可以使用 fixtures 来实现用例之间的数据依赖。
例如,有两个测试用例 test_case1 和 test_case2,test_case2 需要使用到 test_case1 的执行结果:
```python
def test_case1():
# 执行测试用例1的代码
result = "test_case1_result"
return result
def test_case2(test_case1):
# 使用 test_case1 的执行结果
assert test_case1 == "test_case1_result"
# 执行测试用例2的代码
```
在 test_case2 中,我们声明了一个参数 test_case1,这个参数名与 test_case1 测试用例的函数名相同。pytest 会自动查找同名的 fixture 函数,并执行它。test_case2 函数中的 assert 语句可以使用 test_case1 的返回值,即 test_case1_result。
这样,我们就可以实现 test_case2 对 test_case1 的数据依赖。注意,test_case1 的返回值将会被缓存,即使有多个测试用例依赖它,它也只会被执行一次。
相关问题
pytest接口用例
### 如何使用 Pytest 编写 API 测试用例
#### 准备工作
为了编写有效的API测试用例,需先安装必要的库。通常情况下会依赖`requests`库来进行HTTP请求操作。
```bash
pip install requests pytest
```
#### 创建简单的 API 测试脚本
创建一个新的 Python 文件作为测试文件,例如 `test_api.py` 。此文件中的函数名应以 test_ 开头以便被 Pytest 自动识别为测试案例[^1]。
#### 实现具体功能的测试用例
下面是一个具体的例子展示如何构建一个针对RESTful风格Web服务GET方法的简单测试:
```python
import requests
def test_get_users_status_code():
response = requests.get('https://jsonplaceholder.typicode.com/users')
assert response.status_code == 200, "Unexpected Response Code"
```
这段代码实现了向指定URL发起 GET 请求并检查 HTTP 响应状态码是否等于预期值 (即成功响应的状态码)[^2]。
对于更复杂的场景,则可以按照如下结构扩展测试逻辑:
1. **声明是测试用例**
定义以 `test_` 开始的方法名称表示这是一个测试单元。
2. **调用要测试的接口**
利用 `requests` 库发送各种类型的 HTTP 请求给目标服务器端点。
3. **准备测试数据**
如果需要的话,在这里设置好待传入参数以及期望接收到的结果形式。
4. **断言**
对实际获得的数据同预先设定的标准做比较分析,判断两者之间是否存在差异[^5]。
#### 处理多个测试用例的情况
当面对众多不同需求下的测试情形时,可以通过合理组织目录结构、运用 fixture 或者 parameterize 来简化管理和维护过程[^4]。
例如利用 `@pytest.mark.parametrize()` 装饰器可以让单个测试函数覆盖多种输入组合情况:
```python
@pytest.mark.parametrize("endpoint", [
('/posts'),
('/comments'),
('/albums')
])
def test_check_endpoints(endpoint):
url = f'https://jsonplaceholder.typicode.com{endpoint}'
resp = requests.get(url)
assert resp.ok is True
```
上述实例展示了如何一次性验证多个资源路径的有效性而无需重复书写相似度高的多份独立测试代码片段。
pytest實現用例关联
pytest可以通过fixture和conftest.py文件来实现用例关联。具体方法如下:
1.使用fixture来实现用例关联。fixture是pytest中的一个装饰器,可以用来实现测试用例之间的数据共享和依赖关系。我们可以在conftest.py文件中定义fixture,然后在测试用例中使用fixture来获取数据。例如:
```python
# conftest.py
import pytest
@pytest.fixture
def login():
# 登录操作
return {"username": "testuser", "password": "123456"}
# test_demo.py
def test_case1(login):
# 使用login fixture获取登录信息
assert login["username"] == "testuser"
```
2.使用conftest.py文件来实现用例关联。conftest.py文件可以定义多个fixture,也可以定义多个钩子函数,可以在整个测试目录中共享。我们可以在conftest.py文件中定义一些公共的方法和数据,然后在测试用例中使用。例如:
```python
# conftest.py
def pytest_collection_modifyitems(items):
# 对所有测试用例进行修改
for item in items:
item.name = item.name.encode("utf-8").decode("unicode_escape")
item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")
# test_demo.py
def test_case1():
# 测试用例1
pass
def test_case2():
# 测试用例2
pass
```
3.使用pytest.mark来实现用例关联。pytest.mark是pytest中的一个装饰器,可以用来给测试用例打标记。我们可以在测试用例中使用pytest.mark来打标记,然后在运行测试用例时指定标记来运行指定的测试用例。例如:
```python
# test_demo.py
import pytest
@pytest.mark.login
def test_case1():
# 测试用例1
pass
@pytest.mark.register
def test_case2():
# 测试用例2
pass
```
指定标记运行测试用例的命令为:
```shell
pytest -m login
```
阅读全文