亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Pytest自動化測試框架實(shí)戰(zhàn):從接口到UI的完整落地指南

Pytest自動化測試框架實(shí)戰(zhàn):從接口到UI的完整落地指南 這一兩年我面試過不少測試崗位的候選人幾乎每個(gè)人簡歷上都寫著“熟悉自動化測試”可細(xì)問下去能把手里的框架講明白的并不多。這不能全怪個(gè)人自動化測試的門檻不在工具本身而在你能不能把一個(gè)框架真正用起來、用好。今天我想聊聊 Pytest這個(gè)在 Python 自動化測試圈子里被用得最多、也最值得花時(shí)間掌握的測試框架。Pytest 之所以能在 unittest、nose 等一堆老牌框架里殺出重圍靠的不是花哨的功能而是它對“測試”這件事的理解足夠樸素測試就是普通函數(shù)加斷言寫起來沒有任何心理負(fù)擔(dān)。但等你真正深入進(jìn)去又會發(fā)現(xiàn)它背后藏著一套非常強(qiáng)大的插件機(jī)制和夾具系統(tǒng)。這篇文章我會從框架選型聊到接口自動化、UI 自動化的實(shí)際落地全程帶例子、帶參數(shù)、帶踩坑記錄希望能幫正在學(xué)自動化測試或者準(zhǔn)備搭建測試框架的朋友少走點(diǎn)彎路。1. 為什么是 Pytest自動化測試框架選型背后的考量1.1 從手工測試到自動化測試框架到底解決什么問題很多人對測試框架有一個(gè)誤解以為框架的價(jià)值就是“能跑用例”。其實(shí)手工測試也能跑用例你寫一百個(gè) if 判斷也一樣能出結(jié)果??蚣苷嬲鉀Q的是三個(gè)問題可維護(hù)性、可讀性、可擴(kuò)展性。先聊可維護(hù)性。沒有框架的時(shí)代測試代碼長什么樣通常是一個(gè)腳本從頭跑到尾數(shù)據(jù)、步驟、斷言全塞在一起。改一個(gè)需求你得從頭到尾捋一遍代碼生怕哪里邏輯被帶偏。而 Pytest 這種框架強(qiáng)制你把測試拆成一個(gè)個(gè)獨(dú)立的用例函數(shù)每個(gè)函數(shù)只干一件事互不干擾改起來就是“啃個(gè)雞腿”的功夫。再聊可讀性。Pytest 把斷言簡化成了 Python 原生的assert語句用例寫出來跟白話文一樣。比如你要校驗(yàn)接口返回的 code 是 200直接寫assert resp.status_code 200就行任何人來看都能秒懂這條用例在測什么。這比 unittest 那套assertEqual寫法要清爽太多了。最后是可擴(kuò)展性。Pytest 從設(shè)計(jì)之初就留好了插件的口子你可以在不修改框架源碼的前提下通過 conftest.py 和 fixture 機(jī)制把登錄態(tài)、數(shù)據(jù)庫連接、測試數(shù)據(jù)準(zhǔn)備這些公共邏輯全部抽離出來。這種“把重復(fù)勞動交給框架把精力留給業(yè)務(wù)”的思路才是自動化測試能長期跑下去的根基。1.2 Pytest 與 unittest、Robot Framework 的選型對比學(xué)習(xí)自動化測試的人一定會遇到“框架選擇困難癥”。我的建議很直接Python 生態(tài)里做接口自動化和 UI 自動化Pytest 是第一梯隊(duì)的選擇幾乎沒有之一。為了讓你信服把幾個(gè)常用的框架放在同一張表里對比一下對比維度PytestunittestRobot Framework用例編寫方式普通函數(shù) assert類 斷言方法表格關(guān)鍵字驅(qū)動學(xué)習(xí)曲線平緩會 Python 基礎(chǔ)就能上手平緩但代碼冗余陡峭關(guān)鍵字語法需要額外學(xué)習(xí)參數(shù)化支持內(nèi)建 pytest.mark.parametrize功能強(qiáng)大需要額外封裝通過模板和參數(shù)文件實(shí)現(xiàn)插件生態(tài)非常豐富xdist、rerun、allure 等生態(tài)一般擴(kuò)展能力弱有庫和關(guān)鍵字但靈活度低斷言失敗信息非常詳細(xì)自動對比期望值和實(shí)際值提示相對簡單依賴關(guān)鍵字實(shí)現(xiàn)信息有限適合場景接口、UI、單元測試通吃簡單單元測試、老項(xiàng)目維護(hù)測試團(tuán)隊(duì)非技術(shù)背景偏多這里面最關(guān)鍵的一個(gè)差距是參數(shù)化。接口測試十有八九是數(shù)據(jù)驅(qū)動的場景同一套邏輯要跑幾十組輸入輸出。unittest 做參數(shù)化要么循環(huán)套循環(huán)要么寫一堆子類代碼難看得很。Pytest 直接用pytest.mark.parametrize裝飾器就能搞定參數(shù)列表一目了然失敗時(shí)還能精確定位到是哪一組數(shù)據(jù)出了問題。這個(gè)體驗(yàn)上的差距你在實(shí)際工程里跑兩天就能感受出來。2. Pytest 核心機(jī)制拆解從安裝到第一個(gè)測試用例2.1 環(huán)境準(zhǔn)備與安裝Pytest 的安裝非常省心Python 3.7 以上的環(huán)境直接跑一條命令pip install pytest裝完驗(yàn)證一下版本確認(rèn)環(huán)境沒有問題pytest --version我習(xí)慣在虛擬環(huán)境里裝避免把系統(tǒng) Python 搞亂了。用 venv 或者 conda 的都行這不是什么復(fù)雜的操作但能避免很多后面才爆出來的依賴沖突。如果你的項(xiàng)目里已經(jīng)用了 requirements.txt直接往里面加一行pytest8.x.x鎖定版本團(tuán)隊(duì)協(xié)作時(shí)大家環(huán)境一致排查問題會省不少事。如果你的 Python 環(huán)境里既有 unittest 又有 pytest裝完之后默認(rèn)執(zhí)行 pytest 命令是沒有沖突的兩個(gè)框架可以在同一個(gè)項(xiàng)目里并存。不過我不建議混著用測試體系最怕風(fēng)格不統(tǒng)一選一個(gè)就用到底。2.2 測試用例編寫規(guī)則與斷言技巧Pytest 對用例的識別有一套約定最核心的規(guī)則是測試文件命名為test_*.py或*_test.py測試函數(shù)命名為test_*測試類命名為Test*且類中沒有__init__方法按照這個(gè)規(guī)則寫Pytest 就能自動發(fā)現(xiàn)用例。一個(gè)最簡單的測試用例長這樣# test_demo.py def test_addition(): assert 1 1 2 def test_string_contains(): name pytest assert test in name寫斷言的時(shí)候有幾個(gè)小技巧是新手容易忽略的。先看字符串?dāng)嘌匀绻阆胄r?yàn)字符串里包含某個(gè)子串直接assert test in name即可但如果斷言失敗Pytest 只會告訴你assert test in pytttt不會告訴你到底哪里不一樣。想要更詳細(xì)的失敗信息可以用assert test in name, 期望 name 中包含 test實(shí)際值是 {name}把上下文信息打印出來。再來看異常斷言。如果你在測試一個(gè)函數(shù)它應(yīng)該在某個(gè)條件下拋出ValueError直接這么寫import pytest def divide(a, b): if b 0: raise ValueError(除數(shù)不能為 0) return a / b def test_divide_by_zero(): with pytest.raises(ValueError, match除數(shù)不能為 0): divide(10, 0)這種寫法比你用 try-except 包一層再自己做判斷要干凈得多而且pytest.raises的match參數(shù)還能幫你校驗(yàn)異常信息里是否有特定關(guān)鍵詞配合正則表達(dá)式用非常強(qiáng)大。2.3 用例運(yùn)行與收集機(jī)制運(yùn)行測試用例的命令幾行就能說清# 運(yùn)行當(dāng)前目錄下所有用例 pytest # 運(yùn)行指定文件 pytest test_demo.py # 運(yùn)行指定文件中的指定函數(shù) pytest test_demo.py::test_addition # 按關(guān)鍵字篩選用例 pytest -k addition or contains # 顯示詳細(xì)輸出 pytest -v這里-k參數(shù)特別適合調(diào)試階段。比如我今天只改了登錄相關(guān)的邏輯想快速跑一遍所有登錄相關(guān)用例直接pytest -k login就夠了不用傻乎乎地跑全量用例。另外配合-x參數(shù)可以讓用例在第一次失敗時(shí)立刻停止適合在本地快速排查問題時(shí)用而--maxfail2則允許第一次失敗后繼續(xù)跑最多收集到第 2 個(gè)失敗才停下。關(guān)于用例收集機(jī)制有個(gè)點(diǎn)必須提Pytest 默認(rèn)會遞歸搜索當(dāng)前目錄下所有符合條件的文件。如果你的項(xiàng)目里某些目錄不需要跑測試比如build、venv這類一定要記得在pytest.ini里用norecursedirs把它排除掉否則你每次跑測試都會被一堆無關(guān)文件拖慢速度嚴(yán)重的時(shí)候還會因?yàn)閷?dǎo)入錯(cuò)誤導(dǎo)致整個(gè)測試會話崩潰。我的pytest.ini一般長這樣[pytest] testpaths tests norecursedirs venv build dist .git3. fixture 機(jī)制詳解Pytest 的靈魂功能3.1 fixture 基礎(chǔ)用裝飾器管理測試前后置如果說 Pytest 只能讓你記住一個(gè)功能那一定是 fixture。fixture 說白了就是測試用例的前置條件和后置清理但它的設(shè)計(jì)比 unittest 的 setUp/tearDown 靈活太多。先看一個(gè)最基礎(chǔ)的用法。假設(shè)每個(gè)測試用例執(zhí)行前都需要?jiǎng)?chuàng)建一個(gè)臨時(shí)數(shù)據(jù)庫連接測試完關(guān)閉這個(gè)連接import pytest pytest.fixture def db_connection(): # 前置操作創(chuàng)建連接 conn create_database_connection() yield conn # 后置操作關(guān)閉連接 conn.close() def test_query_user(db_connection): user db_connection.query(SELECT * FROM users WHERE id1) assert user is not None注意這里的關(guān)鍵詞是yield。yield之前的代碼就是前置操作yield之后的代碼就是后置清理。為什么用yield而不是return因?yàn)閥ield能讓你在測試用例跑完之后繼續(xù)執(zhí)行清理邏輯。這比 unittest 的tearDown單獨(dú)寫一個(gè)方法要清晰得多前后置邏輯離得近一眼就能看懂。3.2 conftest.py 與作用域控制fixture 寫在哪、怎么共享這是很多新手容易繞暈的地方。Pytest 的規(guī)則是conftest.py文件里的 fixture 可以被同目錄及其子目錄下的所有測試文件使用。所以一般項(xiàng)目里會把公共 fixture 放在測試根目錄下的conftest.py中。fixture 的scope參數(shù)控制它的生命周期一共有 5 種scope 取值生命周期適用場景function每個(gè)測試函數(shù)執(zhí)行前創(chuàng)建執(zhí)行后銷毀默認(rèn)值最安全一般都用它c(diǎn)lass每個(gè)測試類只執(zhí)行一次類級共享資源module每個(gè)測試模塊只執(zhí)行一次模塊級共享資源package每個(gè)測試包只執(zhí)行一次包級共享資源session整個(gè)測試會話只執(zhí)行一次登錄 token、全局配置等我舉一個(gè)具體的例子接口測試中的登錄 token。如果每個(gè)用例都重新登錄一遍不僅浪費(fèi)時(shí)間還可能被服務(wù)器的防刷機(jī)制給攔截。這時(shí)候把scope設(shè)為session整個(gè)測試過程只登錄一次所有用例共用同一個(gè) tokenimport pytest import requests pytest.fixture(scopesession) def auth_token(): resp requests.post(https://api.example.com/login, json{ username: admin, password: 123456 }) assert resp.status_code 200 return resp.json()[token]這里有一個(gè)非常關(guān)鍵的經(jīng)驗(yàn)scopesession的 fixture 一旦返回了可變對象比如字典、列表不同測試用例之間可能會互相污染數(shù)據(jù)。我踩過這個(gè)坑有一個(gè)全局配置字典在 A 用例里被改了B 用例跑的時(shí)候直接報(bào)錯(cuò)。后來我養(yǎng)成一個(gè)習(xí)慣session 級別的 fixture 盡量返回不可變數(shù)據(jù)或者每次使用時(shí)做一次深拷貝。3.3 fixture 實(shí)戰(zhàn)接口自動化中的登錄態(tài)管理在一個(gè)真正的接口自動化項(xiàng)目里fixture 怎么用才叫“優(yōu)雅”我給大家拆一個(gè)完整流程。假設(shè)被測系統(tǒng)的所有接口都需要先登錄拿到 token然后請求頭里帶上Authorization字段。公共的邏輯應(yīng)該這樣設(shè)計(jì)# conftest.py import pytest import requests pytest.fixture(scopesession) def base_url(): return https://api.example.com pytest.fixture(scopesession) def auth_token(base_url): resp requests.post(f{base_url}/login, json{ username: admin, password: 123456 }) assert resp.status_code 200 return resp.json()[token] pytest.fixture() def api_client(base_url, auth_token): session requests.Session() session.headers.update({ Authorization: fBearer {auth_token}, Content-Type: application/json }) return session這樣設(shè)計(jì)的好處是層次清晰base_url管環(huán)境地址auth_token管登錄狀態(tài)api_client管請求會話。測試用例里只需要傳入api_client參數(shù)直接發(fā)起請求就行不用關(guān)心登錄和 token 是怎么來的# test_user_api.py def test_get_user_info(api_client, base_url): resp api_client.get(f{base_url}/user/1) assert resp.status_code 200 assert resp.json()[code] 0這種“依賴注入”的思路才是 Pytest fixture 的精髓所在。測試函數(shù)不關(guān)心依賴從哪來只關(guān)心自己需要什么。這比在測試代碼里手動調(diào)用setup_method去初始化請求對象要干凈得多配合 conftest.py 的層級管理復(fù)雜的測試工程也能保持整潔。4. 參數(shù)化與數(shù)據(jù)驅(qū)動讓測試代碼量減少一半4.1 參數(shù)化的基礎(chǔ)用法接口測試中最典型的場景就是同一個(gè)接口輸入不同的參數(shù)組合驗(yàn)證返回結(jié)果是否符合預(yù)期。如果你不用參數(shù)化代碼會長這樣def test_login_success(): assert login(admin, 123456)[code] 0 def test_login_wrong_password(): assert login(admin, wrong)[code] 1001 def test_login_user_not_exist(): assert login(nobody, 123456)[code] 1002三條用例邏輯完全一樣只是數(shù)據(jù)不同。用參數(shù)化重構(gòu)之后import pytest pytest.mark.parametrize(username,password,expected_code, [ (admin, 123456, 0), (admin, wrong, 1001), (nobody, 123456, 1002), ]) def test_login(username, password, expected_code): resp login(username, password) assert resp[code] expected_code一份代碼三組數(shù)據(jù)邏輯只寫一遍。新增用例只需要往列表里加一組元組維護(hù)成本直線下降。如果某組數(shù)據(jù)斷言失敗Pytest 會非常清楚地告訴你是哪一組參數(shù)出了問題定位效率高到飛起。4.2 參數(shù)化與 fixture 結(jié)合的高級用法參數(shù)化雖然好用但有的時(shí)候會出現(xiàn)一個(gè)棘手的問題如果參數(shù)里需要包含 fixture 的返回值怎么辦比如我想對不同的用戶身份做權(quán)限校驗(yàn)測試而用戶 token 來自 fixture。直接混著傳參是不行的因?yàn)?Pytest 無法在parametrize裝飾器里動態(tài)獲取 fixture 的值。有兩個(gè)解決思路。第一種是直接用 fixture 的params參數(shù)pytest.fixture(params[ {role: admin, permission: delete}, {role: user, permission: view}, ]) def user_with_permission(request): return request.param這樣 fixture 會自動根據(jù)params里的每一條數(shù)據(jù)執(zhí)行一次測試用例也就自動多跑了幾遍。第二種思路是借助pytest.fixture加getfixturevalue的動態(tài)引用更靈活但寫法也復(fù)雜一些。不過實(shí)際項(xiàng)目里用第一種就夠了能把 90% 的“參數(shù)與依賴混合”場景解決掉。還有一個(gè)參數(shù)化的小技巧給參數(shù)命名時(shí)用元組的解包方式來寫代碼可讀性會好很多。比如上面的寫法username,password,expected_code一眼就能看出參數(shù)含義比param1,param2,param3這種命名要有價(jià)值得多。另外遇到特別多數(shù)據(jù)的場景建議把參數(shù)列表單獨(dú)抽取到一個(gè)data.py模塊或 JSON/YAML 文件里測試代碼保持干凈測試數(shù)據(jù)方便維護(hù)。這也是數(shù)據(jù)驅(qū)動測試的核心思想——測試邏輯是固定的數(shù)據(jù)是可以隨時(shí)替換的。5. 斷言、標(biāo)記與插件生態(tài)5.1 標(biāo)記機(jī)制跳過、預(yù)期失敗與自定義分組Pytest 的標(biāo)記mark機(jī)制是管理大規(guī)模測試用例的重要工具。最常見的三個(gè)標(biāo)記是skip、xfail和custom。skip用于跳過某些用例。比如某個(gè)接口還在開發(fā)中或者只對特定環(huán)境生效直接跳過pytest.mark.skip(reason接口尚未開發(fā)完成) def test_new_api(): pass pytest.mark.skipif(sys.version_info (3, 8), reason需要 Python 3.8) def test_new_feature(): passxfail表示這個(gè)用例預(yù)計(jì)會失敗。比如你發(fā)現(xiàn)了一個(gè)已知 bug但還沒修復(fù)測試用例跑的時(shí)候會報(bào)錯(cuò)你不想讓整條測試記錄變成失敗可以用xfail標(biāo)記。跑完之后Pytest 會統(tǒng)計(jì)成“預(yù)期失敗”一旦某天 bug 修復(fù)了這個(gè)用例反而通過Pytest 還會用“XPASS”提醒你這個(gè) bug 已經(jīng)解決了該把標(biāo)記去掉了。自定義標(biāo)記能幫你給用例分組。比如接口測試?yán)飬^(qū)分冒煙測試和全量回歸pytest.mark.smoke def test_login(): pass pytest.mark.regression def test_payment(): pass運(yùn)行的時(shí)候用pytest -m smoke只跑冒煙用例pytest -m regression只跑回歸用例。這個(gè)機(jī)制在 CI 流水線里特別有價(jià)值。不過要注意自定義標(biāo)記在使用前需要在pytest.ini里注冊否則會有警告提示。我的做法是統(tǒng)一在配置里維護(hù)一個(gè)標(biāo)記清單[pytest] markers smoke: 冒煙測試用例 regression: 回歸測試用例 p1: 優(yōu)先級 P1 p2: 優(yōu)先級 P25.2 常用插件組合Allure 報(bào)告、多線程與失敗重跑Pytest 的生態(tài)是它最強(qiáng)大的武器之一。我挑幾個(gè)項(xiàng)目里一定會用到的插件展開講講。第一個(gè)是pytest-xdist用來做分布式執(zhí)行。一條命令就能把用例平均分發(fā)到多個(gè) CPU 進(jìn)程上并行跑pip install pytest-xdist pytest -n 4-n 4表示開 4 個(gè)進(jìn)程。如果你的用例里有共享資源比如寫同一個(gè)測試數(shù)據(jù)庫并行執(zhí)行可能會互相干擾。這時(shí)候就要規(guī)劃好數(shù)據(jù)隔離方案。我的習(xí)慣是每個(gè)測試進(jìn)程連接不同的 schema或者用唯一前綴的測試數(shù)據(jù)避免沖突。第二個(gè)是pytest-rerunfailures專門處理不穩(wěn)定用例。UI 測試?yán)锝?jīng)常遇到網(wǎng)絡(luò)抖動、元素加載慢導(dǎo)致的偶發(fā)失敗這種用例手動跑能過自動跑就掛用重跑機(jī)制能減少很多噪音pip install pytest-rerunfailures pytest --reruns 3 --reruns-delay 2這里--reruns 3是失敗后重試 3 次--reruns-delay 2是每次重試前等待 2 秒。要注意的是不要什么都依賴重跑如果一條用例重跑 3 次還是掛那大概率是真實(shí) bug不能靠重跑把問題掩蓋掉。第三個(gè)是allure-pytest生成顏值和實(shí)用性兼?zhèn)涞臏y試報(bào)告pip install allure-pytest pytest --alluredir./allure-results allure generate ./allure-results -o ./allure-reportAllure 報(bào)告能展示每個(gè)用例的步驟、參數(shù)、附帶的截圖、日志還能統(tǒng)計(jì)歷史趨勢。對接口自動化和 UI 自動化項(xiàng)目來說Allure 報(bào)告基本就是標(biāo)配。接入的方式很簡單在 conftest.py 里定義一個(gè) fixture來自動為每個(gè)用例捕獲執(zhí)行信息import allure import pytest pytest.hookimpl(tryfirstTrue, hookwrapperTrue) def pytest_runtest_makereport(item, call): outcome yield report outcome.get_result() if report.when call and report.failed: # 失敗時(shí)自動附加截圖UI 測試場景 if driver in item.funcargs: driver item.funcargs[driver] allure.attach(driver.get_screenshot_as_png(), namescreenshot, attachment_typeallure.attachment_type.PNG)這個(gè)寫法的邏輯在 UI 自動化測試中很常用能在用例失敗時(shí)把瀏覽器截圖自動掛到 Allure 報(bào)告里排查問題會輕松很多。6. 接口自動化測試實(shí)戰(zhàn)從請求封裝到 CI 集成6.1 測試分層接口測試項(xiàng)目目錄結(jié)構(gòu)設(shè)計(jì)很多項(xiàng)目做接口自動化最大的問題不是寫不出用例而是寫著寫著就變成一鍋粥了。200 個(gè)用例全堆在幾個(gè)文件里改一個(gè)接口字段要翻半天代碼。所以我一直強(qiáng)調(diào)先設(shè)計(jì)目錄結(jié)構(gòu)再寫測試代碼。我常用的接口自動化項(xiàng)目結(jié)構(gòu)如下api_test_project/ ├── config/ │ ├── __init__.py │ ├── settings.py # 環(huán)境配置、全局變量 │ └── data.yaml # 測試數(shù)據(jù) ├── common/ │ ├── __init__.py │ ├── request_utils.py # 請求封裝 │ ├── logger.py # 日志模塊 │ └── assert_utils.py # 斷言工具 ├── testcases/ │ ├── __init__.py │ ├── test_user_api.py │ └── test_order_api.py ├── conftest.py # 公共 fixture ├── pytest.ini └── requirements.txt關(guān)鍵點(diǎn)在于把配置、公共方法、測試用例三個(gè)層面徹底分開。配置變了不碰用例代碼公共方法升級不影響單個(gè)用例用例本身只關(guān)心業(yè)務(wù)邏輯和斷言。這樣的結(jié)構(gòu)在項(xiàng)目規(guī)模擴(kuò)大后維護(hù)成本才不會失控。6.2 請求封裝與斷言工具類基于requests庫我做了一層簡單的封裝。不是為了“過度設(shè)計(jì)”而是為了方便統(tǒng)一處理請求日志、超時(shí)重試和異常捕獲# common/request_utils.py import requests import time import logging logger logging.getLogger(__name__) class RequestUtils: def __init__(self, base_url, tokenNone): self.base_url base_url self.session requests.Session() if token: self.session.headers.update({Authorization: fBearer {token}}) def request(self, method, path, **kwargs): url f{self.base_url}{path} kwargs.setdefault(timeout, 10) for attempt in range(3): try: logger.info(f請求: {method} {url} 參數(shù): {kwargs}) response self.session.request(method, url, **kwargs) logger.info(f響應(yīng): {response.status_code} {response.text[:500]}) return response except requests.exceptions.Timeout: if attempt 2: raise time.sleep(2)這里有個(gè)實(shí)測得來的經(jīng)驗(yàn)接口請求超時(shí)時(shí)間不要太長5 到 10 秒足夠。設(shè)個(gè) 30 秒超時(shí)一旦接口出問題測試一直掛在那里整個(gè)回歸排隊(duì)排到天荒地老。timeout10配合 3 次重試既能容忍偶發(fā)的網(wǎng)絡(luò)抖動又不至于在接口真的掛了的時(shí)候無限等下去。斷言這塊針對接口常見的 JSON 返回我封裝了一個(gè)簡單的斷言工具# common/assert_utils.py def assert_code(resp_json, expected_code): assert resp_json.get(code) expected_code, \ fcode 期望 {expected_code}, 實(shí)際 {resp_json.get(code)}, 響應(yīng): {resp_json} def assert_msg(resp_json, expected_msg): assert resp_json.get(msg) expected_msg, \ fmsg 期望 {expected_msg}, 實(shí)際 {resp_json.get(msg)}, 響應(yīng): {resp_json}封裝不是目的減少重復(fù)、提升失敗信息的可讀性才是目的。斷言失敗時(shí)一眼要能看到接口返回了什么東西、和期望值差在哪這樣才能快速定位問題。6.3 結(jié)合 Pytest 的完整接口測試用例把上面的模塊組合起來一個(gè)標(biāo)準(zhǔn)化的接口測試用例是這樣的# testcases/test_user_api.py import allure import pytest from common.request_utils import RequestUtils from common.assert_utils import assert_code allure.feature(用戶模塊) class TestUserAPI: allure.story(獲取用戶信息) pytest.mark.parametrize(user_id,expected_code, [ (1, 0), (99999, 1004), ]) def test_get_user_info(self, api_client, user_id, expected_code): resp api_client.get(f/user/{user_id}) assert resp.status_code 200 assert_code(resp.json(), expected_code) allure.story(更新用戶信息) def test_update_user(self, api_client): payload {nickname: 新名字} resp api_client.put(/user/1, jsonpayload) assert resp.status_code 200 assert_code(resp.json(), 0)這里的api_clientfixture 在前面已經(jīng)定義好了它在 session 級別登錄獲取 token然后封裝好請求對象。測試用例本身非?!案蓛簟弊x起來就是一條業(yè)務(wù)描述加上關(guān)鍵斷言的展開。整條鏈路跑起來的效果是登錄一次所有用例復(fù)用同一個(gè)會話數(shù)據(jù)驅(qū)動管理各種輸入組合Allure 報(bào)告里記錄每一步的請求響應(yīng)。6.4 CI/CD 集成與郵件報(bào)告接口自動化不接入 CI價(jià)值至少打五折。定時(shí)手動跑一次測試跟每次代碼提交后自動跑一遍完全不是一個(gè)概念。接入方式很簡單我用 GitHub Actions 做一個(gè)示例name: API Test on: push: branches: [main] schedule: - cron: 0 2 * * * jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - uses: actions/setup-pythonv4 with: python-version: 3.10 - run: pip install -r requirements.txt - run: pytest tests -n 4 --alluredirallure-results - uses: actions/upload-artifactv3 if: always() with: name: allure-results path: allure-results這個(gè)流水線會在每次主分支代碼推送后自動運(yùn)行同時(shí)每天凌晨 2 點(diǎn)跑一次定時(shí)回歸。測試結(jié)果通過 Allure 插件生成報(bào)告即使用例失敗上傳的 allure-results 也能讓你回溯到具體的失敗請求和響應(yīng)。接入 CI 之后自動化測試才真正變成了團(tuán)隊(duì)的質(zhì)量防線而不是個(gè)人電腦上的一個(gè)腳本。7. UI 自動化測試實(shí)戰(zhàn)Playwright Pytest 的高效協(xié)作7.1 UI 自動化到底難在哪做 UI 自動化的同學(xué)應(yīng)該都有體會UI 用例最大的敵人不是代碼邏輯而是“不穩(wěn)定”。同樣的用例昨天能過今天掛本地能過 CI 上掛唯一能確定的就是它隨時(shí)可能掛。導(dǎo)致不穩(wěn)定的原因無非這幾個(gè)元素定位不穩(wěn)定、頁面加載耗時(shí)不確定、測試環(huán)境影響。Pytest 本身并不能解決 UI 自動化的穩(wěn)定性問題但它的 fixture 機(jī)制和插件生態(tài)能把這種不穩(wěn)定性控制在一個(gè)可接受的范圍內(nèi)。Playwright 是目前 UI 自動化工具里做得比較出色的一款它和 Pytest 的配合度非常高。安裝也比較簡單pip install playwright playwright install chromium7.2 基于 Pytest 的 Playwright fixture 設(shè)計(jì)頁面自動化測試最關(guān)鍵的一個(gè) fixture 是瀏覽器實(shí)例。我的設(shè)計(jì)思路是每個(gè)測試函數(shù)都用獨(dú)立的瀏覽器上下文保證用例之間的數(shù)據(jù)完全隔離但瀏覽器內(nèi)核只需要啟動一次# conftest.py import pytest from playwright.sync_api import sync_playwright pytest.fixture(scopesession) def browser(): with sync_playwright() as p: browser p.chromium.launch(headlessTrue) yield browser pytest.fixture() def page(browser): context browser.new_context() page context.new_page() yield page context.close()這里browser是 session 級別整個(gè)測試過程只啟動一次瀏覽器引擎page是函數(shù)級別每條用例都有自己獨(dú)立的頁面上下文互不干擾。這種設(shè)計(jì)既保證了執(zhí)行效率不用每條用例都重新啟動瀏覽器又保證了用例隔離性頁面狀態(tài)不串。配合 Pytest 的pytest-rerunfailures我可以給 UI 用例加上兩層保護(hù)第一層是顯式等待和智能定位第二層是失敗后的自動重試。但這里要特別強(qiáng)調(diào)重試次數(shù)不要設(shè)置太多2 到 3 次足夠。如果一個(gè)用例重試 3 次還是失敗那大概率是真 bug該報(bào)警就報(bào)警不能讓重試機(jī)制把問題無限吞掉。7.3 UI 自動化中的元素定位與斷言技巧Playwright 的定位器 API 比傳統(tǒng)的 xpath 寫起來更直觀而且自帶等待機(jī)制。比如def test_login_page(page): page.goto(https://example.com/login) page.get_by_label(用戶名).fill(admin) page.get_by_placeholder(請輸入密碼).fill(123456) page.get_by_role(button, name登錄).click() page.wait_for_url(**/dashboard) assert page.title() 控制臺這里wait_for_url是很關(guān)鍵的一步。點(diǎn)完登錄按鈕后頁面要跳轉(zhuǎn)如果立即斷言 URL很可能還是舊的地址。用wait_for_url會讓頁面跳轉(zhuǎn)完成后才繼續(xù)執(zhí)行比硬編碼time.sleep(3)要可靠得多而且執(zhí)行速度更快——頁面 0.5 秒跳轉(zhuǎn)完就繼續(xù)了不用白白等 3 秒。關(guān)于元素定位我有一個(gè)長期踩坑總結(jié)的經(jīng)驗(yàn)優(yōu)先用文本和角色定位get_by_role、get_by_text其次用 label 和 placeholder最后才考慮 CSS 和 XPath。因?yàn)?UI 開發(fā)改代碼時(shí)最穩(wěn)定的往往是元素的文本內(nèi)容和語義角色最不穩(wěn)定的是 CSS 類名和嵌套層級。這個(gè)道理在寫 UI 自動化時(shí)越早明白越好。8. 常見問題與排查技巧實(shí)錄8.1 典型問題速查表問題現(xiàn)象可能原因解決辦法執(zhí)行 pytest 但提示沒有收集到用例文件命名不是 test_.py或函數(shù)名不是 test_檢查文件和函數(shù)命名用pytest --collect-only查看收集結(jié)果fixture 報(bào)錯(cuò) “fixture not found”conftest.py 路徑不對或者 fixture 名稱拼寫錯(cuò)誤把 conftest.py 放在正確層級用pytest --fixtures查看可用 fixture參數(shù)化用例失敗報(bào)錯(cuò)信息不明確參數(shù)列表性能問題或數(shù)據(jù)格式不對先單獨(dú)執(zhí)行該參數(shù)組合定位用-v查看完整參數(shù)信息并行執(zhí)行時(shí)用例互相影響共享了數(shù)據(jù)庫、文件或全局變量每個(gè)進(jìn)程使用獨(dú)立數(shù)據(jù)避免修改全局狀態(tài)UI 用例偶發(fā)失敗本地能過 CI 掛元素加載慢、頁面渲染不穩(wěn)使用顯式等待失敗重試 2~3 次檢查是否為網(wǎng)絡(luò)環(huán)境差異斷言失敗后看不到期望值和實(shí)際值斷言寫得太簡單用自定義斷言消息用 Allure 報(bào)告附加上下文8.2 我踩過的 4 個(gè)高頻坑第一個(gè)坑是 conftest.py 的層級放錯(cuò)了。有一次我把一個(gè) session 級別的 fixture 放在某個(gè)子目錄的 conftest.py 里結(jié)果其他目錄的用例全部報(bào)“fixture not found”。排查了半天才意識到 fixture 的可見范圍是包含其所在目錄及其子目錄的兄弟目錄根本看不到。后來我養(yǎng)成了習(xí)慣公共 fixture 一律放在測試根目錄的 conftest.py子目錄只放該模塊特有的 fixture。第二個(gè)坑是 fixture 返回的可變對象被用例修改了。有一個(gè)用例里對 fixture 返回的列表執(zhí)行了append操作后面運(yùn)行的用例發(fā)現(xiàn)列表里多了一條數(shù)據(jù)斷言掛得很冤。從那以后我對 session 級別的 fixture 特別小心凡是返回可變對象的要么返回不可變版本要么在每個(gè)用例里 copy 一份再操作。第三個(gè)坑是參數(shù)化組合爆炸。一開始圖省事把三個(gè)參數(shù)的所有組合都列在parametrize列表里20 個(gè)參數(shù)組合直接讓測試時(shí)間翻了 3 倍。后來我學(xué)會了在測試數(shù)據(jù)里做篩選冒煙測試環(huán)境只跑關(guān)鍵組合全量回歸才跑完整數(shù)據(jù)組合用標(biāo)記機(jī)制分流執(zhí)行時(shí)間立刻降下來了。第四個(gè)坑很隱蔽是編碼問題。Windows 環(huán)境下跑 pytest用例里包含中文斷言時(shí)控制臺輸出亂碼或直接報(bào) UnicodeDecodeError。后來在pytest.ini里加了一行配置就解決了[pytest] addopts -p no:cacheprovider這行配置的作用是關(guān)閉 pytest 的緩存插件通過插件層面的跳過來繞開某些 Windows 環(huán)境下的編碼陷阱。具體來說這個(gè)插件在某些場景下會對測試文件的緩存與寫入產(chǎn)生影響尤其在控制臺代碼頁不是 UTF-8 時(shí)容易引發(fā)亂碼問題關(guān)閉掉之后清爽很多。如果你在 Linux 或 macOS 上開發(fā)基本不會遇到這個(gè)坑但 Windows 用戶一定要記住這個(gè)配置。9. 學(xué)習(xí)路徑與擴(kuò)展方向建議9.1 從 Pytest 走向自動化測試全棧Pytest 是自動化測試的一個(gè)入口但不是終點(diǎn)。我的建議是先夯實(shí)基礎(chǔ)再往外擴(kuò)展。基礎(chǔ)階段要掌握 Python 語法、requests 庫、Pytest 核心功能、數(shù)據(jù)驅(qū)動、接口測試基本流程。這階段大概需要 4 到 6 周每天花 1 到 2 小時(shí)實(shí)操是能比較扎實(shí)完成的。進(jìn)階階段可以往幾個(gè)方向拓展一是接 CI/CD把測試工程接入 Jenkins 或 GitHub Actions理解整個(gè)研發(fā)交付鏈路二是做自定義插件比如寫一個(gè) Pytest 插件來自動統(tǒng)計(jì)用例耗時(shí)、自動生成測試報(bào)告三是往性能測試和安全測試方向延伸這時(shí)候 Pytest 依然可以用它不只是功能測試的專屬工具。給大家一條我自己的學(xué)習(xí)路徑參考先寫 50 條接口用例覆蓋 get/post/put/delete 四種方法掌握參數(shù)化和 fixture把工程結(jié)構(gòu)規(guī)范化引入 Allure 報(bào)告接上 Jenkins 定時(shí)任務(wù)再學(xué) Playwright 或 Selenium把核心用戶路徑做成 UI 自動化用例回頭重構(gòu)公共方法抽出數(shù)據(jù)驅(qū)動框架寫自定義斷言和工具庫嘗試用 pytest-xdist 做分布式執(zhí)行優(yōu)化整套測試工程執(zhí)行效率每個(gè)階段都要實(shí)際跑出效果來別在課程視頻上停留太久動手寫過代碼才算真正掌握。9.2 一個(gè)經(jīng)驗(yàn)如何讓團(tuán)隊(duì)接受自動化測試最后想聊一個(gè)技術(shù)之外的問題。很多測試同學(xué)學(xué)會 Pytest 后在團(tuán)隊(duì)里推自動化測試卻遇到阻力開發(fā)覺得測試腳本沒用領(lǐng)導(dǎo)覺得投入產(chǎn)出不高。我的體會是自動化測試的落地不只是技術(shù)活更是管理活。從 Pytest 的視角看你需要讓報(bào)告會說話。Allure 報(bào)告里的用例通過率、失敗分布、執(zhí)行耗時(shí)能直觀地告訴團(tuán)隊(duì)目前的質(zhì)量狀況和風(fēng)險(xiǎn)點(diǎn)。先把一兩個(gè)核心模塊的自動化做起來用真實(shí)的數(shù)據(jù)證明它能發(fā)現(xiàn)多少 bug、節(jié)省多少回歸時(shí)間再逐漸擴(kuò)大范圍比一上來就鋪開全量自動化要穩(wěn)妥得多。說實(shí)話Pytest 本身值得寫的東西太多一篇文章不可能面面俱到。我盡量把從選型到實(shí)戰(zhàn)、從接口到 UI、從本地調(diào)試到 CI 集成的完整路徑串了一遍也希望各位能在自己的項(xiàng)目中把這些經(jīng)驗(yàn)落地驗(yàn)證一遍。代碼寫多了自然會有手感坑踩多了自然會有經(jīng)驗(yàn)。自動化測試這條路入門不需要太高的天賦但持續(xù)走下去一定會有豐厚的回報(bào)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91亚洲欧美激情| 久久婷婷亚洲| 女人久久久| 美女一区二区国产精品| 色吧5亚洲| a片 xxxx受爽视频| 亚洲情色欧美| 亚洲第一免费视频| 欧美拳交在线播放| 日本道日本道中文字幕日本道最新日本道在线观看| 国产超碰欧美| 欧美精品久久久久久久久88| A 天堂在线观看视频| 91亚.色| 欧美97免费| 欧美线天码中字| 黄站在线免费观看| 蜜乳AV一区| 亚洲熟妇丝袜在线观看| 欧美伦乱爱| AV乱伦专区| 亚洲 图片 欧美 色图| 九九夜精品九九在线| 神马久久久久久久久久| 91bbbbbb| 丁香五月天啪啪| 免费成人在线熟妇网| 精品1区2区3区| 综合欧美日本三级| 欧美性五月| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 91精品久久久久久77777| 大象AV在线| 亚洲另类综合欧美| 亚洲乱码精品一区二区| 丰满精品人妻少妇久久字幕| 污污汅18禁网站在线永久免费观看| 九色97| 717影院理论午夜伦八戒| 好舒服视频| 国产400孕妇孕交群| 熟妇无码视频三区| av在线一区二区三区| 超清中文乱码字幕| 日韩精品1区2区中文字幕| 欧美一区二区在线资源| 黄色大片免费在线| 欧美日韩传媒| 色婷婷视频| 国产精品成人AV片免费看网站| 嫖老熟女A片一二三区| 这里有精品| 亚洲精品国产av天美传媒| 新视频sss国产| 国产精品久久伊人| 亚洲码在线中文在线观看| 欧美另类自拍 | 久夜操| 久草国产在线视频| 亚洲区 欧美区| 日本色色色视频| 99RE在线视频精品,这里只有精品| 天天干夜夜鈤| 综合天天网| 伊人网青青| 凹凸视频在线一区二区| 美女露胸露奶头| 99精品无码| 把腿张开老子CAO烂你| av草草在线电影| 婷婷综合| 日韩精品一区二区三区色欲| PMv在线观看| 一本久道久久综合狠狠爱一密臀精| 丝袜视频网国产90| 九九热午夜欧亚国产视频| 亚洲高清在线| 激情国产乱伦Av| 黑人娇小av在线播放| 成人在线午夜视频一区| 啊啊啊啊啊操我视频| 亚洲日韩精品一区视频在线| 欧美不卡在线一区二区| 中文字幕后石码四区五区| 日韩欧美传媒一区国产| 亚洲s色图| 神马久久久久久伦理片| 大屁股熟女一区二区三区| 亚洲二区精品在线观看| 狠狠狠狠狠干| 美国久久一二三四| 麻豆AV短剧| 极品出轨视频网站| 欧美97爱| 99热在线播放| 十八禁av无码免费网站APP| 国产高清视频无码在线| 青娱乐国产剧情av一区| 久久久久久电影| 爽 好舒服 无码刺激久久| 成人5码视频| 女人高潮大叫一级毛片| 免费看日本操逼视频| 熟妇xxxxx性春色| 色色综合97| 在线洲亚线| 97在线视频免费看| 中日韩一区二区三区欧美| 中文字幕丰满子伦无码专区在线视频最新 | 色天堂综合| 亚洲日韩青青草色月| 97 视频在线| 一二视频神马久久传媒| 亚洲综合影片| 亚洲欧美日韩偷拍色图| 最新欧洲欧美日本激情网站| 激情综合五月婷婷| 麻豆一区二区三区在线看| 欧美中文综合| 熟妇最新先锋一二三区| 亚洲男人天堂av| 99久久婷婷国产综合精品草原| 亚洲日韩乱码中文无码蜜桃臀网站 | 国产探花日韩援交| 日本有码久久| 人妻激情视频| 亚洲精品aa久久伊人| 激情终合网| 亚洲综合第一页| 午夜福利成人免费视频| 亚州,欧美在线| 色狠狠 - 百度| av九九| www.色五月| 学生妹天天看| 熟女少妇一区二区三区| 男人天堂2019| 日韩91网| 风月影院男女十八禁| 思思热免费视频观看| 97超碰精品成| 免费αV在线视频| 精品人妻夜夜草| 欧美色图欧美| 久久精品国产精品亚洲艾通辽熟妇 | 久久亚洲AV无码专区国产精品 | 日日超碰亚洲| 乱伦av.com| 欧美国产成人在线| 婷婷成人五月天| 男人天堂最新手机版在线青青草| 激情综合五月| 一区二区视频你懂的| 日本伦乱九九九综合| 日日妻色网| 操逼操2| 97日本超碰综合| 亚洲精品色| 日韩欧美午夜一区二区| av网站免费看| 天综合网| 东亚亚洲无码高清| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 中文字幕色AV| 99热色这里只有精品| 自拍偷拍第26| 丰满人妻一区二区中文| 丰满人妻大屁一区二区| 蜜臀va69| 亚洲97成人在线观看| 级做a爱无码性色永久免费| 精品小视频在线| 中文字幕一区二区三区高清| 99re9| 麻豆人妻偷人精品无码视频| 黄总AV色图| 欧美精品另类人妖xxxx| 天天干美少妇一区| 综合色图区| 国产18精品亚洲精品| 思思久热在线精品66| 人妻激情偷乱视频一区二区三区 | 一本大道综合伊人精品热热| 91操人视频| 国产精品久久久久9999小说| 欧亚不卡| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 精品一区二区2| 久久久久无码| 91熟女丨老女人| 春色91| 老熟妇91| 日本操逼视频不卡直接放| 懂色aV一区二区天美传媒| 测评在线观看AV| 天天躁日日躁AAAAXXXX国产 | 一本一道vs波多野结衣| 亚洲影院365| 96精品久久久| 欧洲精品二区| 国产午夜精品理论片a大结局| 日韩高清黄片| 国产suv精品一区二区四区999| 91久久国产综合精品| 日韩亚洲97| 欧美日韩色综合网| 综合操逼| 亚洲 欧美 日韩另类 麻豆| 99久在线精品99re8| 日韩小电影| 高清无码一区二区三区| 超碰 97国产熟女| 日本天堂在线播放| 很很操在线| 欧美亚洲玖玖玖| 日本黄色精品| 99热思思| 国产成人精品日本视频| 人妻一区视频| 欧美精品成人在线播放| 三级三级三级日本99| 粉嫩小泬久久久一区二区| 日韩欧美成人大香蕉| 国产精品夜夜夜| 国产成人网站在线观看| 久久熟女精品不卡一区| 天天干天天干天天| 国产91福利小视频在线观看| 国产AV久久野战精品| 欧美韩国你懂得在线| 亚洲欧美日韩精品久| 日本在线15p| 久久精彩免费视频| 伦激情人妻另类人妻| 神马久久久久眼| 国产色综合亚洲色综合吹潮| 青青草日韩免费观看高清在线| 五月天人妻综合| 97超碰大| www.高清无码诱惑一区.com | 乱欲视频| 日韩一级二级三级免费看完整版国语版| 亚洲性高潮| 综合激情五月丁香| 精品国产Av无码久久久亚洲| 综合亚洲网| 欧美黑人精品一区二区| 春色综合免费| 色五月天AV| 蜜乳av首页| 国产专区第一页| 久草这里只有精品 | 亚洲人在线| 亚洲人妻av| 午夜男女爽爽大片免费观看| 综合色图,成人综合网| 精品国产三级av韩国在线| 亚洲天天操| 乱日视频| 色欲天天综合网| 人人人人人人少妇| 免费啪啪av| 亚洲色天| 天天肏夜夜肏| 97爱综合| aa片毛片| 91 综合 色| 亚欧高清在线| 久7色| 99精彩视频| 亚洲一区在线观看欧洲| 亚洲欧美日韩中文播放| 中文字幕一区二区三区人妻不卡 | 人人 操人人 操人人| 高清视频一区| 亚洲不雅视频1区二区| 走光一区92下载| 口爆综合网| 欧美性色综合网| 春色校园综合网| 97视频在线观看播放与子乱对白在线……| 日韩人妻免费精品| 亚洲色 国产 欧美 日韩| 久久国产逼| 亚洲精品无码成人久久久99| 国产1769在线| 静品嫩模一区二区| 中文字幕精品丝袜| 久久精品高清无码一区| 天天干人妻视频| 久久久青青草| 亚洲欧洲日本精品中文a∨| 我要去看2个日本美女.com曹逼| a男人的天堂久久一级A毛片| 无色无码| 激情小说亚洲视频| 97久久久| 极品美女福利在线观看| 激情小说五月天| 青娱乐老司机视频| 99操逼| 欧美变态激情网| 欧洲黄色网| 国产成人亚洲精品无码古代早漏男| 日本久久网| 色欲人妻一区二区在线| 天天干人人看综合| 亚洲欧美大| 麻豆AV96熟妇人妻| 日夜尻逼网| 中国女人内射6XXXXX| 在线观看一级α片刺激高潮视频| 日韩欧美aⅴ综合网站发布| 秋霞蝌科网日本一区| 久久乐| 亚洲 欧美 色图| 丁香六月啪啪| 欧美视频一| 日韩在线人妻网站| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 久久综合激情| 97视频在线播放| 涩爱AV在线| 久久久久9999| 黑人中出21连凳花野真衣| 88xx成人精品视频| 免费9 1久久| 亚洲性爱成人| 久操 高清| 久综合国内精品自在自线| 91狠婷| 精品久久无码午夜福利| 新视频sss国产| 日本护士高潮| 色哟哟综合| 啊啊啊啊啊舒服| 久99视频| 襙一襙| 精品一区99999| 美女久久久久久久| 97色婷婷| 成人片在线播放| 高清国产精品福利网站| 色悠久久久av| 天天操美美| 日比av无码| 亚洲AV永久无码精品成人调教| 啊啊啊啊啊啊啊国| 亚洲色综合| 日韩性爱一级片| 中文字幕一区二区三区人妻不卡 | 日韩99神马视频播放片在线播放| 偷窥自拍亚洲天堂网爆| 在线观看日韩av不卡| 日韩97P| 亚洲欧美综合网站| 日韩午夜国产| 欧美熟妇亚洲版| 深夜视频| 蜜臀久久久国产| 色蜜AV| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 亚洲欧美成人网站AAA| 亚洲九九九九| 最新日本中文字幕| 日韩精品在线视频在线观看 | 婷婷亚洲中文字幕在线| 天天天天天天天天综合| 久热最新在线杭州| 裸体美女久久久| 超碰欧美在线欧美| 99在线精品观看视频中文| 久9精品| 日韩性爱长视频免费| 在线视频亚洲无码| 久热精品在线| www.久久制服糖| 欧美激情 亚洲色图| 熟妇乱伦一区二区| 超碰色男人操熟女| 亚洲丁香花色| www久久99| 一本正道久久熟女| 人妻无码视频一区二区三区久久| 校园激情狠狠四射| 精品丰满熟妇人妻一区| 91一区二区三区蜜桃| 久久久精品成人国产| 亚洲日本韩国极品一区二区| 国产夜夜艹| 久久亚洲天天做| 乱人乱色一区二区三区免费| 天天综合-91入口| 超97在线精品视频| www鬼畜国产男人的天堂| www.91欧美| 欧美gv在线观看| 久久超碰网| 凸凹视频在线观看| 久久一二三四五六七八九区区| 操学生天天| 东京热男人天堂| 亚洲精品无码成人久久久99| 18禁久极品美女久久哦哟呀!| 久久免费少妇| 亚洲欧美日韩精品久| 人人操人人93| 手机看片1024你懂的国产| 人妻丰满熟妇一区二区三| 亚洲 日本 一 二 三| 99热精品青草在线| 丁香五月电影| 99蜜桃臀久久久欧美精品网站| 日韩国产精品人妻无码久久久| 熟女六十路| A男人的天堂| 久久精品国产99精品亚洲蜜...| 最新加勒比丝袜在线| 一区二区不卡免费| 亚洲各类熟们中文字幕| 天天日天天舔东京热 | 国产成人综合网| 精品黄色电影| 91jk色拍| 欧美的性爱网站免费| 青女在线| 大香蕉免费中文| 亚洲成人贴图| 91色黑人少妇| 在线视频免费观看午夜| 九九热男人天堂| 91网九色蝌蚪操熟女| 麻豆AV96熟妇人妻| 日韩欧美经典在线观看| 九九热三级片| 99热综合在线| 浪人综合网| 97视频在线视频| 久久亚州精品成人Av无| 色视频蜜乳| 裸体美女免费看网站青草| 亚洲综合贴图91| 999久久芭蕾| 国产精品成久久久久午夜午夜| 搡老熟女免费视频| 无码日韩网站| 日韩性爱免费观看视频| 人人操人人爽人人操人人| 亚洲va有码在线天堂| 91性网| 美女上床网站| 91日产欧美| 清柠毛片| 天堂无码精品国产久| 91肉丝| 日韩BBN| 大香蕉伊人亚洲| 热久久这里只有精品| 国产精品不卡一区二区电影| 亚洲九九九| 久久久久久少妇| 欧美天堂超碰97| 清纯唯美激情四射| 亚洲操操操| 亚洲最大成人a毛毛片| 99久久e免费热视| 国产精品久久久鸭无码的功能| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 黑人精品一区二区在线播放| 综合另类| 欧美一级久久久久久久大片动画| 九久久九精品视频| 91在线综合网| 超AV色女| 欧亚第一综合网| 综合欧美日韩在线| 久久国产逼| 国产偷人伦激情在线观看| 内射老妇BBWX0C0CK| 女人18精品一区二区三区| 可乐操亚洲蜜911| 国产久久男人天堂| 日韩三级av片| 精品久久久久久久| 国产精品自在自拍视频| 亚洲综合色男人网| 97精品国产手机| 国语精品av| 欧美A片中文字幕| 亚洲天堂 视频你懂的| 亚洲最大黄网| 精品久久久久久久| 国产99热| 亚洲不卡AV在线| 99最新日韩偷拍视频| 久久久久亚洲Av无码专区老牛影视| 日韩性爱视频在线免费观看| 91九九九馒头| 97久久超碰亚洲| 1禁看欧美黄片免费看| 女人妻一区| 欧美日韩欧美| 五月天婷婷影院| 欧美色图99| 人人操人人摸人人看人人干| 欧美狠狠弄| 亚洲91色| 国产精品91ai| 一级做a爰片久久毛片图片| 天天色粽合合合合合合合| 尤物AV免费网站| 999综合网| 欧美亚洲丝袜人妻制服99| 久久久18禁| 久久久精品中文字幕爱豆| 无码99| 97国产精品一区| 久久午夜伦| 日韩电影免费网站麻豆视频| 天天躁日日躁AAA片李宗瑞| 99久久精品国产系列| 超碰天天去日穴| 国产精品免费视频不卡| 亚洲双插| 久久不卡一区二区 | 不卡av免费在线网址| 午夜啊啊啊| 亚洲欧美国产成人综合不卡| 亚洲极品| 5252色欧美在线| 亚洲综合另类小说色区亚洲成av人片在www | 亚洲图片偷拍欧美| 色妹子A V| 十八禁av无码免费网站APP| 国产精品禁久久久精品| 久久这里精品国产99丫e6| 精品大全99999| 欧美黄色图片| 欧美十八禁导航成人| 人乳av| 99热这里只有精品8| 人妻偷拍一区二区三区| 亚洲中文字幕一区二区| 国产熟女精品区| 9/A片| 日本狠狠干| 欧美久久伊人| 9 9精品一区二区三区| 欧美成人免费在线观看| 久草草一二三四区久久| 中文字幕亚洲在线一区 | 亚洲色电影在线| 欧美图片校园春色| 操www| 涩涩涩综合| 亚洲av性爱电影| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 性色乱AV一区二区| 一区二区首页| 另类欧美色| 国产AV激情无码久久无码| 婷婷九月色| 国产欧美日产一区二区三区 - 国产欧美日| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 女同在线视频一区| 欧美制服另类丝袜| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 思思热在线视频免费| 91综合网站| 色女99一级片在线观看| 91中文字幕制服丝袜免费视频| 粉嫩AV一区夜夜嗨| 精品妇女一区二区三区| 久热久一区二区三区| 久久久久亚洲精品| 欧美日韩亚洲天堂| 国产高清精品一区二区三区毛片| 日本国产高清色www视频在线| 狠狠干,狠狠操| 岛国A V在线免费看| 日韩色| 中文字幕片| 国产激情在线观看| 久久久艹艹艹| 日韩精品视频在线观看一卡二卡| 国产亚洲精品农村妇女 | 亚洲 无码 偷拍| 久久久久久九九九| 欧美亚洲素人制服精品| 大香蕉伊人久久| 青青草日韩无码| 91亚州日韩高清| 密臀国产在线| 午夜男女爽爽大片免费观看| 99少妇| a啊啊啊啊啊啊啊啊一区二区| 久久综合乱子伦国产免费| 亚洲综合图色在线| 美女被啪到深处抽搐视频| 少妇高潮特黄A片| 亚洲欧美中日韩| 中文字幕一品色图| 俺去啦俺来也久久综合| 欧美躁死她一区二区| 2019亚洲男人天堂| 欧美精品日韩久久久九| 精品国产污一区二区三区| 欧美精品系列| 国产日韩欧美三级片| 九九九九97| 日韩电影在线观看网址| 欧美亚洲20p| 婷婷精品国产一区二区三区日韩| 精品中文一区二区| 曰韩无码777| 天天欧美色| 亚洲激情视频| 亚洲美乱| 久久久久99精品成人片蜜臀| 五月丁香狠狠爱| 日韩熟女精一区二区三区不卡| 久久99亚洲精品久久99果| 96精品久久久| 人妻中文字幕日韩电影| 青青草吊丝| 欧美日韩另类在线播放| 色踪合AV| 欧美乱色| 婷婷深爱五月| 老熟乱一区二区三区四区| 欧美另类综合久久| 日han少妇无码| 夜夜影视四色| 亚洲AV不卡在线观看| 婷婷中文字幕| 日本成人A片网站| 热G综合热G中文| 久久国产99精品72福利| 中文字幕一区电影在线观看| 黄页av| 国产乱婷婷精品二区三区| 人人操人人摸人人看人人插| 人妻天堂网| 亚洲五区熟女| 少妇免费视频| 91精品无码人妻系列| 久久久啊啊| AV男人天堂网| 操少妞在线视频| 国产精品 久久久精品一牛| 亚洲素人综合| 久久中日麻豆| 日韩一级片| 日本操大逼| 自拍第一页| 日韩精品一区,二区 九九...老司机| 亚洲成人福利电影免费| 亚洲人妻在线一区| 欧美亚洲首页| 人人妻人人澡人人爽久久av| 亚洲日本天堂| 久久综合女优| 久久一二三四不卡 | 国产九九久久久精品| 激情综合亚洲| 五月丁香综合| 久久久久久久久久久97| 牛黄色久午久| 两性综合网| 国产精品老师| 久久免费老司机精品| 国产久久一区二区午夜| 啊啊啊啊二区好大| 欧美一区二区三区成人性生活| 91强在线播放| 新91视频.cmp| 爱妃国产亚洲视频中文字幕| 欧美人人操人人插| 91精品综合久久久久久五月丁香| 欧美第一页| 五月天婷婷小说| 97干色天堂| 亚洲综合在线高清| 人人爽夜夜玩视频| 亚洲男人天堂av| 日本Xx性爱| 又黄又爽在线观看视频| 欧美成人色| 亚洲久久久| 午夜激情成人在线观看| 在线播放中文字幕| 色超碰综合| 美女91网| 女人喷水视频在线观看| 亚洲精品819| 国产风韵犹存熟妇三区| 亚洲网污污污污| 后入内射蜜桃臀| 国产91精品久久久久久久网曝门| 日韩精品在线视频,日韩精品……| 一本大道综合伊人精品热热| 4399成人黄A片| 9精品在线| 一级性爱视频免费观看 | 精品久久九| 蜜乳AV一区二区三区四| 91 丝袜在线播放| 亚洲第91页| www狠狠| 欧美日韩*字幕一区| 欧美日韩97在线| 黄页大片在线观看| 无码av永久免费专区网站| 亚洲黄色| 97精品在线| 亚洲伊人久久精品狠狠在线| 乱伦图av| 超碰伊人在线| 911粉嫩人妻| 欧美一区二区一级岛国大片| 97中文字幕一区| 精品国产乱码久久久兰草影视| 1024日韩| 亚洲最大网站av| 白丝被操91| 国产毛片片精品天天看视频| 欧美色九九| 蜜桃狠狠色伊人亚洲综合 | 丝袜夫妻自拍| 簧片免费看视频| 国产一级高清免费观看| 国产精品动态一区二区三区四四| 欧洲Au麻豆| 天天做天天爱天天高潮| 天天色综合天天操| 黄骗免费| 96精品久久| 97一区二区蜜臀| 久操九九九九| 日本性交操一区二区不卡系列| 中文字幕av片| 啊啊啊轻点在线观看| 97就爱干| 久久精品噜噜噜成人看免欧美大片| Julia Annxxxxx| 蜜桃久久久久久久| 亚洲一区深夜| 嗯嗯啊啊用力视频免费| 97超碰巨乳| 爱射综合| 免費人妻夜夜爽天天爽爽一区| 超碰色中文| 91美女国产在线| 色色色999| 欧美一二三级精品在线| 91在线一起| 亚洲乱熟女一区二区三区大香蕉| 日夜精品| 日韩少妇在线视频| 人妻在线中出视频| 日韩精品 视频一区二区| 蜜臀Av一区二区三区| 欧美丝袜激情| 99精品网| 天天看人人操屄犊摸阴| 久久久久久AⅤ无码免费肉站| 九九AV| 99久久免费看精品国产一区| 牛牛久久国产精品视频一二三 | 九久久九九久视频| 2019午夜福利视频| 妇人噜噜| 色五月天AV| 青青草吊丝| 久久久精品日本一道| 丁香九月激情| 久久激情综合| 激情五月婷婷综合| 婷婷性爱| 成人夜夜爽| 国产精品国产拍高清AV| 午夜精品久久久99| 国产精品高潮久久AV| 中文字幕 码 自拍 视频 区| 97在线资源| 午夜美女诱惑电源网| 制度丝袜99| 久jiu久神马影院| 婷婷丁香六月| 久久9亚洲| 午夜福利在线视频1000| 九色黄站| 婷婷99狠狠躁天天躁| 婷婷五月激情综合| 亚洲综合色在线| www.91理论| 欧美老妇女内射网址| 东京热男人的天堂| 久久国产三区| 色九久| 黄色片大香蕉| 激情小说亚洲视频| 日韩无码极品| 中文字幕一区av| 天天综合~91| 国产AV色黄看到爽| 内射中出日韩在线观看视频| 欧美色图片欧美色图| 国产av强奸美女| 一区二区三区色综合| 久久久久久久伊人精品| 国产av尤物| 搡老女人老91妇女老熟女| 伊人久久婷婷| 97精品在线视频| 亚洲另类久操网| 久久永久无码人妻视频| 自拍盗摄一区| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 国产精品点击进入在线影院| 看看小穴| 婷婷综合在线| 国产 亚洲 丝袜 制服| 久操国产在线| 中美日韩毛片| 日韩人妻大香蕉| 手机在线人成免费视频| 日韩欧美久久婷婷网站| 天天操美美| 欧美日韩国产色图在线| 亚洲成人贴图| 熟女精品一区二区在线观看| 日韩乱中文| 在线视频 亚洲精品| 色婷婷一区二区三区久久午夜成人不| 天天色综合天天操| 中文字幕一区二区免费在线| 黄色工厂这里只有精品| 双插在线| 天天操av懂色| 夜夜操狠狠操| 午夜福利一区二区影院| 一道本东京热加勒比一区二区三区| 日本一区二区三区午夜观看| 欧美97av| 韩国嫰模上门援交视频| 啊啊啊在线观看免费视频| 26uuu国产免费观看| 东北女人无套内谢视频| 一二三啪啪专区| 蜜乳AV一区二区三区四| 日本操逼视频免费| 欧美激情在线观看视频| 99精品久久久久久| 18一区二区三区| 婷婷五月天激情网| 另类视频在线| 97最新在线播放视频| 婷婷丁香六月| 性爱乱伦网址| 免费观看网黄| 九九九九免费视频| 美女91AV| 婷婷色婷婷| 国产精品久久久久久久免牛肉蒲团 | 91久久伊人婷婷青青草| 最新欧洲欧美日本激情网站| 三级网站超变态精品| 欧美天天综合在线| 国产精品制服丝袜清纯唯美| 久操B网| 亚洲图片欧美偷拍| 99久久精品国产高潮| 丝袜综合色图| 欧美激情高清性猛交| 欧美成人黄网色网站| 亚洲www91| 国模无码人体一区二区三| 青草视频在线看看看看看看看看看| 好屌色综合| 中文字幕一区二区三区高清| 成人日本精品九区| 一,爱啪啪,在线免费视频| 国产中午字一暮区| 人妻精品一区二区全免费| 色婷婷在线视频| 熟女丰满人妻一区| 蜜臀99久久国产| 淫纸中9区| 欧美精品庄| 国产毛片久久久久久久| 黄色免费网页无码| 性感女人网页在线观看视频| 人妻熟女一区二区三区在线| 久久亚州大香蕉| 国产精品午夜AV完会免费| 亚洲**2021在线观看| 国产精品久久伊人| 亚洲永久AV无码精品秋霞| 人妻色情天天操| 国产成人午夜视频网址| 小草精彩毛片| 中文字幕一区二区无码成人| 亚洲综合一区二区| 久久久久深夜无码| 乱欲一区二区| 国产AV人人夜夜澡人人爽麻豆| 青草精品视频-日本久久久久网站| 色噜噜精品一区二区三| 久久草大香蕉| 九九综合久久| 99这里有精品视频| 蜜色网色哟哟| 久久人体一区二区| 成人小说视频在线精品欧美| 精品妇操一区二区三区| 一级免费精品| 亚洲国产精品无码AV久久| 97干天天| 丁香五月天激情综合| 秋霞久久亚洲精品成人| 精品无码一区二区三区| 亚洲久久久| 久久久月天| 久久中文字幕女同性恋一区| 欧美日韩青操| 黑丝日韩av丝袜av| 欧亚乱色熟一区二区三四区| 欧美另类色图片| 99无码视频| 欧美丰满熟妇XXXX性ppX人交| xxxx网站亚洲精品| 国产精品女生av| 中文字幕丰满人妻日本| 日韩精品-原创伙伴| 色老大| 大色网久久| 亚洲双插| 香蕉精品二区二区| 久久精品国产亚洲粉嫩| 国产搭汕a级片| 淫淫综合网| 亚洲色交| 91丝袜在线观看| 国内偷拍精品一区二区| 日本精品一级二级三级| 日躁天天爽爽| 欧美宗合网| 91网站18禁| 亚洲九九九| 成人免费视瓶| www.99中文字幕| 人人摸人人摸人人干| 久久精品国产亚洲AV无码电影| 丰满人妻一区二区三区色-百度| 欧插网站| 亚洲国产一区二区三区在线 | 日韩激情无码影院| 人妻另类 专区 欧美 制服| 呦呦一区| 成人小说视频在线精品欧美| 超碰国产精品久| 日韩人成网站在线播放| 九九综合久久| 国内外色色色色色成人视频| 青青11操操操操操操操操| 久久婷婷在线观看视频| 中文字幕精品乱码| 大但人体久久久久| 色噜噜狠狠色综无码久久合欧美| 一区在线精品中文字幕| 日韩高清黄片| av无码精品久久久久| 婷婷久久综合| 无码99| 91草草草| 欧美性爱一区二区三区| 超碰97人妻| 国产极品美女高潮无套在线观看| 久9热| 热久久九九热| 久9爱精品| 成人小说另类在线| 乱伦AVxx| 熟妇人妻一区二区三区| 欧美一区二区三区成人性生活| 校园春色 亚洲| 少妇被c 黄 免费观看| 亚洲啪啪视频一区二区| 欧美午夜精品久久久久久超碰| 欧美亚洲日韩16色| 自拍六区| 国模无码一区二区三区在线| 亚洲 欧美都市激情| 97色涩| 91美女色视频亚洲| 日本999精品| 久草精品在线| 国产男人又猛又粗又爽| 高清无码 国产精品| 亚洲成A∨人影院在线欢看| 女人的久久久| 综合性视频99| 一区二区三区美女超清| 欧美v亚洲v日韩v最新在线二区| 91男女啊啊啊| 青青草原香蕉日本Ap| 日韩免费簧片| 五月婷婷六月色| 久久AV色| 午夜福利一区二区影院| 大香蕉AV在线| 啊啊啊啊在线播放| 91人妻最真实刺激绿帽| 日本免费中文一区二区三区四区| 久久久99999久网站| 日韩啊V| 六月婷婷激情| 青青草AV色| 日本操大逼| 丰满少妇高潮无码| 91精品国产91久久青草| 婷婷久久综合久| 日本五区不卡| 日韩精品黄片免费观看| 神马久久久久久久久久| 69国产对白刺激| 日本特黄f c2| 青青五月天| 日本岛国黄色网址| 大香蕉日亚洲日本亚大 | 欧洲欧美视频一区二区| 熟妇最新先锋一二三区| 亚洲情欲| 蜜桃视频精品一区二区| 91精品人妻一品二品三品| www.人人cao| 女人天堂网| 强奸乱伦αv片| 亚洲精品国产熟女久久久| 日韩Va亚洲va欧美Ⅴa久久| 亚洲欧洲日产国产综合网| 青青青国产手线观看视频2| 夜夜高潮夜夜爽| 91丨国产丨白浆秘 洗澡动漫| 1024亚洲中文字幕久在线看片你懂的 | 九九热超碰97亚洲最新香蕉 | 日韩国产乱子伦App| 中文字幕AV片| 国产91乱伦| 无码人妻系列少妇| 无码在线亚洲| 麻豆一区二区AV天美| 婷色五月| 日韩兔费看黄片| 丝袜综合色图| 天天色,天天干,天天干| 国产和美国毛片| 日本女人操逼| 九热中文字幕| 97欧美精品综合| 国产性爱在线视频一区二区| 欧美第二页午夜| 婷婷午夜| 在线视频 亚洲精品| av午夜玫瑰| 久久久免费的精品| 久久精品国产亚洲粉嫩| 久久秀这里有精品| 精品毛片av一区二区| 亚州图片第一页| 色婷五月| 99久久国产精品免费高潮| 精品然女一区二区| www.人人cao| 男人久久天堂| 淫骚熟女一区二区三区| 中文字幕性感少妇av| 美女网站91| 亚洲揄拍网| www.色五月| 欧美爆乳精品一区二区| 台湾佬中文娱乐网久久久久久久久久com| 久久婷婷色| 囯戸精品高潮呻吟旡码| 日韩成人人妻网站| 熟女一区二区| 亚洲福利中文字幕在线| 搡老女人老91妇女老熟女| 久久国语| 91大胆欧美| 看黄片视频免费| 亚洲日韩电影| 夜夜骑操视频| 久久国产精品一级二级三级| 2020中文在线一区二区三区| 欧美碰碰综合色| 精品免费国产二区三区| 91chinese在线| 九九热久久99精品re| 日本久久久久久久久久| 插老姨肥穴| 992这里有精品| 99精品视频在线观看免费| 欧美一二三| 国产AV天美传媒一区二区三区| 日韩AV中文字幕电影| 欧美视频中文字幕区| av在线播放国产一区| 亚洲有码视频二区| 色777999综合| 中 文字幕一区二区三四 五 区日 日 骚 | 免费a在线播放v| 欧美成熟性爱精品| 欧美日韩亚洲天堂| 九七人妻在线| 热热热热日日漂亮永久永久国产日| 先锋精品av色鲁| 欧美性爱十八禁| 欧美黄色大片在线观看| 操逼操逼操| 国产sv美女内射| 天美传媒AV国产在线| 青青国产精品在线| 一区二区影院| 中国操逼无码| 少妇综合| 蜜臀久久99精品久久久久久-DVD| 中国熟女91| 狠狠躁天天躁日日躁| 人人操天天爽| 天天日老熟妇| 五月丁香影院| 丁香五月大香蕉| 亚洲中文字幕av| 亚洲Av无码成人精品国产| 97超碰欧美手机| 美女一区二区国产精品| 色yeye成人免费视频| 黄片免费日韩| site:sinbotex.com| 男人综合网| 亚洲日韩精品一区二区| 日日夜夜骑| 自慰白浆在线观看| 久草草一二三四区久久| 97色欧州| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 午夜无码精品免费看性色| 91伊人久| 免费一级黄色录像影片| 不卡av在线中文字幕| 欧 美 自 拍 偷 拍| 国产黄色小视频网站| 色黄污美女啪啪啪免费网站| AA级电影三区| xxx0国产在线播放| 午夜福利视频在线一区| 这里都是精品在线观看| 天天爽天天操|