python+requests+Excel+Jenkins接口自动化

python+requests+Excel+Jenkins接口自动化

总结大部分人做接口自动化的流程后,发现基本上都是:python + requests做接口请求;Excel用来存储用例;HTMLTestRunner生成测试报告;Jenkins完成定时任务。

其实在完成这个流程的过程中,代码编写只占用了一小部分的时间,大部分的时间都浪费在搭建环境和用例编写上。这里我记录一些遇到的问题。

一、接口请求
(1)配置请求方法:get 和 post 方法简单封装,header中参数设置

# _*_coding:utf-8 _*
import requests

#get请求
def get(url,querystring):
    headers = requestHeader()
    response = requests.request("GET", url, headers=headers, params=querystring)
    # print response.url
    return response

#post请求
def post(url,payload,querystring):
    headers = requestHeader()
    response = requests.request("POST", url, data=payload, headers=headers, params=querystring)
    # print response.url
    return response

#设置请求的header
def requestHeader():
    headers = {
    'Content-Type': "application/json",
    'Cache-Control': "no-cache"
    }
    return headers

(2)针对post请求的body,开始时使用的时text的dict去请求,请求错误总是返回:"请求参数错误",后来使用postman进行调试,直接复制已经转换成json格式的body传参进行请求,终于成功。

 

WechatIMG12.jpeg

可以通过这个方式去转换一些有问题的body。

(3)body转换为json的另一种方式:通过ast模块进行转换(推荐)

import ast
caseParams      =   ast.literal_eval(caseParams)

(4)通过openpyxl模块获取用例Excel

 

 

#用例名
caseName    =   caseFile.getCellVaule(ws,rowIndex,1)
#url
caseUrl     =   caseFile.getCellVaule(ws,rowIndex,3)
#请求方式
caseMethod  =   caseFile.getCellVaule(ws,rowIndex,4)
#参数
caseParams  =   caseFile.getCellVaule(ws,rowIndex,5)

备注:在获取用例信息的过程中,需要对一些参数进行容错
A:是否有参数,若无参数,需传空;
B:get参数和post body需要分开处理:
get的参数是以 '&param'形式明文拼接在url中;

#将请求参数转换为json格式
caseParams  =   ast.literal_eval(caseParams)
keys        =   dict(caseParams).keys()
values      =   dict(caseParams).values()
for x in xrange(0,len(keys)):
  tempQuery[keys[x]] = values[x]

post的body需要放在dict中进行传参;

caseParams      =   ast.literal_eval(caseParams)

(5)分割所需的参数,将结果写入到文件内

#请求返回的内容,转换为json格式
text            =   json.loads(response.text)
                caseFile.setCellValue(ws,rowIndex,6,response.text)

#URL请求耗时
spendTime       =   response.elapsed.total_seconds()
                caseFile.setCellValue(ws,rowIndex,7,spendTime)

#请求结果状态
statue          =   response.status_code
                caseFile.setCellValue(ws,rowIndex,8,statue)
self.assertEqual(statue, 200)

(6)将请求结果写入html文件,并展示

 

WechatIMG13.jpeg

(7)配置到Jenkins,定时执行查看接口的可达性

学习Python地址:https://ke.qq.com/course/2707042?flowToken=1025648

如果大家对于学习Python有任何问题,学习方法,学习路线,如何学习有效率的问题,可以随时来咨询我,或者缺少系统学习资料的,我做这行年头比较久,自认为还是比较有经验的,可以帮助大家提出建设性建议,这是我的Python交流qun:785128166,有任何问题可以随时来咨询我。
 

<think>我们正在讨论如何使用PythonRequests库搭建接口自动化测试框架。根据用户的问题,他想要一个教程。我将参考提供的引用内容,特别是引用[2][3][4][5],它们都涉及使用Pythonrequests搭建接口自动化测试框架。目标:提供一个清晰、结构化的教程,帮助用户搭建一个基本的接口自动化测试框架。框架结构通常包括以下部分:1.项目结构规划2.基础模块(如请求封装、配置管理、日志记录)3.测试用例管理4.测试执行与报告根据引用[1]中给出的示例结构:-api_tests/-base.py#基础类,如请求的封装-conftest.py#pytest的配置文件,可以放一些fixture-testcases/#测试用例目录-test_login.py-test_order.py-utils/#工具类目录-config.py#配置管理-logger.py#日志记录-request.py#请求的封装(如果放在utils下)但是,引用[4][5]中提到了用例的配置方式(使用字典配置用例),我们可以考虑两种方式:一种是将用例写在Python文件中(如test_login.py),另一种是用外部文件(如JSON)管理用例。这里我们先以Python文件为例。步骤:1.环境准备-安装Python(建议3.6以上)-安装requests库:`pipinstallrequests`-安装pytest(测试框架):`pipinstallpytest`-安装pytest-html(生成HTML报告):`pipinstallpytest-html`-安装其他可能需要的库(如日志处理,配置文件处理等)2.项目结构```project/│conftest.py#pytest的配置文件,可以定义钩子和fixture│pytest.ini#pytest的配置文件(可选)│├───common/#公共模块││__init__.py││base_request.py#封装的请求类││config.py#配置管理(读取配置文件)││logger.py#日志模块│├───testcases/#测试用例││__init__.py││test_login.py#登录接口测试用例││...#其他测试用例│├───data/#存放测试数据(如json文件,excel等)(可选)│├───reports/#存放测试报告│└───utils/#工具类(可选)```3.封装请求类(base_request.py)目的:封装requests,使得发送请求更加方便,可以统一添加请求头、处理响应等。示例代码:```pythonimportrequestsfromcommon.loggerimportloggerclassBaseRequest:def__init__(self):#可以在这里读取配置,设置基础URL等self.base_url="http://api.example.com"#从配置文件中读取defsend_request(self,method,url,**kwargs):#拼接完整的URLurl=self.base_url+urllogger.info(f"请求方法:{method},请求URL:{url},请求参数:{kwargs}")try:response=requests.request(method,url,**kwargs)logger.info(f"响应状态码:{response.status_code},响应内容:{response.text}")returnresponseexceptExceptionase:logger.error(f"请求发生异常:{e}")raise```4.配置管理(config.py)通常使用配置文件(如config.ini,config.yaml,或者环境变量)来管理不同环境的配置。示例(使用config.ini):```ini[test]base_url=http://api.example.com```然后使用config.py读取:```pythonimportconfigparserimportosclassConfig:def__init__(self,config_file="config.ini"):self.config=configparser.ConfigParser()self.config.read(os.path.join(os.path.dirname(__file__),'..',config_file))defget(self,section,option):returnself.config.get(section,option)```5.日志模块(logger.py)配置日志,方便记录测试过程中的信息。```pythonimportloggingimportosfromdatetimeimportdatetime#创建日志目录log_dir=os.path.join(os.path.dirname(os.path.dirname(__file__)),'logs')ifnotos.path.exists(log_dir):os.mkdir(log_dir)#日志文件路径log_file=os.path.join(log_dir,f"test_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log")#创建loggerlogger=logging.getLogger('api_test')logger.setLevel(logging.DEBUG)#创建文件处理器fh=logging.FileHandler(log_file,encoding='utf-8')fh.setLevel(logging.DEBUG)#创建控制台处理器ch=logging.StreamHandler()ch.setLevel(logging.INFO)#创建格式器formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')fh.setFormatter(formatter)ch.setFormatter(formatter)#将处理器添加到loggerlogger.addHandler(fh)logger.addHandler(ch)```6.编写测试用例(test_login.py)使用pytest编写测试用例,利用封装的BaseRequest发送请求,并进行断言。```pythonimportpytestfromcommon.base_requestimportBaseRequestclassTestLogin:request=BaseRequest()deftest_login_success(self):"""测试登录成功"""url="/login"data={"username":"test_user","password":"123456"}response=self.request.send_request("post",url,json=data)assertresponse.status_code==200assertresponse.json().get("message")=="登录成功"deftest_login_failed(self):"""测试登录失败"""url="/login"data={"username":"test_user","password":"wrong"}response=self.request.send_request("post",url,json=data)assertresponse.status_code==401assertresponse.json().get("message")=="用户名或密码错误"```7.运行测试并生成报告可以使用pytest命令运行测试,并生成HTML报告。```pytesttestcases/-v--html=reports/report.html```8.扩展考虑-参数化:使用pytest的`@pytest.mark.parametrize`进行参数化测试。-数据驱动:将测试数据放在外部文件(如JSON、Excel)中,然后读取数据执行测试。-夹具(fixture):在conftest.py中定义夹具,例如初始化操作、清理操作等。-断言封装:可以封装一些常用的断言方法,使断言更简洁。-配置文件管理多环境:例如测试环境、预生产环境、生产环境。以上是一个基本的框架搭建教程。用户可以根据实际需求进行扩展。根据用户的问题,我们生成了相关问题:§§相关问题§§1.如何实现接口自动化测试框架中的数据驱动?2.在接口自动化测试中如何处理接口依赖(例如登录后的token)?3.如何将接口自动化测试框架集成到持续集成(CI)流程中?4.如何生成更详细的测试报告(包括请求和响应的详细信息)?5.在接口测试中如何进行异常处理?</think>### Python Requests接口自动化测试框架搭建教程 下面是一个基于Python+Requests接口自动化测试框架搭建步骤,结合最佳实践和引用内容: #### 一、环境准备 1. 安装Python(建议3.6+) 2. 安装核心库: ```bash pip install requests pytest pytest-html allure-pytest ``` 3. 可选工具: - Allure报告工具 - Jenkins(持续集成) - Git(版本控制) #### 二、项目结构设计 ```plaintext api_framework/ ├── common/ # 公共模块 │ ├── base_request.py # 请求封装 │ ├── logger.py # 日志模块 │ └── config.py # 配置管理 ├── testcases/ # 测试用例 │ ├── test_login.py # 登录模块用例 │ └── test_order.py # 订单模块用例 ├── data/ # 测试数据 │ └── test_data.json ├── reports/ # 测试报告 ├── conftest.py # pytest全局配置 └── pytest.ini # pytest配置文件 ``` #### 三、核心模块实现 1. **请求封装(base_request.py)**: ```python import requests from common.logger import logger class BaseRequest: def __init__(self): self.session = requests.Session() def send_request(self, method, url, **kwargs): logger.info(f"请求: {method} {url} | 参数: {kwargs}") try: response = self.session.request(method, url, **kwargs) logger.info(f"响应状态: {response.status_code} | 响应内容: {response.text[:200]}") return response except Exception as e: logger.error(f"请求异常: {str(e)}") raise ``` 2. **配置管理(config.py)**: ```python import os class Config: BASE_URL = "https://api.example.com" # 基础URL TIMEOUT = 10 # 默认超时时间 LOG_LEVEL = "DEBUG" # 日志级别 ``` 3. **日志模块(logger.py)**: ```python import logging import os def setup_logger(): logger = logging.getLogger('api_test') logger.setLevel(logging.DEBUG) # 文件日志 file_handler = logging.FileHandler('logs/api_test.log') file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) # 控制台日志 console_handler = logging.StreamHandler() console_handler.setFormatter(logging.Formatter('%(levelname)s - %(message)s')) logger.addHandler(file_handler) logger.addHandler(console_handler) return logger logger = setup_logger() ``` #### 四、测试用例编写(test_login.py) ```python import pytest from common.base_request import BaseRequest from common.config import Config class TestLogin: request = BaseRequest() @pytest.mark.parametrize("username, password, expected", [ ("valid_user", "correct_pwd", 200), ("invalid_user", "wrong_pwd", 401) ]) def test_login(self, username, password, expected): url = f"{Config.BASE_URL}/login" data = {"username": username, "password": password} response = self.request.send_request("POST", url, json=data) assert response.status_code == expected if expected == 200: assert "token" in response.json() ``` #### 五、运行与报告生成 1. 执行测试: ```bash pytest testcases/ --alluredir=./reports/allure-results ``` 2. 生成HTML报告: ```bash allure serve ./reports/allure-results ``` #### 六、框架扩展建议 1. **数据驱动**:使用JSON/YAML管理测试数据 2. **接口依赖处理**:通过fixture共享token ```python @pytest.fixture(scope="module") def auth_token(): # 获取登录token return get_token() ``` 3. **持续集成**:Jenkins集成测试任务 4. **异常监控**:企业微信/钉钉通知 5. **性能扩展**:集成Locust进行压力测试 > **框架优势**: > 1. 支持非技术人员通过修改配置文件参与自动化测试[^2] > 2. 可用于上线前回归测试和线上环境定时巡检[^2] > 3. 统一封装降低维护成本,提高代码复用率[^1][^5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值