接口测试自动化CI环境搭建
使用gitlab+pytest+allure+excel+gitlab_runner搭建接口自动化测试平台
前置操作需要搭建Gitlab和创建GitlabRunner
框架环境仓库https://gitee.com/Index72/request_test.git
数据驱动
使用不同的数据格式来由python脚本读取,并且进行测试,通常要求数据驱动的格式,尽可能是文本文件,可维护性高,能方便的使用版本控制软件进行管理
csv
csv文件可以通过,pandas模块来读取
测试ID,描述,模块,URL,测试点,Method,PreRequestID,PostResponse,Headers,Parameters,Body,ExpectedStatusCode,结果验证
,,,,,,,,,,,,
yaml
下面是yaml格式
- 测试ID:
描述:
模块:
URL:
测试点:
Method:
PreRequestID:
PostResponse:
Headers:
Parameters:
Body:
ExpectedStatusCode:
结果验证:
# 可以使用yaml模块读取yaml格式的文件
import yaml
excel

下面给出读取excel的测试代码和Pytest代码
编写对应的python代码来读取execl表格的内容用作接口测试的代码
import pandas as pd
import pytest
import json
import re
import logging
import allure
import requests
class RequestData:
def __init__(self) -> None:
# 测试ID
self.TestId:str=""
# 测试标题
self.Title:str = ""
# 测试描述
self.Description: str = ""
# 测试点
self.TestSectionDesc: str = ""
self.URL: str = ""
self.Method: str = ""
self.Headers: dict = None
self.Parameters: dict = None
self.Body: dict = None
self.ExpectedStatusCode: int = 200
self.ExpectedResponse: dict = None
self.result_verify_code:str =""
def run_test(self,response:requests.Response):
"""执行所有的验证测试"""
self.run_verify_code(response=response)
self.try_verify_result_code(response=response)
pass
def run_verify_code(self,response:requests.Response):
"""执行结果验证的代码"""
exec(self.result_verify_code)
pass
def try_verify_result_code(self,response:requests.Response):
"""验证response代码"""
if response.status_code==self.ExpectedStatusCode:
raise f"验证代码失败 response_status_code:{response.status_code} != ExpectedStatusCode:{self.ExpectedStatusCode}"
pass
def to_RequestData(df: pd.DataFrame):
df=df.astype("string")
df=df.fillna("")
out_list = []
for i in range(df.shape[0]):
data = RequestData()
data.URL = df.iloc[i].get("URL", "").replace("\n","")
data.Method = df.iloc[i].get("Method", "")
h=str(df.iloc[i].get("Headers", ""))
headers={}
for line in h.splitlines():
try:
key=line[:line.find(":")].replace(" ","")
value=line[line.find(":")+1:]
if value[0] == " ":
value=value[1:]
headers[key]=value
except:pass
data.Headers = headers
data.Parameters = df.iloc[i].get("Parameters", "")
data.Body = df.iloc[i].get("Body","")
data.Description=df.iloc[i].get("描述","")
data.TestId=df.iloc[i].get("测试ID","")
data.TestSectionDesc=df.iloc[i].get("测试点","")
data.ExpectedStatusCode = df.iloc[i].get("ExpectedStatusCode", "")
data.ExpectedResponse = df.iloc[i].get("ExpectedResponse", "")
data.result_verify_code = df.iloc[i].get("结果验证", "")
out_list.append(data)
return out_list
def send_request(request_data: RequestData):
# 发送请求
url = request_data.URL+"?"+request_data.Parameters
payload = request_data.Body
headers=request_data.Headers
response = requests.request(request_data.Method, url, headers=headers, data=payload)
return response
@pytest.mark.parametrize("test", to_RequestData(pd.DataFrame(pd.read_excel("./接口请求.xlsx"))))
def test_request(test: RequestData):
allure.dynamic.link(test.URL)
allure.dynamic.title(test.Title)
print(test.TestSectionDesc)
allure.dynamic.description(test.Description)
response=send_request(test)
test.run_verify_code(response)
以上是样板代码,使只使用单个excel文件来驱动测试执行。可以按照自己需求来针对代码进行修改以适配不同的测试要求
下面是执行结果

pytest与allure
pytest
pytest测试框架是基于python的一个测试框架,
命令
# 执行当前目录下所有匹配 test_* 格式的函数和测试类
pytest
# 执行当前目录下的测试并且输出详细的日志,和-s 打印信息
pytest -vv -s
# 执行测试,然后生成测试报告并且指定指定文件夹为 allure_data
pytest -vv -s --alluredir="allure_data"
使用
--alluredir="allure_data"生成测试报告,但是现在并不是html文件需要按照下面的方法生成对应的测试报告的html文件
pytest -vv -s --alluredir="allure_data"
allure generate ./allure_data
使用上面的命令之后,会在./allure-report文件夹下生成对应的网页测试报告
![[Pasted image 20231219111529.png]]
在allure-report目录下可以使用python -m http.server -b 0.0.0.0 8000来访问本地的 http://127.0.0.1:8000 来查看测试报告
pandas
用作数据处理 参考文档
DataFrames
读取excel
df=pd.read_excel("./table.xlsx")
读取csv
df=pd.read_csv("./table.csv")
对于上面读取的df处理,通常理解DataFrame的可以将他们看作是一个矩阵表格。
对于表格的每一个列,或者每一行以及,其他的内容的读取在下面给出代码参考。
# 获取第一列
print(df.iloc[0])
# 迭代获取某一列
for i in df.shape.[0]:
df.iloc[i].get("<列名>",<提供的默认值>)
# 获取当前的df的形状,shape[0]是df的列表数量 shape[1]是df的字段数量
print(df.shape)
# 获取所有的字段
print(df.columns)
# 获取某一个字段的所有的列
df["<字段名称>"]
# 将df表格内的所有na数据替换成空字符串""
df.fillna("")
对于上面的excel的读取代码请参考下面的代码读取案例
class RequestData:
def __init__(self) -> None:
# 测试ID
self.TestId:str=""
# 测试标题
self.Title:str = ""
# 测试描述
self.Description: str = ""
# 测试点
self.TestSectionDesc: str = ""
self.URL: str = ""
self.Method: str = ""
self.Headers: dict = None
self.Parameters: dict = None
self.Body: dict = None
self.ExpectedStatusCode: int = 200
self.ExpectedResponse: dict = None
self.result_verify_code:str =""
def to_RequestData(df: pd.DataFrame):
"""读取df每一行,并且生成一个RequestData列表"""
df=df.astype("string")
df=df.fillna("")
out_list = []
for i in range(df.shape[0]):
data = RequestData()
data.URL = df.iloc[i].get("URL", "").replace("\n","")
data.Method = df.iloc[i].get("Method", "")
h=str(df.iloc[i].get("Headers", ""))
headers={}
for line in h.splitlines():
try:
key=line[:line.find(":")].replace(" ","")
value=line[line.find(":")+1:]
if value[0] == " ":
value=value[1:]
headers[key]=value
except:pass
data.Headers = headers
data.Parameters = df.iloc[i].get("Parameters", "")
data.Body = df.iloc[i].get("Body","")
data.Description=df.iloc[i].get("描述","")
data.TestId=df.iloc[i].get("测试ID","")
data.TestSectionDesc=df.iloc[i].get("测试点","")
data.ExpectedStatusCode = df.iloc[i].get("ExpectedStatusCode", "")
data.ExpectedResponse = df.iloc[i].get("ExpectedResponse", "")
data.result_verify_code = df.iloc[i].get("结果验证", "")
out_list.append(data)
return out_list
pytest关键功能
夹具
@pytest.fixture()夹具是pytest的一个重要的概念,对于项目的维护和使用有帮助
夹具的作用范围
session: 整个测试会话在执行测试之前会执行一边function: 每个函数测试会执行一次module: 每个 模块或.py文件 会执行一次,class: 每个类执行测试前,会执行一遍夹具
夹具的使用 对当前的测试环境进行初始化
夹具的使用,可以当作执行测试的时候提供数据,或者对测试进行前置操作
@pytest.fixture(scope="session",autoUse=True)
def session_starup():
# 测试运行之前执行的内容
print("测试执行前的准备工作")
yield
# 测试运行之后执行的内容
print("测试执行后的清理工作")
夹具的使用 生成测试环境
@pytest.fixture(scope="function")
def test_startup():
# 读取数据
l=[1,2,3,4]
yield l
# 清理
l=[]
def test_t1(test_startup):
for i in test_startup:
print(i)
pass
参数化
@pytest.mark.parametrize("t1_data",[1,2,3,4,5,6])
def test_t1(t1_data):
print(t1_data)
pass
allure
命令
# 将allure_report 文件夹的测试报告生成为html文件
allure generate --clean ./allure_report
# 运行一个http服务器用作访问html网页
allure serve ./allure_report
日志
可以参考官方文档
def test_t1():
pass
用作驱动Runner的配置文件
使用gitlabRunner进行配置的时候需要先编写对应的CI持续集成的配置文件
下面是文件
.gitlab-ci.yml下面的文件中定义了一个stages用作运行测试和生成报告
stages: # List of stages for jobs, and their order of execution
- run_request_test
run_request_test-job: # This job runs in the deploy stage.
stage: run_request_test # It only runs when *both* jobs in the test stage complete successfully.
environment: test
artifacts:
name: "allure_report"
paths:
- "./allure_report"
tags:
- pytest
script:
- echo "执行测试 ..."
- bash run_test.sh
下面是文件
run_test.sh,其会在上面的.gitlab-ci.yml中调用
#!/bin/bash
source ~/.bashrc
pytest requests_test.py -vv -s --alluredir="./allure_report"
allure generate --clean ./allure_report
if [ -d /opt/allure-report ];
then
rm -rf /opt/allure-report
fi
mv allure-report /opt/
if [ $? ];
then
echo "请前往:http://192.168.10.246:1088 查看最新的测试报告"
else
echo "运行测试失败"
fi

浙公网安备 33010602011771号