一、搭建接口測(cè)試框架
目錄結(jié)構(gòu)如下。
二、初始化日志
在utils.py文件中編寫(xiě)如下如下代碼,初始化日志。
# 導(dǎo)入app.py全局變量文件
import app
import logging
from logging import handlers
# 定義初始化日志的函數(shù)
def init_logging():
# 創(chuàng)建日志器
logger = logging.getLogger()
# 設(shè)置日志等級(jí)
logger.setLevel(logging.INFO)
# 創(chuàng)建控制臺(tái)處理器
sh = logging.StreamHandler()
# 創(chuàng)建文件處理器
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)
# 將處理器添加到日志器當(dāng)中
logger.addHandler(sh)
logger.addHandler(fh)
在api下的init.py文件中編寫(xiě)如下代碼,進(jìn)行實(shí)際的初始化日志。
# 導(dǎo)入utils.py中編寫(xiě)的初始化日志的函數(shù)和logging模塊
# 然后調(diào)用初始化日志的函數(shù)
# 最后測(cè)試日志是不是能夠打印
# 導(dǎo)包
import utils
import logging
# 初始化日志
utils.init_logging()
# 使用logging模塊打印日志
logging.info("Test初始化日志后能不能打印日志")
三、定義全局變量
在app.py文件中編寫(xiě)如下代碼,定義全局變量。
# 1 測(cè)試項(xiàng)目接口的代碼項(xiàng)目地址
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
print(BASE_DIR)
# 2 測(cè)試項(xiàng)目服務(wù)器的根URL
BASE_URL = "http://www.nidexiangmu.com:13140"
# 3 Token(令牌,維持登錄狀態(tài))
TOKEN = "bd8f3599604107c0d7eebe1ffe15d84a"
# 4 HEADERS(請(qǐng)求一般都是固定的)
HEADERS = {"Content-Type":"application/json", "token": TOKEN}
# 5 Code(由微信小程序前端生成,用于發(fā)送給服務(wù)器,來(lái)獲取token)
CODE = "023tA6DW1eYZoY0g0JzW1bY5DW1tA6DK"
四、封裝接口
在api下創(chuàng)建ego_api.py項(xiàng)目,根據(jù)API文檔編寫(xiě)如下格式的代碼,封裝所有待測(cè)試接口。
# 導(dǎo)入requests模塊
import requests
import app
# 創(chuàng)建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"
# 獲取商品分類下的某個(gè)商品
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"
# 創(chuàng)建訂單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"
# 驗(yàn)證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)
# 獲取商品分類下的某個(gè)商品
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)
# 創(chuàng)建訂單
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驗(yàn)證接口
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)
五、編寫(xiě)測(cè)試用例
在script下創(chuàng)建test_ego.py文件,根據(jù)接口測(cè)試用例文檔編寫(xiě)測(cè)試代碼,以下代碼為正向測(cè)試用例示例。
import unittest
import logging
import app
from api.ego_api import EgoApi
class TestEgo(unittest.TestCase):
def setUp(self):
# 手動(dòng)設(shè)置token
app.HEADERS["token"] = ""
@classmethod
def setUpClass(cls):
cls.ego_api = EgoApi()
def test01_get_banner_success(self):
# 使用實(shí)例化的ego_api發(fā)送獲取輪播圖的接口請(qǐng)求
response = self.ego_api.get_banner()
# 打印響應(yīng)數(shù)據(jù)
logging.info("正向用例獲取輪播圖的測(cè)試結(jié)果為:{}".format(response.json()))
# 斷言結(jié)果
self.assertEqual(200, response.status_code)
self.assertEqual("首頁(yè)輪播圖", response.json().get("description"))
def test02_get_theme_success(self):
response = self.ego_api.theme("1,2,3")
logging.info("正向用例獲取專題欄位的測(cè)試結(jié)果為:{}".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("測(cè)試獲取最近新品接口:{}".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("測(cè)試獲取商品分類接口:{}".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)
# 打印結(jié)果
logging.info("獲取商品分類下的商品為:{}".format(response.json()))
# 斷言
self.assertEqual(200, response.status_code)
self.assertEqual("梨花帶雨 3個(gè)", response.json()[0].get("name"))
# 獲取商品詳情
def test06_get_product_detail(self):
# 使用封裝的接口獲取商品詳情
response = self.ego_api.get_product_detail(2)
# 打印結(jié)果
logging.info("獲取商品商品詳情:{}".format(response.json()))
# 斷言
self.assertEqual(200, response.status_code)
self.assertEqual("梨花帶雨 3個(gè)", response.json().get("name"))
六、生成測(cè)試報(bào)告
在run_suite.py文件中編寫(xiě)如下代碼,可生成測(cè)試報(bào)告。
# 導(dǎo)包
import unittest
import app
from script.test_ego import TestEgo
from lib.HTMLTestRunner import HTMLTestRunner
# 創(chuàng)建測(cè)試套件
suite = unittest.TestSuite()
# 將測(cè)試用例的代碼添加到測(cè)試套件中
suite.addTest(unittest.makeSuite(TestEgo))
# 定義測(cè)試報(bào)告的路徑和名稱
report_name = app.BASE_DIR + "/report/mini.html"
# 使用HTMLTestRunner運(yùn)行測(cè)試套件生成測(cè)試報(bào)告
with open(report_name, 'wb') as f:
# 初始化HTMLTestRunner
runner = HTMLTestRunner(f, verbosity=1, title="Ego微商", description="測(cè)試Ego微商的常見(jiàn)接口")
# 使用實(shí)例化的runner運(yùn)行測(cè)試套件,并生成測(cè)試報(bào)告
runner.run(suite)
七、運(yùn)行結(jié)果
1、日志結(jié)果如下:
2、測(cè)試報(bào)告結(jié)果如下(生成的測(cè)試報(bào)告位于report文件夾下):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-708985.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-708985.html
到了這里,關(guān)于【Unittest】Requests實(shí)現(xiàn)小程序項(xiàng)目接口測(cè)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!