接口测试自动化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
posted @ 2023-12-20 16:25  index72  阅读(154)  评论(0)    收藏  举报