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


    一、搭建接口测试框架

    目录结构如下。

    在这里插入图片描述

    二、初始化日志

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

    # 导入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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    # 导入utils.py中编写的初始化日志的函数和logging模块
    # 然后调用初始化日志的函数
    # 最后测试日志是不是能够打印
    
    # 导包
    import utils
    import logging
    
    # 初始化日志
    utils.init_logging()
    
    # 使用logging模块打印日志
    logging.info("Test初始化日志后能不能打印日志")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、定义全局变量

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

    # 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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    四、封装接口

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

    # 导入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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    五、编写测试用例

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

    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"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    六、生成测试报告

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

    # 导包
    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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    七、运行结果

    1、日志结果如下:

    在这里插入图片描述

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

    在这里插入图片描述

  • 相关阅读:
    可恶的C指针、运算左右结合性质
    # Spring 事务失效场景
    vCenter7.0.0升级到vCenter7.0u3h
    ubuntu/windows/mac小问题记录
    基于SpringBoot+Druid实现多数据源:注解+编程式
    d中shared用法
    1260. 二维网格迁移 : 简单构造模拟题
    Java IO基础知识总结篇一
    【LeetCode热题100】--199.二叉树的右视图
    精品基于PHP实现的好物优购商城|电商小程序
  • 原文地址:https://blog.csdn.net/jylsrnzb/article/details/132720914