接口自动化测试框架完整搭建python+unittest+requests+ddt

接口自动化框架

一、首先废话不多说,直接开始讲解一下整个框架的目录结构,本次内容着重讲解测试用例类,只要掌握了测试用例类和接口测试用例怎么写就可以运用此框架。(需要一些python基础,能看的懂基本代码)
接口框架目录结构
common目录
1.contants是处理项目路径模块,本项目路径全部采取相对路径(这样做的好处是copy到任意地方可以直接运行,不用担心会路径报错)
2.handle_data处理excel用例中需要替换的参数,用来存储临时变量,和需要替换的excel用例中需要替换的字符串(注意存放临时变量时int类型应转换成str类型存放)
3.handle_db是连接数据库(mysql)处理需要进行数据库校验的模块,封装了三个方法,分别是:获取到查询的第一条数据、获取到查询的所有数据、获取查询到的数据条数
4.handle_request是用来发送请求的(支持cookie和token)
5.handle_webservice是用来发送webservice类型接口的请求(用到的比较少可以忽略此模块)
6.myconfig是读取和写入配置文件的模块
7.mylogger是输出日志模块,用来调用代码运行的时候哪些信息需要写入日志中,方便自己调试和找出接口错误信息,哪里需要就直接调用
8.readexcel读取excel用例数据的模块
9.send_email是发送测试报告邮件模块
comf配置文件
1.日志等级和测试报告名称,项目地址,账号,和数据库连接信息修改的地方
data存放excel用例数据
library存放一些下载的第三方库
1.ddt数据驱动的
2.HTMLTestRunner生成测试报告的模块
log存放日志
查看日志,日志是轮转的
reports存放测试报告
在此文件夹下查看报告
testcases存放用例类的模块
所有的测试用例类必须放在此模块
run.py测试运行程序
整个项目只需要运行此模块就可以

二、下面我们来详细介绍下excel中接口用例该怎么写
在这里插入图片描述
这里注意下接口传入参数data里的用例1和用例2中的mobile_phone的传参为什么是#phone#,为什么不传入具体手机号,因为传入具体的手机号,测试用例只能运行一次,需要手动修改这里的测试用例数据在进行运行比较。那我们该采用什么办法呢,在代码里面随机生成手机号进行替换(后面代码中会指出),怎么替换呢首先判断每条用例数据中是否有#phone#,如果有就用生成的随机手机号进行替换,反之,就直接将接口参数传入接口中进行请求,获取结果
还需要注意的是将表单名称进行修改,如上图中的下方,名称随意取

讲完了excel用例,接口用例类怎么写(python基础语法就不多说)我们只讲接口的excel用例数据读取,请求接口,在进行断言,预期结果和实际结果进行比对

# -*- coding: utf-8 -*-
# @Time    : 2019/12/5 9:23
# @File    : test_01_login__register.py
# @Software: PyCharm
import  unittest
import  random
from library.ddt import ddt,data
from  common.readexcel import read_excel
from common.contants import URL_DIR
from common.myconfig import conf
from common.handle_request import token_http,cookie_http
from  common.mylogger import Log
from  common.handle_db import db


@ddt
class Testregister(unittest.TestCase):
	#传入excel用例所在的路径和表单名
    excel=read_excel(URL_DIR,"register")
    #读取用例数据
    cases=excel.read_data()

    @data(*cases)
    def test_register(self,case):
        # ------第一步:准备用例数据------------
        # 获取请求的参数
        # 增加判断,这里判断是否有请求的参数需要替换
        if "#phone#"in case["data"]:
            # 生成手机号
            phone=self.random_phone()
            # 进行替换
            case["data"]=case["data"].replace("#phone#",phone)
        data=eval(case["data"])
        # 获取请求的方法
        method=case["method"]
        # 获取请求的地址(配置文件中读取的路径+excel中的读取路径做拼接)
        url=conf.get("url_project","url")+case["url"]
        # 获取当前用例所在行
        row=case["case_id"]+1
        # 获取请求头(配置文件中读取请求头)
        headers=eval(conf.get("url_project","headers"))
        # 获取预期结果
        expected=eval(case["expected"])

        # ------第二步:发送请求到接口,获取实际结果--------
        #发送请求(传入url、请求方法、请求参数,请求头、)
        res1=token_http.send(url=url,method=method,json=data,headers=headers)
        #获取实际结果
        res=res1.json()

        # -------第三步:比对预期结果和实际结果-----
        try:
        	#断言接口返回的code和预期结果中的code是否一致
            self.assertEqual(eval(expected["code"]),res["code"])
            #断言接口返回的msg和预期结果中的msg是否一致
            self.assertEqual(expected["msg"],res["msg"])
            #判断如果请求成功就到处数据库中去查询是否有该数据
            if res["msg"]=="ok":
                # 去数据库查询当前账号是否存在
                sql = "SELECT * FROM futureloan.member WHERE mobile_phone ={}".format(phone)
                # 获取数据库中有没有该用户信息,(用handle_db封装好的方法)
                count=self.db.count(sql)
                # 对数据库中返回的数据做断言,判断数据库中是否有一条数据
                self.assertEqual(1,count)
        except AssertionError as e :
        	#回写结果到excel中的result列
            self.excel.write_data(row=row,column=8,value="未通过")
            #打印到控制台
            print("预期结果:{}".format(expected))
            print("实际结果;{}".format(res))
            #将错误信息打印到日志
            Log.info("用例:{}--------->未通过".format(case["title"]))
            Log.error(e)
            #如果有错误信息抛出错误信息
            raise  e
        else:
        	#回写结果到excel中的result列
            self.excel.write_data(row=row,column=8,value="通过")
            Log.info("用例:{}--------->通过".format(case["title"]))

	#随机生成手机号方法
    @staticmethod
    def random_phone():
        phone="188"
        for i in range(8):
            phone+=str(random.randint(0,9))
        return phone

代码中部分问题
1.上面的URL_DIR是已经拼接好的路径导入进来的,在contants下URL_DIR里修改
2.请求地址前半部分读取conf.ini文件中的url(建议将接口中相同的请求地址放在此地方,这样就不用每次在excel中url里写入完整的接口地址)
3.请求头存放在conf.ini文件的headers用字典的方式存放
4.数据库校验部分需要先连接数据库,在conf.ini配置文件中填写host主机,user用户,password密码,port端口号(注:这里只支持,mysql数据库)

请注意:框架中有许多的第三方库需要自己安装

用例类和excel用例写好后运行run.py文件
在reports查看测试报告
百度网盘下载链接:https://pan.baidu.com/s/1DuvpJxX8FDuSloRn50PfdA
提取码:qe2b
好了如果还有什么问题欢迎评论区留言,如果写的不好还请勿喷,评论区一起讨论起来吧

  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 43
    评论
搭建一个基于Python + requests + pytest + ddt + unittest自动化测试框架,可以按照以下步骤进行: 1. 安装所需依赖:在你的项目环境中安装 requests、pytest、ddtunittest。 ``` pip install requests pytest ddt unittest ``` 2. 创建项目结构:在你的项目目录下创建以下文件和文件夹结构: ``` ├── tests │ ├── __init__.py │ └── test_cases.py ├── data │ └── test_data.xlsx └── conftest.py ``` 3. 编写测试用例:在 `test_cases.py` 文件中编写你的测试用例,可以使用 `ddt` 来实现数据驱动,示例: ```python import unittest import ddt from data.test_data import TestData from utils.api_helper import APIClient @ddt.ddt class APITestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls.client = APIClient() @ddt.data(*TestData.test_data) def test_api(self, data): response = self.client.send_request(data['url'], data['method'], data['payload']) self.assertEqual(response.status_code, data['expected_status']) self.assertEqual(response.json(), data['expected_response']) ``` 4. 创建测试数据:在 `test_data.xlsx` 文件中创建测试数据,可以使用 `openpyxl` 库来读取 Excel 数据,示例: ```python import openpyxl class TestData: workbook = openpyxl.load_workbook('data/test_data.xlsx') sheet = workbook['Sheet1'] test_data = [] for row in sheet.iter_rows(min_row=2, values_only=True): test_data.append({ 'url': row[0], 'method': row[1], 'payload': row[2], 'expected_status': row[3], 'expected_response': row[4] }) ``` 5. 创建 API 辅助类:在 `api_helper.py` 文件中创建一个 APIClient 类,用于发送 API 请求,示例: ```python import requests class APIClient: def send_request(self, url, method, payload): if method == 'GET': response = requests.get(url, params=payload) elif method == 'POST': response = requests.post(url, json=payload) elif method == 'PUT': response = requests.put(url, json=payload) elif method == 'DELETE': response = requests.delete(url) else: raise ValueError('Invalid HTTP method') return response ``` 6. 创建 pytest 配置:在 `conftest.py` 文件中配置 pytest,示例: ```python import pytest def pytest_addoption(parser): parser.addoption("--base-url", action="store", default="http://localhost:8000", help="Base URL for API tests") @pytest.fixture(scope="session") def base_url(request): return request.config.getoption("--base-url") ``` 7. 运行测试:在命令行中执行以下命令来运行测试用例: ``` pytest -s tests/ ``` `-s` 参数用于显示打印信息。 这样,你就搭建了一个基于 Python + requests + pytest + ddt + unittest自动化测试框架,可以进行接口测试。你可以根据实际需求进一步扩展和优化这个框架

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明教-光明左使

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值