接口測試分析、設計以及實現

接口相關理論

  • ui功能測試和接口測試哪個先執行?–為什么
結論:接口測試先執行
原因:ui功能測試需要等待前端頁面開發完成、后臺接口開發完后且前端與后端聯調完成。
  • ui功能測試與接口測試的區別?
ui功能:功能調用(前端jS、服務器端)+頁面布局+兼容
接口測試:完整的測試服務端功能驗證。
  • ui功能測試和接口測試哪個更高效?–為什么
結論:接口測試更高
原因:接口測試只測服務端功能以及沒有多頁面操作因素。

金融項目

測試對象:投資業務接口

待測接口

1、注冊登錄注冊圖片驗證碼接口注冊手機驗證碼接口注冊接口登錄接口查詢登錄狀態接口
2、認證開戶充值認證接口查詢認證狀態請求后臺開戶接口三方開戶接口請求充值驗證碼接口請求后臺充值接口請求三方充值接口
3、投資請求后臺投資接口三方投資接口
4、投資業務注冊圖片驗證碼接口注冊手機驗證碼接口注冊接口登錄接口認證接口請求后臺開戶接口三方開戶接口請求充值驗證碼接口請求后臺充值接口請求三方充值接口請求后臺投資接口三方投資接口

接口如何測試?

  • 設計用例

image-20240623204952107

  • 使用工具
可視化工具:postman、Jmeter
代碼:python+requests+unittest

接口流程

1、需求評審
2、測試計劃與方案
3、分析API文檔
4、編寫用例
5、搭建環境(項目測試、測試工具環境)
6、編寫腳本
7、執行腳本
8、缺陷管理
9、測試報告
  • 需求評審
參與人員:開發、測試、產品
目的:1、熟悉項目有哪些功能2、站在不同角度對需求進行查漏補缺3、各角色對需求理解一致
  • 測試計劃與方案
核心:測什么誰來測怎么測
其他:提測標準上線標準?險控制
  • 分析API文檔
1、測試接口依賴的數據是否都明確(請求、響應)
2、分析接口之間依賴關系及關聯
3、參數規則(類型、必填、長度等等)說明
項目難點:
1、認證接口請求頭使用multipart/form-data
2、三方開戶、三方充值、三方投資都需要調用Mock接口
請求url:來源響應數據action的值
請求參數和值:所有input標簽中name屬性值為參數名,value屬性值為參數值。

測試點提取

  • 注冊圖片驗證碼、注冊驗證碼

image-20240624082406506

  • 注冊

image-20240624083001666

  • 登錄

image-20240624083042408

  • 開戶認證

image-20240624083103546

  • 充值

image-20240624083215750

  • 投資

image-20240624083251199

測試用例

  • 注冊圖片驗證碼、注冊短信驗證碼

image-20240624084609782

  • 注冊

image-20240624084901908

  • 登錄

image-20240624085023926

  • 認證開戶

image-20240624085718700

  • 充值

image-20240624090027477

  • 投資

image-20240624090255283

  • 投資業務

image-20240624090410633

環境說明

1、項目環境
2、測試工具環境

項目環境搭建

  • 環境部署主要步驟

image-20240624221401055

  • 三方接口如何解決?
使用mock

Mock說明

  • 什么是mock?–模擬接口
  • 什么場景下會用mock?
1、依賴的接口未實現
2、依賴的接口響應速度慢
3、針對接口模擬各種異常
  • 如何去實現?
1、使用mock現有工具-->moco
2、自定義mock①編寫一個函數 直接return 模擬的值② 使用接口開發框架編寫要模擬的接口 flask

要模擬哪些內容?

響應數據
響應狀態碼

需求場景:

模擬一個:登錄接口
1、在API文檔中說明如果登錄成功,返回:狀態碼{"status":200,"msg":"登錄成功!",
"token":"xxx123123123"}
2、登錄失敗反饋:狀態碼:200{"status":100,"msg":"用戶名或密碼錯誤!"}
問題:開發還未實現登錄接口,那么依賴登錄如何解決?
  • 實現
from flask import Flask
app = Flask(__name__)
# 定義接口 模擬返回結果
@app.route("/login", methods=["post"])
def login():return {"status": 200, "msg": "登錄成功!", "token": "xxxx123123123"}
# 定義接口 模擬異常響應狀態碼
@app.route("/login/lgy", methods=["get"])
def lgy():return "haha",407,"xiaoxi"
# 運行
app.run()
  • 擴展
from flask import Flask,requests
app = Flask(__name__)"""
需求:用戶名為admin 密碼為:123456 返回登錄成功!否則返回用戶名或密碼錯誤,請求參數格式為:form"""# 定義接口 模擬返回結果
@app.route("/login", methods=["post"])
def login():#提取數據username=requests.form.get("username")pwd=requests.form.get("possword")#判斷if username=="admin" and pwd=="123456":return {"status": 200, "msg": "登錄成功!", "token": "xxxx123123123"}else:return {"status":100,"msg":"用戶名或密碼錯誤!"}
# 運行
app.run()

構造測試數據

  • 方式
    • 通過系統頁面構造
    • 通過接口構造
    • 通過數據庫構造

通過系統頁面構造

  • 優點:可視化頁面操作
  • 缺點:操作步驟較多,不適合頻繁改造數據
  • 示例:參考發布借款標流程

通過接口構造

  • 優點:速度快
  • 缺點:接口耦合度高(接口之間依賴性強,一個失敗,后面全失敗)
  • 建議:適合依賴3個以內接口就行構造

通過數據庫構造(推薦)

  • 優點:靈活度大,執行速度最快
  • 缺點:需要熟悉庫、表、字段
  • 建議:編寫SQL語句時,使用復制生成的SQL語句,修改主要字段值。

構造借款業務數據

-- 清空操作
delete from `czbk_member`.`mb_member` where id=869;
delete from `czbk_member`.`mb_member_info` where id=987;
delete from `czbk_finance`.`fn_loan_amount` where id=987;
delete from `p2p_mock`.`p2p_account` where id=911;-- 借款
delete from `czbk_finance`.`fn_loan` where id=642;
delete from `czbk_finance`.`fn_loan_info` where id=832;
delete from `czbk_finance`.`fn_loan_amount_log` where id=869;
INSERT INTO `czbk_member`.`mb_member` (`id`, `name`, `trust_account`, `password`,
`email`, `phone`, `paypassword`, `count`, `register_ip`, `register_time`,
`register_date`, `lastlogin_ip`, `lastlogin_time`, `lastlogin_date`,
`register_type`, `role`, `group`, `group_status`, `is_realname`, `is_email`,
`is_phone`, `is_video`, `is_id5`, `is_vip`, `credit_point`, `is_auto`,
`pwd_attach`, `status`, `lock_time`, `vip_start_time`, `vip_end_time`,
`vip_category_id`, `vip_category_ind`, `amount`, `phonestr`) VALUES ('869',
'13099775533', '6021234507160403', 'eab70f4a46c640b3dfc35040bf37c803', NULL,
'13099775533', NULL, '1', '1972826569', '1588835827', '2020-05-07', '1972826569',
'1588835827', '2020-05-07', '1', '1', '1', '2', '1', '-1', '1', '-1', '-1', '-1',
'0', '-1', '1m4U82PqPx', '1', NULL, NULL, NULL, NULL, NULL, '0.00', NULL);
INSERT INTO `czbk_member`.`mb_member_info` (`id`, `member_id`, `member_name`,
`avatar`, `nickname`, `realname`, `gender`, `birthday`, `card_id`, `qq`,
`educational_background`, `marry_status`, `graduated`, `company_industry`,
`company_scale`, `company_office`, `monthly_income`, `invite_money`,
`hometown_province`, `hometown_city`, `hometown_area`, `hometown_post`) VALUES
('987', '869', '13099775533', NULL, NULL, '小石頭', NULL, '1986-11-18',
'429009118611181111', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL);
INSERT INTO `czbk_finance`.`fn_loan_amount` (`id`, `member_id`, `member_name`,
`credit_amount`, `credit_amount_freeze`, `vouch_amount`, `vouch_amount_freeze`,
`pawn_amount`, `pawn_amount_freeze`, `roam_amount`, `roam_amount_freeze`) VALUES
('987', '869', '13099775533', '200000.000000', '0.000000', '0.000000',
'0.000000', '0.000000', '0.000000', '0.000000', '0.000000');
INSERT INTO `p2p_mock`.`p2p_account` (`id`, `account`, `AvlBal`, `AcctBal`,
`FrzBal`, `create_time`) VALUES ('911', '6021234507160403', '0.00', '0.00',
'0.00', '2020-05-07 16:04:03');-- 借款
INSERT INTO `czbk_finance`.`fn_loan` (`id`, `ind`, `serialno`, `name`,
`member_id`, `member_name`, `amount`, `credited_amount`, `progress`,
`tender_count`, `category_id`, `category_type`, `repay_type`, `period`, `apr`,
`sort_index`, `sort_top`, `status`, `hidden_status`, `additional_status`,
`deposit_certificate`, `certificate_file_id`, `loan_repay_status`,
`loan_repay_time`, `overdue_time`, `add_date`, `add_time`, `verify_time`,
`reverify_time`, `add_ip`, `vouch_company_id`, `op_status`, `marker_type`) VALUES
('642', 'f5380d59791773a8abad4141ff90a5a4', '202008231111', '數據庫構造借款1',
'869', '13099775533', '100000.00', '0.00', '0.00', '0', '1', '1', '1', '60',
'7.55', '1', NULL, '3', '1', '-1', '-1', NULL, NULL, NULL, '1609501013', '2020-
05-07', '1588847800', '1588851413', NULL, '1972826569', '0', '-1', '數據庫');INSERT INTO `czbk_finance`.`fn_loan_info` (`id`, `loan_id`, `thumbs`, `contents`,
`attachment_ids`, `password`, `use`, `tender_amount_min`, `tender_amount_max`,
`freeze_amount`, `freeze_amount_proportion`, `freeze_period`, `award_status`,
`fail_award_status`, `award_amount`, `award_proportion`, `award_amount_total`,
`validate`, `part_status`, `tender_count`, `comment_status`, `comment_count`,
`is_company`, `company_name`, `vouch_company_info`, `vouch_company_pic`,
`vouch_company_guaranty`, `amount_category_id`, `hits`, `cancel_admin_id`,
`cancel_remark`, `cancel_time`, `verify_admin_id`, `verify_admin_name`,
`verify_remark`, `verify_time`, `verify_ip`, `reverify_admin_id`,
`reverify_admin_name`, `reverify_remark`, `reverify_time`, `reverify_ip`,
`auto_scale`, `is_auto`, `additional_status`, `additional_apr`,
`additional_name`, `additional_amount_max`, `additional_pic`, `product_process`,
`information`) VALUES ('832', '642', NULL, '數據庫構造借款1', 'a:0:{}', NULL,
'10102', '100.00', '1000.00', NULL, '10.00', NULL, '-1', '-1', NULL, NULL, NULL,
'239', NULL, '0', '-1', '0', '-1', NULL, NULL, NULL, NULL, '1', '1', NULL, NULL,
NULL, '4', 'admin', '數據庫構造借款1 通過', '1588851413', '1972826569', NULL, NULL,
NULL, NULL, NULL, NULL, '1', '-1', '0.000000', NULL, '0.000000', NULL, NULL,
NULL);
UPDATE `czbk_finance`.`fn_loan_amount` SET `credit_amount_freeze`='100000.000000'
WHERE `member_id`='869';
INSERT INTO `czbk_finance`.`fn_loan_amount_log` (`member_id`, `member_name`,
`category_id`, `type`, `amount`, `remark`,
`add_time`) VALUES ('869','13099775533', 1, 4, '100000', '借款凍結',
'1972826569');

腳本編寫

  • 獲取圖片驗證碼、獲取短信驗證碼

image-20240625221929905

注意:
1、隨機數為空、隨機數為字符串,響應狀態碼為400,404,如果需要變綠,就需要加斷言且勾選"忽略狀態"
2、獲取短信驗證碼依賴圖片驗證碼,需要先請求圖片驗證碼,添加cookie管理器進行關聯。
  • 注冊腳本

image-20240626082518125

提示:
1、密碼為空、未同意條款為缺陷
2、注冊接口中手機號必須和獲取短信驗證碼接口手機號一致。
  • 登錄腳本

image-20240626085131503

提示:
1、解鎖需要使用固定定時器登錄60秒(60000毫秒)
2、查詢登錄狀態(未登錄)需要把登錄請求刪除
  • multipart/from-data

image-20240626090041816

  • 普通form

image-20240626085922190

  • 認證

image-20240626091200391

  • 三方開戶

image-20240627081928590

難點:分析正則提取公式

image-20240626220431897

結論:提取的數據不一樣,其他都一樣

表達式編寫

image-20240626221609789

input name\\u003d\\u0027(.*?)\\u0027 type\\u003d\\u0027hidden\\u0027 value\\u003d\\u0027(.*?)\\u0027

image-20240627081956515

  • 請求引用

image-20240627082032319

  • 擴展unicode編碼
https://tool.chinaz.com/tools/Unicode.aspx

image-20240627082139535

  • 充值

image-20240627090738771

提示:
1、后臺充值必須先登錄在請求圖片驗證碼,最后調用后臺充值
2、三方充值和三方開戶一模一樣,直接復制即可。
  • 投資

image-20240627090922786

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41531.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習筆記——交通安全分析14

目錄 前言 當天學習筆記整理 5城市主干道交通安全分析 結束語 前言 #隨著上一輪SPSS學習完成之后,本人又開始了新教材《交通安全分析》的學習 #整理過程不易,喜歡UP就點個免費的關注趴 #本期內容接上一期13筆記 當天學習筆記整理 5城市主干道交…

Avalonia中的Property

文章目錄 前言附加屬性樣式屬性直接屬性總結前言 在WPF中, 是可以定義依賴屬性和附加屬性的 依賴屬性: 當您需要單獨創建控件時, 并且希望控件的某個部分能夠支持數據綁定時, 你則可以使用到依賴屬性。 通過DependencyProperty.Register注冊依賴屬性 附加屬性: 這種情況很多,…

【原理+使用】DeepCache: Accelerating Diffusion Models for Free

論文:arxiv.org/pdf/2312.00858 代碼:horseee/DeepCache: [CVPR 2024] DeepCache: Accelerating Diffusion Models for Free (github.com) 介紹 DeepCache是一種新穎的無訓練且幾乎無損的范式,從模型架構的角度加速了擴散模型。DeepCache利…

【因果推斷】優惠券政策對不同店鋪的影響

這次依然是用之前rossmann店鋪競賽的數據集。 之前的數據集探索處理在這里已經做過了,此處就不再贅述了CSDN鏈接 數據集地址:競賽鏈接 這里探討數據集中Promo2對于每家店鋪銷售額的影響。其中,Promo2是一個基于優惠券的郵寄活動,發…

SQL Server 2022 中的 Tempdb 性能改進非常顯著

無論是在我的會話中還是在我寫的博客中,Tempdb 始終是我的話題。然而,當談到 SQL Server 2022 中引入的重大性能變化時,我從未如此興奮過。他們解決了我們最大的性能瓶頸之一,即系統頁面閂鎖并發。 在 SQL Server 2019 中&#x…

三級_網絡技術_06_IP地址規劃技術

1.下列對IPv6地址表示中,錯誤的是()。 AE1A:0:0:0:0:A2:F3:FE08:5 E3E0::1A90:FE:0:4CA2:9C5C E2C1::0:0:81/48 :E140:1A5C:0:05D9 2.下列對IPv6地址表示中,錯誤的是()。 1F1A:0:0:0:0:A2:F3:FE08:3 E360::2A90:FE:0:4CA2:9C5A B2C1::0:0:81/48 …

Go語言如何入門,有哪些書推薦?

Go 語言之所以如此受歡迎,其編譯器功不可沒。Go 語言的發展也得益于其編譯速度夠快。 對開發者來說,更快的編譯速度意味著更短的反饋周期。大型的 Go 應用程序總是能在幾秒鐘之 內完成編譯。而當使用 go run編譯和執行小型的 Go 應用程序時,其…

如何利用Github Action實現自動Merge PR

我是螞蟻背大象(Apache EventMesh PMC&Committer),文章對你有幫助給項目rocketmq-rust star,關注我GitHub:mxsm,文章有不正確的地方請您斧正,創建ISSUE提交PR~謝謝! Emal:mxsmapache.com 1. 引言 GitHub Actions 是 GitHub 提供的一種強大而靈活的自…

(九)Docker 的網絡通信

文章目錄 1、常用模式2、概念了解2.1、Docker 內容器的通信2.2、宿主機和 Docker容器的通信 1、常用模式 直接使用 端口映射,宿主機:宿主機端口->容器 ip:容器端口端口映射宿主機 hosts 映射,首先在宿主機 /etc/hosts文件中增加 宿主機 ip:容器 host…

Mojo: 輕量級Perl框架的魔力

在Perl的豐富生態系統中,Mojolicious(簡稱Mojo)是一個輕量級的實時Web框架,以其極簡的API和強大的功能而受到開發者的喜愛。Mojo不僅適用于構建高性能的Web應用,還可以用來編寫簡單的腳本和命令行工具。本文將帶你探索…

SSM中小學生信息管理系統 -計算機畢業設計源碼02677

摘要 隨著社會的發展和教育的進步,中小學生信息管理系統成為學校管理的重要工具。本論文旨在基于SSM框架,采用Java編程語言和MySQL數據庫,設計和開發一套高效、可靠的中小學生信息管理系統。中小學生信息管理系統以學生為中心,通過…

赤壁之戰的烽火臺 - 觀察者模式

“當烽火連三月,家書抵萬金;設計模式得其法,千軍如一心。” 在波瀾壯闊的三國歷史長河中,赤壁之戰無疑是一場改變乾坤的重要戰役。而在這場戰役中,一個看似簡單卻至關重要的系統發揮了巨大作用——烽火臺。這個古老的…

UNION、UNION ALL、INTERSECT、MINUS

UNION、UNION ALL、INTERSECT、MINUS? 說明 UNION:對兩個結果集進行并集操作,不包括重復行,同時進行默認規則的排序;IUNION ALL:對兩個結果集進行并集操作,包括重復行,不進行排序&am…

OpenAI的崛起:從夢想到現實

OpenAI的崛起不僅是人工智能領域的重大事件,也是科技史上一個引人注目的篇章。本文將深入探討OpenAI從創立到如今的演變過程,分析其成功的關鍵因素,以及未來的發展方向。 一、OpenAI的初創期:理想主義與混亂并存 OpenAI成立于20…

插入排序——C語言

假設我們現在有一個數組,對它進行排序,插入排序的算法如同它的名字一樣,就是將元素一個一個插入到合適的位置,那么,該如何做呢? 如果我們要從小到大進行排序的話,步驟如下: 1.對于…

區間最值問題-RQM(ST表,線段樹)

1.ST表求解 ST表的實質其實是動態規劃&#xff0c;下面是區間最小的遞歸公式&#xff0c;最大只需將min改成max即可 f[i][j] min(f[i][j - 1], f[i (1 << j - 1)][j - 1]); 二維數組的f[i][j]表示從i開始連續2*j個數的最小/大值。 例如&#xff1a;我們給出一個數組…

uniapp啟動安卓模擬器mumu

mumu模擬器下載 ADB&#xff1a; android debug bridge &#xff0c; 安卓調試橋&#xff0c;是一個多功能的命令行工具&#xff0c;他使你能夠與連接的安卓設備進行交互 # adb連接安卓模擬器 adb connect 127.0.0.1:port # 查看adb設備 adb deviceshubuilderx 有內置的adb&a…

MSPM0G3507——滴答定時器和普通定時

滴答定時器定時&#xff1a;&#xff08;放在主函數即可&#xff09; volatile unsigned int delay_times 0;//搭配滴答定時器實現的精確ms延時 void delay_ms(unsigned int ms) {delay_times ms;while( delay_times ! 0 ); } //滴答定時器中斷 void SysTick_Handler(…

Kubernets Apiserver IP 段變更后的故障處理

集群Service IP 段變更后&#xff08;從 10.96.0.0/16 變為 10.17.0.0/16&#xff09;&#xff0c;導致 kubernetes.default.svc 的ClusterIP IP &#xff08;10.96.0.1&#xff09;和段范圍不一樣&#xff0c;對于這個情況&#xff0c;需要重建該 svc。 重建方法很簡單&#…