接口相關理論
- ui功能測試和接口測試哪個先執行?–為什么
結論:接口測試先執行
原因:ui功能測試需要等待前端頁面開發完成、后臺接口開發完后且前端與后端聯調完成。
- ui功能測試與接口測試的區別?
ui功能:功能調用(前端jS、服務器端)+頁面布局+兼容
接口測試:完整的測試服務端功能驗證。
- ui功能測試和接口測試哪個更高效?–為什么
結論:接口測試更高
原因:接口測試只測服務端功能以及沒有多頁面操作因素。
金融項目
測試對象:投資業務接口
待測接口
1、注冊登錄注冊圖片驗證碼接口注冊手機驗證碼接口注冊接口登錄接口查詢登錄狀態接口
2、認證開戶充值認證接口查詢認證狀態請求后臺開戶接口三方開戶接口請求充值驗證碼接口請求后臺充值接口請求三方充值接口
3、投資請求后臺投資接口三方投資接口
4、投資業務注冊圖片驗證碼接口注冊手機驗證碼接口注冊接口登錄接口認證接口請求后臺開戶接口三方開戶接口請求充值驗證碼接口請求后臺充值接口請求三方充值接口請求后臺投資接口三方投資接口
接口如何測試?
- 設計用例
- 使用工具
可視化工具: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屬性值為參數值。
測試點提取
- 注冊圖片驗證碼、注冊驗證碼
- 注冊
- 登錄
- 開戶認證
- 充值
- 投資
測試用例
- 注冊圖片驗證碼、注冊短信驗證碼
- 注冊
- 登錄
- 認證開戶
- 充值
- 投資
- 投資業務
環境說明
1、項目環境
2、測試工具環境
項目環境搭建
- 環境部署主要步驟
- 三方接口如何解決?
使用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');
腳本編寫
- 獲取圖片驗證碼、獲取短信驗證碼
注意:
1、隨機數為空、隨機數為字符串,響應狀態碼為400,404,如果需要變綠,就需要加斷言且勾選"忽略狀態"
2、獲取短信驗證碼依賴圖片驗證碼,需要先請求圖片驗證碼,添加cookie管理器進行關聯。
- 注冊腳本
提示:
1、密碼為空、未同意條款為缺陷
2、注冊接口中手機號必須和獲取短信驗證碼接口手機號一致。
- 登錄腳本
提示:
1、解鎖需要使用固定定時器登錄60秒(60000毫秒)
2、查詢登錄狀態(未登錄)需要把登錄請求刪除
- multipart/from-data
- 普通form
- 認證
- 三方開戶
難點:分析正則提取公式
結論:提取的數據不一樣,其他都一樣
表達式編寫
input name\\u003d\\u0027(.*?)\\u0027 type\\u003d\\u0027hidden\\u0027 value\\u003d\\u0027(.*?)\\u0027
- 請求引用
- 擴展unicode編碼
https://tool.chinaz.com/tools/Unicode.aspx
- 充值
提示:
1、后臺充值必須先登錄在請求圖片驗證碼,最后調用后臺充值
2、三方充值和三方開戶一模一樣,直接復制即可。
- 投資