python+pytest+request 接口自动化测试

一、环境配置

1.安装python3

brew update 
brew install pyenv 
然后在 .bash_profile 文件中添加 eval “$(pyenv init -)” 
pyenv install 3.5.3 -v
pyenv rehash 安装完成后,更新数据库
pyenv versions  查看目前系统已安装的 Python 版本
pyenv global 3.5.3  切换 Python 版本
python -V,查看 Python 版本

2.安装pytest及其他所需安装包:

pip install -U pytest
pip install -U requests
pip install -U pytest-pythonpath
pip install -U pytest-capturelog
pip install PyYAML
pip install configparser
pip install pyopenssl

二、pytest框架

setup_module(module):  #开始测试前执行一次,目前无实际使用
setup_function(function):  #每个测试用开始前执行一次,用于检查、准备测试环境
teardown_function(function):  #每个测试用例执行完执行一次,用于清除生成的测试数据
teardown_module(module):  #每次测试完成执行一次,用于还原测试环境
@pytest.mark.parametrize(‘mycase’, case.list,ids=case.name)  #装饰器,用来将list格式的测试用例分开执行

pytest.skip("skip testcase: (%s)" % mycase['Name']) #跳过测试用例
pytest.xfail("previous test failed (%s)" % mycase['Name']) #跳过会失败的测试用例

三、测试报告

python -m pytest -s -q   控制台输出每一步结果

1.allure

安装:

sudo pip install pytest-allure-adaptor
brew tap qatools/formulas
brew install allure-commandline

执行:

python -m pytest -s -q --alluredir ./report  #控制台也输出每一步结果
python -m pytest --alluredir ./report  #控制台只输出成功/失败和失败报的错误
allure generate report/ -o report/html  #生成报告,可直接打卡看

2.pytest-html

安装:

sudo pip install pytest-html

执行:

python -m pytest -s -q --html=./report.html  #控制台也输出每一步结果

python -m pytest --html=./report.html #控制台只输出成功/失败和失败报的错误

四、Demo

# coding: utf-8
import pytest
import public
import read_testcase
import record

#获取一个账号token,全局变量
public.getalltoken()
#测试用例实例化
testcase=read_testcase.case()

#所有测试用例开始前执行的文件,只执行一次
def setup_module(module):#每次开始测试执行一次
    print ("setup_module")
#所有测试用例结束后执行的文件,只执行一次
def teardown_module(module):#每次测试完成执行一次
    print ("teardown_module")
#每个测试用开始执行一次
def setup_function(function):
    print ("setup_function")
#每个测试用例执行完执行一次
def teardown_function(function):
    print ("teardown_function")
#装饰器 pytest 整合的测试用例生成多个结果
@pytest.mark.parametrize('mycase', testcase.testcase_list,ids=testcase.testcasename)
def test_all(mycase):
    testcase=mycase['Testcase_name']+str(mycase['Testcase_ID'])+'.'+str(mycase['ID'])+":"+mycase['Name']
    #print(mycase['Name'])
    #pytest.skip("skip testcase: (%s)" % mycase['Name'])
    #pytest.xfail("previous test skip (%s)" % mycase['Name'])
    mycase = public.get_Precondition(mycase)

    #执行接口的测试
    r=public.request_method(mycase)
    try:
        print(r.status_code)
        print(r.json())
    except Exception as e:
        print(r.content)
        print(e)
    #对返回数据进行断言
    public.assert_method(r, mycase)
    #记录测试用例名称存储log
    record.record_testcase_name(testcase)
    #记录测试时使用的数据
    record.record_testcase_msg(mycase)



  • 3
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是一个简单的 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 框架的示例,希望对你有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值