【Unittest】Requests实现小程序项目接口测试

文章目录

一、搭建接口测试框架

目录结构如下。

二、初始化日志

在utils.py文件中编写如下如下代码,初始化日志。

python 复制代码
# 导入app.py全局变量文件
import app
import logging
from logging import handlers

# 定义初始化日志的函数
def init_logging():
    # 创建日志器
    logger = logging.getLogger()
    # 设置日志等级
    logger.setLevel(logging.INFO)
    # 创建控制台处理器
    sh = logging.StreamHandler()
    # 创建文件处理器
    fh = logging.handlers.TimedRotatingFileHandler(app.BASE_DIR+"/log/mimi.log",
                                                   when='M',
                                                   interval=5,
                                                   backupCount=3,
                                                   encoding='utf-8')
    # 定义日志的格式(格式化器)
    fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"
    formatter = logging.Formatter(fmt)
    # 将格式化器添加到处理器
    sh.setFormatter(formatter)
    fh.setFormatter(formatter)
    # 将处理器添加到日志器当中
    logger.addHandler(sh)
    logger.addHandler(fh)

在api下的init.py文件中编写如下代码,进行实际的初始化日志。

python 复制代码
# 导入utils.py中编写的初始化日志的函数和logging模块
# 然后调用初始化日志的函数
# 最后测试日志是不是能够打印

# 导包
import utils
import logging

# 初始化日志
utils.init_logging()

# 使用logging模块打印日志
logging.info("Test初始化日志后能不能打印日志")

三、定义全局变量

在app.py文件中编写如下代码,定义全局变量。

python 复制代码
# 1 测试项目接口的代码项目地址
import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
print(BASE_DIR)
# 2 测试项目服务器的根URL
BASE_URL = "http://www.nidexiangmu.com:13140"
# 3 Token(令牌,维持登录状态)
TOKEN = "bd8f3599604107c0d7eebe1ffe15d84a"
# 4 HEADERS(请求一般都是固定的)
HEADERS = {"Content-Type":"application/json", "token": TOKEN}
# 5 Code(由微信小程序前端生成,用于发送给服务器,来获取token)
CODE = "023tA6DW1eYZoY0g0JzW1bY5DW1tA6DK"

四、封装接口

在api下创建ego_api.py项目,根据API文档编写如下格式的代码,封装所有待测试接口。

python 复制代码
# 导入requests模块
import requests
import app
# 创建API接口类
class EgoApi:

    def __init__(self):
        # 定义轮播图的url
        self.banner_url = app.BASE_URL + "/api/v1/banner/1"
        # 定义专题栏位的url
        self.theme_url = app.BASE_URL + "/api/v1/theme"
        # 最近新品的URL
        self.recent_product_url = app.BASE_URL + "/api/v1/product/recent"
        # 获取商品分类url
        self.category_url = app.BASE_URL + "/api/v1/category/all"
        # 获取商品分类下的某个商品
        self.by_category_url = app.BASE_URL + "/api/v1/product/by_category"
        # 获取商品详情
        self.product_detail_url = app.BASE_URL + "/api/v1/product"
        # 获取用户订单列表
        self.order_list_url = app.BASE_URL + "/api/v1/order/by_user"
        # 创建订单URL
        self.create_order_url = app.BASE_URL + "/api/v1/order"
        # 查看订单详情
        self.order_detail_url = app.BASE_URL + "/api/v1/order"
        # 获取Token
        self.get_token_url = app.BASE_URL + "/api/v1/token/user"
        # 验证token的url
        self.verify_token_url = app.BASE_URL + "/api/v1/token/verify"
        # 获取地址信息的URL
        self.get_address_url = app.BASE_URL + "/api/v1/address"
    # 轮播图
    def get_banner(self):
        return requests.get(self.banner_url)

    # 专题栏位
    def theme(self, params):
        return requests.get(self.theme_url, params={"ids":params})

    # 最近新品
    def recent_product(self):
        return requests.get(self.recent_product_url)

    # 获取商品分类
    def get_product_category(self):
        return requests.get(self.category_url)

    # 获取商品分类下的某个商品
    def by_category(self, params):
        return requests.get(self.by_category_url, params={"id":params})

    # 获取商品信息
    def get_product_detail(self, product_id):
        return requests.get(self.product_detail_url + "/" + str(product_id))

    # 获取用户订单列表(登录后的接口)
    def get_order_list(self, page):
        return requests.get(self.order_list_url, params={"page":page}, headers=app.HEADERS)

    # 创建订单
    def create_order(self, jsondata):
        return requests.post(self.create_order_url, json=jsondata, headers=app.HEADERS)

    # 查看订单
    def get_order_detail(self, order_id):
        return requests.get(self.order_detail_url + "/" + str(order_id), headers=app.HEADERS)

    # 获取Token
    def get_token(self, code):
        return requests.post(self.get_token_url, json={"code": code})

    # Token验证接口
    def verify_token(self, token):
        return requests.post(self.verify_token_url, json={"token": token})

    # 获取地址信息
    def get_address(self):
        return requests.get(self.get_address_url, headers=app.HEADERS)

五、编写测试用例

在script下创建test_ego.py文件,根据接口测试用例文档编写测试代码,以下代码为正向测试用例示例。

python 复制代码
import unittest
import logging
import app
from api.ego_api import EgoApi

class TestEgo(unittest.TestCase):

    def setUp(self):
        # 手动设置token
        app.HEADERS["token"] = ""

    @classmethod
    def setUpClass(cls):
        cls.ego_api = EgoApi()

    def test01_get_banner_success(self):
        # 使用实例化的ego_api发送获取轮播图的接口请求
        response = self.ego_api.get_banner()
        # 打印响应数据
        logging.info("正向用例获取轮播图的测试结果为:{}".format(response.json()))
        # 断言结果
        self.assertEqual(200, response.status_code)
        self.assertEqual("首页轮播图", response.json().get("description"))

    def test02_get_theme_success(self):
        response = self.ego_api.theme("1,2,3")
        logging.info("正向用例获取专题栏位的测试结果为:{}".format(response.json()))
        self.assertEqual(200, response.status_code)
        self.assertEqual("专题栏位一", response.json()[0].get("name"))

    def test03_get_recent_product(self):
        response = self.ego_api.recent_product()
        logging.info("测试获取最近新品接口:{}".format(response.json()))
        self.assertEqual(200, response.status_code)
        self.assertEqual("芹菜 半斤", response.json([0].get("name")))

    def test04_get_product_category(self):
        response = self.ego_api.get_product_category()
        logging.info("测试获取商品分类接口:{}".format(response.json()))
        self.assertEqual(200, response.status_code)
        self.assertEqual("果味", response.json([0].get("name")))

    # 获取商品分类下的商品
    def test05_get_product(self):
        # 使用封装的接口获取商品分类下的商品
        response = self.ego_api.by_category(2)
        # 打印结果
        logging.info("获取商品分类下的商品为:{}".format(response.json()))

        # 断言
        self.assertEqual(200, response.status_code)
        self.assertEqual("梨花带雨 3个", response.json()[0].get("name"))

    # 获取商品详情
    def test06_get_product_detail(self):
        # 使用封装的接口获取商品详情
        response = self.ego_api.get_product_detail(2)
        # 打印结果
        logging.info("获取商品商品详情:{}".format(response.json()))

        # 断言
        self.assertEqual(200, response.status_code)
        self.assertEqual("梨花带雨 3个", response.json().get("name"))

六、生成测试报告

在run_suite.py文件中编写如下代码,可生成测试报告。

python 复制代码
# 导包
import unittest
import app
from script.test_ego import TestEgo
from lib.HTMLTestRunner import HTMLTestRunner
# 创建测试套件
suite = unittest.TestSuite()
# 将测试用例的代码添加到测试套件中
suite.addTest(unittest.makeSuite(TestEgo))
# 定义测试报告的路径和名称
report_name = app.BASE_DIR + "/report/mini.html"
# 使用HTMLTestRunner运行测试套件生成测试报告
with open(report_name, 'wb') as f:
    # 初始化HTMLTestRunner
    runner = HTMLTestRunner(f, verbosity=1, title="Ego微商", description="测试Ego微商的常见接口")
    # 使用实例化的runner运行测试套件,并生成测试报告
    runner.run(suite)

七、运行结果

1、日志结果如下:

2、测试报告结果如下(生成的测试报告位于report文件夹下):

相关推荐
笨鸟先飞,勤能补拙13 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
纳米软件14 小时前
干货分享:服务器电源动态负载测试(Dynamic Load)的示波器抓波与参数设置实战
自动化测试·ate测试·ate测试系统·电子测试测量·电子测试工具
长和信泰光伏储能14 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂14 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study15 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境16 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境16 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12316 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021616 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0017 小时前
一个项目带你入门AI应用开发01
python