simple-pytest?框架使用教程
一、框架介紹
簡(jiǎn)介
simple-pytest 框架主要參考了httprunner的yaml數(shù)據(jù)驅(qū)動(dòng)部分設(shè)計(jì)思路,是基于 Pytest + Pytest-html+ Log + Yaml + Mysql 實(shí)現(xiàn)的簡(jiǎn)易版接口自動(dòng)化框架。與httprunner不同的是,httprunner是個(gè)封裝好的工具包,simple-pytest 是半封裝的腳本,目的是讓用戶自己更容易學(xué)習(xí)Pytest工具,理解框架設(shè)計(jì)。
框架理念:
1、一個(gè)yaml就是一個(gè)接口,包含了接口的請(qǐng)求,斷言等信息。
2、腳本執(zhí)行使用pytest+python代碼做邏輯處理,更加方便喜歡寫代碼的同學(xué)
3、讓新手同學(xué)更加全面的理解pytest框架
4、為了
在學(xué)這個(gè)框架前,必備的一點(diǎn)常識(shí)是:
1、python基礎(chǔ)語法
2、pytest基礎(chǔ)包括用例執(zhí)行,夾具使用等
框架地址
gitee: https://gitee.com/itestxs/simple-pytest
二、實(shí)現(xiàn)功能
- yaml數(shù)據(jù)驅(qū)動(dòng):實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)隔離
- 用例標(biāo)簽:在py腳本中可以通過case_tag做用例過濾
- 全局變量池:實(shí)現(xiàn)接口之間的關(guān)聯(lián)取值
- 多斷言:支持==,!=等多種斷言,支持jsonpath的取值方式
- sql數(shù)據(jù)庫(kù)斷言: 直接在yaml測(cè)試用例中寫入查詢的sql即可斷言,無需編寫代碼
- 自動(dòng)生成用例代碼: 在yaml文件中填寫好測(cè)試用例, 可以轉(zhuǎn)換為py腳本。
三、目錄結(jié)構(gòu)
- config ====>> 項(xiàng)目配置文件redis,mysql等 - data ====>> 測(cè)試數(shù)據(jù)文件管理 - logs ====>> 日志記錄 - reports ====>> 結(jié)果報(bào)告,包括html - test_cases ====>> 測(cè)試用例 ├── confset.py ====>> 測(cè)試夾具 - utils ====>> 各種工具類 ├── assertion ====>> 斷言工具 - pytest.ini ====>> pytest配置文件 - conftest.py ====>> 全局夾具配置 - requirements.txt ====>> 相關(guān)依賴包文件 - run.py ====>> 執(zhí)行用例入口文件
四、依賴庫(kù)
requests==2.28.1 jsonpath==0.82 fastapi==0.88.0 pymysql==1.0.2 pyyaml==5.4.1 pytest==7.4.3 pytest-html==4.1.1 py==1.11.0
五、啟動(dòng)方式
1、先安裝pip install requirements.txt
2、啟用utils下的shopping_mock模塊
3、運(yùn)行run.py文件,然后,查看report的結(jié)果報(bào)告即可。
六、使用教程
1、快速開始
1.1、創(chuàng)建用例:
在data目錄下創(chuàng)建yaml文件
主要的字段格式如下:
title:接口名字
base_url:域名地址,不填則默認(rèn)取得setting的BASE_URL,如果填寫了,則直接獲取填寫的
path:接口請(qǐng)求地址
method:請(qǐng)求方法
request_data:統(tǒng)一的請(qǐng)求參數(shù),比如headers
cases:測(cè)試用例集合
case_name:測(cè)試用例名字,支持多個(gè)case_name年編寫
case_tag:支持參數(shù)avl、dis、only 不填則為avl。其中avl就是可用的意思,dis不可用,only是代表只有當(dāng)前用例生效。如果只傳入only,則其他用例則不被執(zhí)行,優(yōu)先級(jí)是only>dis>avl
。也可以自定義打tag
json:接口的請(qǐng)求體,可以直接輸入字典格式(自動(dòng)生成的用例不是字典格式)。請(qǐng)注意yaml的格式
params:接口的url請(qǐng)求參數(shù)。(待補(bǔ)充用例)
assert:斷言,status_code是斷言請(qǐng)求狀態(tài)碼。$.data
是jsonpath的表達(dá)式,目前僅支持改表達(dá)式寫法。目前支持的斷言方式請(qǐng)?jiān)?code>assert_type.py里查看包含,大于、不等于、等于一系列判斷
sql:該case關(guān)聯(lián)的sql,可以將該sql用來做前置還是以及后置
extract_sql:提起該sql的返回內(nèi)容的某個(gè)字段存在變量池中,$.id 也是jsonpath表達(dá)式
assert_sql:sql的斷言,用法同assert
yaml 模板用例如下:
title: "查詢商品" base_url: $config{BASE_URL} path: /items method: GET request_data: headers: Content-Type: application/json token: $global{token} cases: - case_name: "搜索-正常" # case_tag 支持參數(shù)avl、dis、only 不填則為avl,如果只傳入only,則所有case 只會(huì)返回only的數(shù)據(jù),也可以自定義打tag case_tag: avl assert: - eq: [ status_code, 200 ] - ne: [ $.data, "" ] sql: select * from projectInfo where project="bm-scm" extract_sql: id: $.id assert_sql: - eq: [ $.id, 1 ] - case_name: "搜索-超出范圍" case_tag: avl params: "page=2&limit=10" assert: - eq: [ status_code, 200 ] - eq: [ $.data, [] ]
# login.yaml title: "登錄" path: /login method: POST request_data: headers: Content-Type: application/json cases: - case_name: "登錄-正常" # case_tag 支持參數(shù)avl、dis、only 不填則為avl,如果只傳入only,則所有case 只會(huì)返回only的數(shù)據(jù),也可以自定義打tag case_tag: avl json: {"username": "user1", "password": "password1"} extract: token: $.token assert: - eq: [status_code, 200] - ne: [$.token, ""] - case_name: "登錄-用戶名為空" case_tag: avl json: { "username": "", "password": "password1" } assert: - eq: [status_code, 401] - eq: [$.detail, "Invalid username or password"]
1.2、生成py文件
在utils目錄下的yaml_to_py文件main修改,yaml_to_pys批量轉(zhuǎn)換整個(gè)data文件夾下的yaml文件,yaml_to_py轉(zhuǎn)換指定的yaml文件,參數(shù),cover代表是否覆蓋,傳入true,則會(huì)覆蓋你現(xiàn)有的。
if __name__ == '__main__': yaml_to_pys() # yaml_to_py("login.yaml")
case_datas 為自動(dòng)獲取測(cè)試用例集,可以通過get_case_data(case_tag=“tag”)中的case_tag去過濾特定標(biāo)簽用例。
1.3、運(yùn)行腳本
1.3.1 單個(gè)腳本運(yùn)行
每個(gè)執(zhí)行py腳本都可直接右擊執(zhí)行
1.3.2 全部運(yùn)行
點(diǎn)擊運(yùn)行run文件,可以通過testenv 參數(shù)指定獲取哪個(gè)環(huán)境的配置。
1.4 報(bào)告查看
如果是單個(gè)配置,則直接在當(dāng)前test_cases目錄下就可以看到,如果是run腳本執(zhí)行,則報(bào)告統(tǒng)一放在reports
目前的報(bào)告格式是pytest-html。如果要用allure,則可以自己修改使用。
2、功能介紹
2.1、單個(gè)接口http請(qǐng)求與斷言
response = HttpRequest.simple_request(case_data) Assert(response, case_data.get("assert")).assert_util
#!/usr/bin/env python # -*- coding: utf-8 -*- import pytest from utils.assertion.assert_util import Assert from utils.http_request import HttpRequest from utils.read_file_data import ReadFileData class TestLogin(): case_datas = ReadFileData("login.yaml").get_case_data() # get_case_data("tag") 自定義tag輸入 @pytest.mark.parametrize('case_data', case_datas, ids=generate_ids(case_datas)) def test_login(self, case_data): response = HttpRequest.simple_request(case_data) Assert(response, case_data.get("assert")).assert_util if __name__ == '__main__': pytest.main(["test_login.py"])
2.2、長(zhǎng)鏈路業(yè)務(wù)http請(qǐng)求與斷言
該功能是添加購(gòu)車然后付款的流程。 彼此之間有接口依賴問題,通常解決依賴問題有兩種
- 第一種:使用框架自帶的merge_cases_data函數(shù)
test_data = merge_cases_data(add_carts_data, order_pays_data) # 將多個(gè)用例合并。merge_cases_data 是依賴接口合并,有兩個(gè)默認(rèn)規(guī)則,如果兩個(gè)接口用例數(shù)一樣多的,如[x,y],[A,B]那用例合并后結(jié)果就是[x,A] ,[y,B],如果兩個(gè)接口用例數(shù)不一樣,如[x] [A,B]那結(jié)果就是[x,A],[x,B],如[x,y] [A]那結(jié)果就是[x,A],[y,A]。
- 第二種:自己編寫代碼邏輯。
每個(gè)yaml就是一個(gè)接口。獲取每個(gè)yaml的接口數(shù)據(jù),然后獲取用例后if else邏輯。如果接口之前有變量依賴,請(qǐng)借助全局變量去取。
import pytest from utils.assertion.assert_util import Assert from utils.http_request import HttpRequest from utils.merge_cases import merge_cases_data, generate_ids from utils.read_file_data import ReadFileData class TestAddPay(): add_carts_data = ReadFileData("add_carts.yaml").get_case_data() # get_case_data("tag") 自定義tag輸入 order_pays_data = ReadFileData("order_pays.yaml").get_case_data() test_data = merge_cases_data(add_carts_data, order_pays_data) # 將多個(gè)用例合并 print("testdata",test_data) @pytest.mark.parametrize('add_carts_data,order_pays_data', test_data, ids=generate_ids(test_data,"merge")) def test_add_pay(self, add_carts_data, order_pays_data): add_carts_response = HttpRequest.simple_request(add_carts_data) # print(add_carts_response.json()) Assert(add_carts_response, add_carts_data.get("assert")).assert_util order_pays_response = HttpRequest.simple_request(order_pays_data) # print(order_pays_response.json()) Assert(order_pays_response, order_pays_data.get("assert")).assert_util if __name__ == '__main__': pytest.main(["test_add_pay.py"])
2.3、數(shù)據(jù)庫(kù)斷言
需要提前在config配置settings的MYSQL_CONFIG參數(shù)
data = SqlRequest.sql_request(case_data) Assert(data, case_data.get("assert_sql")).sql_assert_util
如果要講數(shù)據(jù)庫(kù)字段提取出來,則寫在
GlobalVars.update_global_vars(key=“data”, value=data) # 將參數(shù)手動(dòng)添加到公共變量中
import json import pytest from utils.assertion.assert_util import Assert from utils.global_vars import GlobalVars from utils.http_request import HttpRequest from utils.read_file_data import ReadFileData from utils.sql_reqeust import SqlRequest class TestSearch(): case_datas = ReadFileData("search_items.yaml").get_case_data() # get_case_data("tag") 自定義tag輸入 print(case_datas) @pytest.mark.parametrize('case_data', case_datas, ids=generate_ids(case_datas)) def test_search_items(self, case_data): response = HttpRequest.simple_request(case_data) print(response.json()) Assert(response, case_data.get("assert")).assert_util # demo1-數(shù)據(jù)庫(kù)斷言寫法 # from utils.mysql_manager import db # 注意一定要在測(cè)試用例中引用,要不然會(huì)連接不上數(shù)據(jù)庫(kù) # data = db.select_db('select * from projectInfo where project="bm-scm"') # print("data",data) # GlobalVars.update_global_vars(key="data", value=data) # 將參數(shù)手動(dòng)添加到公共變量中 # assert data["id"] == 1 # demo2-數(shù)據(jù)庫(kù)斷言寫法 data = SqlRequest.sql_request(case_data) print("data", data) GlobalVars.update_global_vars(key="data", value=data) # 將參數(shù)手動(dòng)添加到公共變量中 Assert(data, case_data.get("assert_sql")).sql_assert_util if __name__ == '__main__': pytest.main(["test_search_items.py"])
2.4、變量設(shè)置
主要的變量有兩種,一個(gè)是全局變量,主要是接口數(shù)據(jù)庫(kù)字段等值的傳參使用。一個(gè)是配置變量,拿去配置里的信息。
2.4.1、全局變量
使用用法:使用$global{}關(guān)鍵字獲取
$global{token}
以上例子是獲取全局變量中token的變量注意
:全局變量如果命名重復(fù)會(huì)導(dǎo)致值被替換,請(qǐng)使用不同的變量名。
2.4.2 系統(tǒng)配置變量
配置變量獲取的是config里的setting值,啟動(dòng)的時(shí)候,會(huì)自動(dòng)獲取當(dāng)前環(huán)境的配置
$config{BASE_URL}
2.5 前后置處理
目前前后置處理由用戶自己處理,較為常用的用法是,使用pytest的夾具功能
2.6 環(huán)境配置切換
使用testenv參數(shù)即可切換生產(chǎn)以及測(cè)試環(huán)境的配置。默認(rèn)不填的情況下,使用的是測(cè)試環(huán)境的配置。配置讀取的是settings里的信息
2.7 文件讀取
read_file_data提供函數(shù),支持讀取json、yaml、csv、txt等文件
2.8 通知
在config settings下配置project、feishu_key信息,運(yùn)行run腳本,即可發(fā)送飛書通知,注意只有運(yùn)行run腳本才可以發(fā)送飛書通知
到此這篇關(guān)于simple-pytest 框架使用指南的文章就介紹到這了,更多相關(guān)simple-pytest 使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python matplotlib超詳細(xì)教程實(shí)現(xiàn)圖形繪制
matplotlib 模塊不僅提供了繪制統(tǒng)計(jì)圖表的功能,還支持繪制圓形、正方形、矩形等各種圖形。這篇文章主要為大家詳細(xì)介紹了利用matplotlib.patches 繪制一些基本圖形,快來跟隨小編一起學(xué)習(xí)吧2021-12-12基于Python2、Python3中reload()的不同用法介紹
今天小編就為大家分享一篇基于Python2、Python3中reload()的不同用法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Matplotlib可視化之添加讓統(tǒng)計(jì)圖變得簡(jiǎn)單易懂的注釋
今天給大家?guī)淼奈恼率顷P(guān)于Python的,文章圍繞著Python Matplotlib可視化展開,文中非常詳細(xì)的介紹了如何給統(tǒng)計(jì)圖添加注釋,需要的朋友可以參考下2021-06-06python請(qǐng)求域名requests.(url = 地址)報(bào)錯(cuò)
本文主要介紹了python請(qǐng)求域名requests.(url = 地址)報(bào)錯(cuò),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02微軟開源最強(qiáng)Python自動(dòng)化神器Playwright(不用寫一行代碼)
這篇文章主要介紹了微軟開源最強(qiáng)Python自動(dòng)化神器Playwright(不用寫一行代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01