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

发表于:2023-12-05 09:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:最最菜的菜鸟    来源:CSDN

  一、搭建接口测试框架
  目录结构如下。
  二、初始化日志
  在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)
  在api下的init.py文件中编写如下代码,进行实际的初始化日志。
  # 导入utils.py中编写的初始化日志的函数和logging模块
  # 然后调用初始化日志的函数
  # 最后测试日志是不是能够打印
  # 导包
  import utils
  import logging
  # 初始化日志
  utils.init_logging()
  # 使用logging模块打印日志
  logging.info("Test初始化日志后能不能打印日志")
  三、定义全局变量
  在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"
  四、封装接口
  在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)
  五、编写测试用例
  在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"))
  六、生成测试报告
  在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、测试报告结果如下(生成的测试报告位于report文件夹下):
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号