pytest +requests封装+logger封装
时间: 2023-09-06 19:03:55 浏览: 133
pytest是一种Python的测试框架,能够简化测试用例的编写、执行和结果分析。它基于Python的assert语句,提供了丰富的断言功能,方便测试人员编写高效、可靠的测试代码。
requests是Python中一个流行的HTTP库,提供了简洁易用的接口,用于发送HTTP请求和处理响应。通过requests库,我们可以方便地与网站进行交互,发送GET/POST请求,登录,上传文件等操作。
在测试过程中,我们通常需要判断请求的返回结果是否符合预期,并记录相关的日志信息。使用pytest框架结合requests库,可以实现对接口进行自动化测试以及生成详细的测试报告。
为了更好地管理日志输出,我会对requests库进行封装,在发送请求前后分别记录请求的URL、请求方法、请求参数、请求头部信息、响应状态码等,以及异常情况的日志记录。这样可以方便地追踪接口的调用和异常情况的处理。
另外,我也会对pytest框架进行封装,将常用的测试步骤和断言封装为函数或装饰器,便于重复使用。同时,将测试结果输出到日志文件中,记录测试用例、测试结果等相关信息。
通过对pytest和requests的封装,我们可以更加高效地进行接口测试,提高测试代码的可读性和可维护性。同时,日志的记录和输出也方便了测试人员进行问题定位和分析,进一步提升了测试工作的效率和质量。
相关问题
给我一个python+pytest+allure 打造接口自动化pom框架
好的,下面是一个简单的 Python + Pytest + Allure 实现接口自动化 POM 框架的示例:
1. 安装依赖库
```
pip install requests
pip install pytest
pip install allure-pytest
```
2. 创建项目目录结构:
```
├── api
│ ├── __init__.py
│ ├── base_api.py
│ └── user_api.py
├── common
│ ├── __init__.py
│ ├── constants.py
│ ├── logger.py
│ └── utils.py
├── config
│ ├── __init__.py
│ └── config.py
├── data
│ ├── __init__.py
│ └── users.json
├── pytest.ini
├── README.md
├── requirements.txt
├── testcases
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_login.py
│ └── test_user.py
└── pytest.ini
```
3. 编写配置文件 `config.py`、常量文件 `constants.py` 等。
`config.py`:
```python
class Config:
API_BASE_URL = 'https://xxx.com/api'
USERNAME = 'testuser'
PASSWORD = 'testpass'
```
`constants.py`:
```python
class StatusCode:
SUCCESS = 200
CLIENT_ERROR = 400
SERVER_ERROR = 500
```
4. 创建 HTTP 请求封装类 `base_api.py` 和业务接口类 `user_api.py`
`base_api.py`:
```python
import requests
from common.logger import logger
from common.constants import StatusCode
from config.config import Config
class BaseApi:
def __init__(self):
self.session = requests.session()
self.base_url = Config.API_BASE_URL
def request(self, method, url, **kwargs):
url = self.base_url + url
response = self.session.request(method, url, **kwargs)
logger.info(f'{method} {url} {kwargs} response: {response.json()}')
return response
def get(self, url, params=None, **kwargs):
return self.request('get', url, params=params, **kwargs)
def post(self, url, data=None, json=None, **kwargs):
return self.request('post', url, data=data, json=json, **kwargs)
def put(self, url, data=None, **kwargs):
return self.request('put', url, data=data, **kwargs)
def delete(self, url, **kwargs):
return self.request('delete', url, **kwargs)
def assert_status_code(self, response, expected_status_code):
assert response.status_code == expected_status_code, \
f'Expected status code is {expected_status_code}, but actual is {response.status_code}'
response_json = response.json()
assert response_json['code'] == StatusCode.SUCCESS, \
f'Response code is {response_json["code"]}, message is {response_json["message"]}'
```
`user_api.py`:
```python
from api.base_api import BaseApi
from common.constants import StatusCode
from config.config import Config
from common.utils import json_load
class UserApi(BaseApi):
def __init__(self):
super().__init__()
def login(self):
url = '/login'
data = {
'username': Config.USERNAME,
'password': Config.PASSWORD
}
response = self.post(url, json=data)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']['access_token']
def get_user_info(self, user_id):
url = f'/users/{user_id}'
headers = {
'Authorization': f'Bearer {self.login()}'
}
response = self.get(url, headers=headers)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']
def create_user(self, data):
url = '/users'
headers = {
'Authorization': f'Bearer {self.login()}'
}
response = self.post(url, json=data, headers=headers)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']
def delete_user(self, user_id):
url = f'/users/{user_id}'
headers = {
'Authorization': f'Bearer {self.login()}'
}
response = self.delete(url, headers=headers)
self.assert_status_code(response, StatusCode.SUCCESS)
return response.json()['data']
def get_random_user(self):
users = json_load('data/users.json')
return users[0]
```
5. 编写测试用例 `test_user.py` 和 `test_login.py`
`test_user.py`:
```python
import pytest
from api.user_api import UserApi
class TestUser:
@pytest.fixture(scope='class')
def user(self):
return UserApi().get_random_user()
def test_create_and_delete_user(self, user):
user_api = UserApi()
new_user = user_api.create_user(user)
assert new_user['username'] == user['username']
user_api.delete_user(new_user['id'])
def test_get_user_info(self):
user_api = UserApi()
user_info = user_api.get_user_info(1)
assert user_info['username'] == 'admin'
```
`test_login.py`:
```python
import pytest
from api.user_api import UserApi
class TestLogin:
def test_login(self):
user_api = UserApi()
access_token = user_api.login()
assert access_token is not None
```
6. 运行测试用例
在项目根目录下执行以下命令:
```
pytest --alluredir=./allure-results testcases/
```
7. 生成报告
在项目根目录下执行以下命令:
```
allure serve ./allure-results
```
此时会启动一个本地服务,打开浏览器输入 `http://localhost:port` 即可查看测试报告。
以上就是一个简单的 Python + Pytest + Allure 实现接口自动化 POM 框架的示例,希望对你有帮助。
python requests框架
Python的requests框架是一个流行的HTTP库,用于发送HTTP请求和处理HTTP响应。它在接口自动化测试中被广泛使用,可以帮助我们构建简单且高效的测试框架。
使用Python和requests构建接口自动化测试框架的关键是合理设计框架结构和实现关键功能。一个简单的框架结构示例可以包括以下组件:
- api_tests/:存放接口测试用例的目录
- base.py:基础测试类,提供一些公共方法和属性
- conftest.py:配置测试环境的文件
- testcases/:存放具体的测试用例文件的目录
- test_login.py:登录接口相关的测试用例
- test_order.py:订单接口相关的测试用例
- utils/:存放一些工具类和方法的目录
- config.py:配置文件,包含接口URL、数据库连接等信息
- logger.py:日志记录类,用于记录测试过程中的日志信息
- request.py:封装请求方法的类,用于发送HTTP请求和处理HTTP响应
在实际应用中,我们可以根据项目需求和团队技能等因素选择适当的工具和方法,以确保测试质量和可持续性。同时,我们可以添加断言、异常处理、测试装置等功能来提高测试用例的可靠性和稳定性。例如,可以使用Pytest框架提供的assert语句来进行断言操作,验证HTTP响应状态码、响应头、响应内容等指标。
阅读全文