免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

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

Pytest自動化測試框架實戰(zhàn):從接口到UI的完整落地指南 這一兩年我面試過不少測試崗位的候選人幾乎每個人簡歷上都寫著“熟悉自動化測試”可細(xì)問下去能把手里的框架講明白的并不多。這不能全怪個人自動化測試的門檻不在工具本身而在你能不能把一個框架真正用起來、用好。今天我想聊聊 Pytest這個在 Python 自動化測試圈子里被用得最多、也最值得花時間掌握的測試框架。Pytest 之所以能在 unittest、nose 等一堆老牌框架里殺出重圍靠的不是花哨的功能而是它對“測試”這件事的理解足夠樸素測試就是普通函數(shù)加斷言寫起來沒有任何心理負(fù)擔(dān)。但等你真正深入進去又會發(fā)現(xiàn)它背后藏著一套非常強大的插件機制和夾具系統(tǒng)。這篇文章我會從框架選型聊到接口自動化、UI 自動化的實際落地全程帶例子、帶參數(shù)、帶踩坑記錄希望能幫正在學(xué)自動化測試或者準(zhǔn)備搭建測試框架的朋友少走點彎路。1. 為什么是 Pytest自動化測試框架選型背后的考量1.1 從手工測試到自動化測試框架到底解決什么問題很多人對測試框架有一個誤解以為框架的價值就是“能跑用例”。其實手工測試也能跑用例你寫一百個 if 判斷也一樣能出結(jié)果。框架真正解決的是三個問題可維護性、可讀性、可擴展性。先聊可維護性。沒有框架的時代測試代碼長什么樣通常是一個腳本從頭跑到尾數(shù)據(jù)、步驟、斷言全塞在一起。改一個需求你得從頭到尾捋一遍代碼生怕哪里邏輯被帶偏。而 Pytest 這種框架強制你把測試拆成一個個獨立的用例函數(shù)每個函數(shù)只干一件事互不干擾改起來就是“啃個雞腿”的功夫。再聊可讀性。Pytest 把斷言簡化成了 Python 原生的assert語句用例寫出來跟白話文一樣。比如你要校驗接口返回的 code 是 200直接寫assert resp.status_code 200就行任何人來看都能秒懂這條用例在測什么。這比 unittest 那套assertEqual寫法要清爽太多了。最后是可擴展性。Pytest 從設(shè)計之初就留好了插件的口子你可以在不修改框架源碼的前提下通過 conftest.py 和 fixture 機制把登錄態(tài)、數(shù)據(jù)庫連接、測試數(shù)據(jù)準(zhǔn)備這些公共邏輯全部抽離出來。這種“把重復(fù)勞動交給框架把精力留給業(yè)務(wù)”的思路才是自動化測試能長期跑下去的根基。1.2 Pytest 與 unittest、Robot Framework 的選型對比學(xué)習(xí)自動化測試的人一定會遇到“框架選擇困難癥”。我的建議很直接Python 生態(tài)里做接口自動化和 UI 自動化Pytest 是第一梯隊的選擇幾乎沒有之一。為了讓你信服把幾個常用的框架放在同一張表里對比一下對比維度PytestunittestRobot Framework用例編寫方式普通函數(shù) assert類 斷言方法表格關(guān)鍵字驅(qū)動學(xué)習(xí)曲線平緩會 Python 基礎(chǔ)就能上手平緩但代碼冗余陡峭關(guān)鍵字語法需要額外學(xué)習(xí)參數(shù)化支持內(nèi)建 pytest.mark.parametrize功能強大需要額外封裝通過模板和參數(shù)文件實現(xiàn)插件生態(tài)非常豐富xdist、rerun、allure 等生態(tài)一般擴展能力弱有庫和關(guān)鍵字但靈活度低斷言失敗信息非常詳細(xì)自動對比期望值和實際值提示相對簡單依賴關(guān)鍵字實現(xiàn)信息有限適合場景接口、UI、單元測試通吃簡單單元測試、老項目維護測試團隊非技術(shù)背景偏多這里面最關(guān)鍵的一個差距是參數(shù)化。接口測試十有八九是數(shù)據(jù)驅(qū)動的場景同一套邏輯要跑幾十組輸入輸出。unittest 做參數(shù)化要么循環(huán)套循環(huán)要么寫一堆子類代碼難看得很。Pytest 直接用pytest.mark.parametrize裝飾器就能搞定參數(shù)列表一目了然失敗時還能精確定位到是哪一組數(shù)據(jù)出了問題。這個體驗上的差距你在實際工程里跑兩天就能感受出來。2. Pytest 核心機制拆解從安裝到第一個測試用例2.1 環(huán)境準(zhǔn)備與安裝Pytest 的安裝非常省心Python 3.7 以上的環(huán)境直接跑一條命令pip install pytest裝完驗證一下版本確認(rèn)環(huán)境沒有問題pytest --version我習(xí)慣在虛擬環(huán)境里裝避免把系統(tǒng) Python 搞亂了。用 venv 或者 conda 的都行這不是什么復(fù)雜的操作但能避免很多后面才爆出來的依賴沖突。如果你的項目里已經(jīng)用了 requirements.txt直接往里面加一行pytest8.x.x鎖定版本團隊協(xié)作時大家環(huán)境一致排查問題會省不少事。如果你的 Python 環(huán)境里既有 unittest 又有 pytest裝完之后默認(rèn)執(zhí)行 pytest 命令是沒有沖突的兩個框架可以在同一個項目里并存。不過我不建議混著用測試體系最怕風(fēng)格不統(tǒng)一選一個就用到底。2.2 測試用例編寫規(guī)則與斷言技巧Pytest 對用例的識別有一套約定最核心的規(guī)則是測試文件命名為test_*.py或*_test.py測試函數(shù)命名為test_*測試類命名為Test*且類中沒有__init__方法按照這個規(guī)則寫Pytest 就能自動發(fā)現(xiàn)用例。一個最簡單的測試用例長這樣# test_demo.py def test_addition(): assert 1 1 2 def test_string_contains(): name pytest assert test in name寫斷言的時候有幾個小技巧是新手容易忽略的。先看字符串?dāng)嘌匀绻阆胄r炞址锇硞€子串直接assert test in name即可但如果斷言失敗Pytest 只會告訴你assert test in pytttt不會告訴你到底哪里不一樣。想要更詳細(xì)的失敗信息可以用assert test in name, 期望 name 中包含 test實際值是 {name}把上下文信息打印出來。再來看異常斷言。如果你在測試一個函數(shù)它應(yīng)該在某個條件下拋出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ù)還能幫你校驗異常信息里是否有特定關(guān)鍵詞配合正則表達(dá)式用非常強大。2.3 用例運行與收集機制運行測試用例的命令幾行就能說清# 運行當(dāng)前目錄下所有用例 pytest # 運行指定文件 pytest test_demo.py # 運行指定文件中的指定函數(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ù)可以讓用例在第一次失敗時立刻停止適合在本地快速排查問題時用而--maxfail2則允許第一次失敗后繼續(xù)跑最多收集到第 2 個失敗才停下。關(guān)于用例收集機制有個點必須提Pytest 默認(rèn)會遞歸搜索當(dāng)前目錄下所有符合條件的文件。如果你的項目里某些目錄不需要跑測試比如build、venv這類一定要記得在pytest.ini里用norecursedirs把它排除掉否則你每次跑測試都會被一堆無關(guān)文件拖慢速度嚴(yán)重的時候還會因為導(dǎo)入錯誤導(dǎo)致整個測試會話崩潰。我的pytest.ini一般長這樣[pytest] testpaths tests norecursedirs venv build dist .git3. fixture 機制詳解Pytest 的靈魂功能3.1 fixture 基礎(chǔ)用裝飾器管理測試前后置如果說 Pytest 只能讓你記住一個功能那一定是 fixture。fixture 說白了就是測試用例的前置條件和后置清理但它的設(shè)計比 unittest 的 setUp/tearDown 靈活太多。先看一個最基礎(chǔ)的用法。假設(shè)每個測試用例執(zhí)行前都需要創(chuàng)建一個臨時數(shù)據(jù)庫連接測試完關(guān)閉這個連接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因為yield能讓你在測試用例跑完之后繼續(xù)執(zhí)行清理邏輯。這比 unittest 的tearDown單獨寫一個方法要清晰得多前后置邏輯離得近一眼就能看懂。3.2 conftest.py 與作用域控制fixture 寫在哪、怎么共享這是很多新手容易繞暈的地方。Pytest 的規(guī)則是conftest.py文件里的 fixture 可以被同目錄及其子目錄下的所有測試文件使用。所以一般項目里會把公共 fixture 放在測試根目錄下的conftest.py中。fixture 的scope參數(shù)控制它的生命周期一共有 5 種scope 取值生命周期適用場景function每個測試函數(shù)執(zhí)行前創(chuàng)建執(zhí)行后銷毀默認(rèn)值最安全一般都用它class每個測試類只執(zhí)行一次類級共享資源module每個測試模塊只執(zhí)行一次模塊級共享資源package每個測試包只執(zhí)行一次包級共享資源session整個測試會話只執(zhí)行一次登錄 token、全局配置等我舉一個具體的例子接口測試中的登錄 token。如果每個用例都重新登錄一遍不僅浪費時間還可能被服務(wù)器的防刷機制給攔截。這時候把scope設(shè)為session整個測試過程只登錄一次所有用例共用同一個 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]這里有一個非常關(guān)鍵的經(jīng)驗scopesession的 fixture 一旦返回了可變對象比如字典、列表不同測試用例之間可能會互相污染數(shù)據(jù)。我踩過這個坑有一個全局配置字典在 A 用例里被改了B 用例跑的時候直接報錯。后來我養(yǎng)成一個習(xí)慣session 級別的 fixture 盡量返回不可變數(shù)據(jù)或者每次使用時做一次深拷貝。3.3 fixture 實戰(zhàn)接口自動化中的登錄態(tài)管理在一個真正的接口自動化項目里fixture 怎么用才叫“優(yōu)雅”我給大家拆一個完整流程。假設(shè)被測系統(tǒng)的所有接口都需要先登錄拿到 token然后請求頭里帶上Authorization字段。公共的邏輯應(yīng)該這樣設(shè)計# 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è)計的好處是層次清晰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ǔ)用法接口測試中最典型的場景就是同一個接口輸入不同的參數(shù)組合驗證返回結(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ù)邏輯只寫一遍。新增用例只需要往列表里加一組元組維護成本直線下降。如果某組數(shù)據(jù)斷言失敗Pytest 會非常清楚地告訴你是哪一組參數(shù)出了問題定位效率高到飛起。4.2 參數(shù)化與 fixture 結(jié)合的高級用法參數(shù)化雖然好用但有的時候會出現(xiàn)一個棘手的問題如果參數(shù)里需要包含 fixture 的返回值怎么辦比如我想對不同的用戶身份做權(quán)限校驗測試而用戶 token 來自 fixture。直接混著傳參是不行的因為 Pytest 無法在parametrize裝飾器里動態(tài)獲取 fixture 的值。有兩個解決思路。第一種是直接用 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ù)雜一些。不過實際項目里用第一種就夠了能把 90% 的“參數(shù)與依賴混合”場景解決掉。還有一個參數(shù)化的小技巧給參數(shù)命名時用元組的解包方式來寫代碼可讀性會好很多。比如上面的寫法username,password,expected_code一眼就能看出參數(shù)含義比param1,param2,param3這種命名要有價值得多。另外遇到特別多數(shù)據(jù)的場景建議把參數(shù)列表單獨抽取到一個data.py模塊或 JSON/YAML 文件里測試代碼保持干凈測試數(shù)據(jù)方便維護。這也是數(shù)據(jù)驅(qū)動測試的核心思想——測試邏輯是固定的數(shù)據(jù)是可以隨時替換的。5. 斷言、標(biāo)記與插件生態(tài)5.1 標(biāo)記機制跳過、預(yù)期失敗與自定義分組Pytest 的標(biāo)記mark機制是管理大規(guī)模測試用例的重要工具。最常見的三個標(biāo)記是skip、xfail和custom。skip用于跳過某些用例。比如某個接口還在開發(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表示這個用例預(yù)計會失敗。比如你發(fā)現(xiàn)了一個已知 bug但還沒修復(fù)測試用例跑的時候會報錯你不想讓整條測試記錄變成失敗可以用xfail標(biāo)記。跑完之后Pytest 會統(tǒng)計成“預(yù)期失敗”一旦某天 bug 修復(fù)了這個用例反而通過Pytest 還會用“XPASS”提醒你這個 bug 已經(jīng)解決了該把標(biāo)記去掉了。自定義標(biāo)記能幫你給用例分組。比如接口測試?yán)飬^(qū)分冒煙測試和全量回歸pytest.mark.smoke def test_login(): pass pytest.mark.regression def test_payment(): pass運行的時候用pytest -m smoke只跑冒煙用例pytest -m regression只跑回歸用例。這個機制在 CI 流水線里特別有價值。不過要注意自定義標(biāo)記在使用前需要在pytest.ini里注冊否則會有警告提示。我的做法是統(tǒng)一在配置里維護一個標(biāo)記清單[pytest] markers smoke: 冒煙測試用例 regression: 回歸測試用例 p1: 優(yōu)先級 P1 p2: 優(yōu)先級 P25.2 常用插件組合Allure 報告、多線程與失敗重跑Pytest 的生態(tài)是它最強大的武器之一。我挑幾個項目里一定會用到的插件展開講講。第一個是pytest-xdist用來做分布式執(zhí)行。一條命令就能把用例平均分發(fā)到多個 CPU 進程上并行跑pip install pytest-xdist pytest -n 4-n 4表示開 4 個進程。如果你的用例里有共享資源比如寫同一個測試數(shù)據(jù)庫并行執(zhí)行可能會互相干擾。這時候就要規(guī)劃好數(shù)據(jù)隔離方案。我的習(xí)慣是每個測試進程連接不同的 schema或者用唯一前綴的測試數(shù)據(jù)避免沖突。第二個是pytest-rerunfailures專門處理不穩(wěn)定用例。UI 測試?yán)锝?jīng)常遇到網(wǎng)絡(luò)抖動、元素加載慢導(dǎo)致的偶發(fā)失敗這種用例手動跑能過自動跑就掛用重跑機制能減少很多噪音pip install pytest-rerunfailures pytest --reruns 3 --reruns-delay 2這里--reruns 3是失敗后重試 3 次--reruns-delay 2是每次重試前等待 2 秒。要注意的是不要什么都依賴重跑如果一條用例重跑 3 次還是掛那大概率是真實 bug不能靠重跑把問題掩蓋掉。第三個是allure-pytest生成顏值和實用性兼?zhèn)涞臏y試報告pip install allure-pytest pytest --alluredir./allure-results allure generate ./allure-results -o ./allure-reportAllure 報告能展示每個用例的步驟、參數(shù)、附帶的截圖、日志還能統(tǒng)計歷史趨勢。對接口自動化和 UI 自動化項目來說Allure 報告基本就是標(biāo)配。接入的方式很簡單在 conftest.py 里定義一個 fixture來自動為每個用例捕獲執(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: # 失敗時自動附加截圖UI 測試場景 if driver in item.funcargs: driver item.funcargs[driver] allure.attach(driver.get_screenshot_as_png(), namescreenshot, attachment_typeallure.attachment_type.PNG)這個寫法的邏輯在 UI 自動化測試中很常用能在用例失敗時把瀏覽器截圖自動掛到 Allure 報告里排查問題會輕松很多。6. 接口自動化測試實戰(zhàn)從請求封裝到 CI 集成6.1 測試分層接口測試項目目錄結(jié)構(gòu)設(shè)計很多項目做接口自動化最大的問題不是寫不出用例而是寫著寫著就變成一鍋粥了。200 個用例全堆在幾個文件里改一個接口字段要翻半天代碼。所以我一直強調(diào)先設(shè)計目錄結(jié)構(gòu)再寫測試代碼。我常用的接口自動化項目結(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)鍵點在于把配置、公共方法、測試用例三個層面徹底分開。配置變了不碰用例代碼公共方法升級不影響單個用例用例本身只關(guān)心業(yè)務(wù)邏輯和斷言。這樣的結(jié)構(gòu)在項目規(guī)模擴大后維護成本才不會失控。6.2 請求封裝與斷言工具類基于requests庫我做了一層簡單的封裝。不是為了“過度設(shè)計”而是為了方便統(tǒng)一處理請求日志、超時重試和異常捕獲# 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)這里有個實測得來的經(jīng)驗接口請求超時時間不要太長5 到 10 秒足夠。設(shè)個 30 秒超時一旦接口出問題測試一直掛在那里整個回歸排隊排到天荒地老。timeout10配合 3 次重試既能容忍偶發(fā)的網(wǎng)絡(luò)抖動又不至于在接口真的掛了的時候無限等下去。斷言這塊針對接口常見的 JSON 返回我封裝了一個簡單的斷言工具# common/assert_utils.py def assert_code(resp_json, expected_code): assert resp_json.get(code) expected_code, \ fcode 期望 {expected_code}, 實際 {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}, 實際 {resp_json.get(msg)}, 響應(yīng): {resp_json}封裝不是目的減少重復(fù)、提升失敗信息的可讀性才是目的。斷言失敗時一眼要能看到接口返回了什么東西、和期望值差在哪這樣才能快速定位問題。6.3 結(jié)合 Pytest 的完整接口測試用例把上面的模塊組合起來一個標(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ù)用同一個會話數(shù)據(jù)驅(qū)動管理各種輸入組合Allure 報告里記錄每一步的請求響應(yīng)。6.4 CI/CD 集成與郵件報告接口自動化不接入 CI價值至少打五折。定時手動跑一次測試跟每次代碼提交后自動跑一遍完全不是一個概念。接入方式很簡單我用 GitHub Actions 做一個示例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這個流水線會在每次主分支代碼推送后自動運行同時每天凌晨 2 點跑一次定時回歸。測試結(jié)果通過 Allure 插件生成報告即使用例失敗上傳的 allure-results 也能讓你回溯到具體的失敗請求和響應(yīng)。接入 CI 之后自動化測試才真正變成了團隊的質(zhì)量防線而不是個人電腦上的一個腳本。7. UI 自動化測試實戰(zhàn)Playwright Pytest 的高效協(xié)作7.1 UI 自動化到底難在哪做 UI 自動化的同學(xué)應(yīng)該都有體會UI 用例最大的敵人不是代碼邏輯而是“不穩(wěn)定”。同樣的用例昨天能過今天掛本地能過 CI 上掛唯一能確定的就是它隨時可能掛。導(dǎo)致不穩(wěn)定的原因無非這幾個元素定位不穩(wěn)定、頁面加載耗時不確定、測試環(huán)境影響。Pytest 本身并不能解決 UI 自動化的穩(wěn)定性問題但它的 fixture 機制和插件生態(tài)能把這種不穩(wěn)定性控制在一個可接受的范圍內(nèi)。Playwright 是目前 UI 自動化工具里做得比較出色的一款它和 Pytest 的配合度非常高。安裝也比較簡單pip install playwright playwright install chromium7.2 基于 Pytest 的 Playwright fixture 設(shè)計頁面自動化測試最關(guān)鍵的一個 fixture 是瀏覽器實例。我的設(shè)計思路是每個測試函數(shù)都用獨立的瀏覽器上下文保證用例之間的數(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 級別整個測試過程只啟動一次瀏覽器引擎page是函數(shù)級別每條用例都有自己獨立的頁面上下文互不干擾。這種設(shè)計既保證了執(zhí)行效率不用每條用例都重新啟動瀏覽器又保證了用例隔離性頁面狀態(tài)不串。配合 Pytest 的pytest-rerunfailures我可以給 UI 用例加上兩層保護第一層是顯式等待和智能定位第二層是失敗后的自動重試。但這里要特別強調(diào)重試次數(shù)不要設(shè)置太多2 到 3 次足夠。如果一個用例重試 3 次還是失敗那大概率是真 bug該報警就報警不能讓重試機制把問題無限吞掉。7.3 UI 自動化中的元素定位與斷言技巧Playwright 的定位器 API 比傳統(tǒng)的 xpath 寫起來更直觀而且自帶等待機制。比如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)鍵的一步。點完登錄按鈕后頁面要跳轉(zhuǎn)如果立即斷言 URL很可能還是舊的地址。用wait_for_url會讓頁面跳轉(zhuǎn)完成后才繼續(xù)執(zhí)行比硬編碼time.sleep(3)要可靠得多而且執(zhí)行速度更快——頁面 0.5 秒跳轉(zhuǎn)完就繼續(xù)了不用白白等 3 秒。關(guān)于元素定位我有一個長期踩坑總結(jié)的經(jīng)驗優(yōu)先用文本和角色定位get_by_role、get_by_text其次用 label 和 placeholder最后才考慮 CSS 和 XPath。因為 UI 開發(fā)改代碼時最穩(wěn)定的往往是元素的文本內(nèi)容和語義角色最不穩(wěn)定的是 CSS 類名和嵌套層級。這個道理在寫 UI 自動化時越早明白越好。8. 常見問題與排查技巧實錄8.1 典型問題速查表問題現(xiàn)象可能原因解決辦法執(zhí)行 pytest 但提示沒有收集到用例文件命名不是 test_.py或函數(shù)名不是 test_檢查文件和函數(shù)命名用pytest --collect-only查看收集結(jié)果fixture 報錯 “fixture not found”conftest.py 路徑不對或者 fixture 名稱拼寫錯誤把 conftest.py 放在正確層級用pytest --fixtures查看可用 fixture參數(shù)化用例失敗報錯信息不明確參數(shù)列表性能問題或數(shù)據(jù)格式不對先單獨執(zhí)行該參數(shù)組合定位用-v查看完整參數(shù)信息并行執(zhí)行時用例互相影響共享了數(shù)據(jù)庫、文件或全局變量每個進程使用獨立數(shù)據(jù)避免修改全局狀態(tài)UI 用例偶發(fā)失敗本地能過 CI 掛元素加載慢、頁面渲染不穩(wěn)使用顯式等待失敗重試 2~3 次檢查是否為網(wǎng)絡(luò)環(huán)境差異斷言失敗后看不到期望值和實際值斷言寫得太簡單用自定義斷言消息用 Allure 報告附加上下文8.2 我踩過的 4 個高頻坑第一個坑是 conftest.py 的層級放錯了。有一次我把一個 session 級別的 fixture 放在某個子目錄的 conftest.py 里結(jié)果其他目錄的用例全部報“fixture not found”。排查了半天才意識到 fixture 的可見范圍是包含其所在目錄及其子目錄的兄弟目錄根本看不到。后來我養(yǎng)成了習(xí)慣公共 fixture 一律放在測試根目錄的 conftest.py子目錄只放該模塊特有的 fixture。第二個坑是 fixture 返回的可變對象被用例修改了。有一個用例里對 fixture 返回的列表執(zhí)行了append操作后面運行的用例發(fā)現(xiàn)列表里多了一條數(shù)據(jù)斷言掛得很冤。從那以后我對 session 級別的 fixture 特別小心凡是返回可變對象的要么返回不可變版本要么在每個用例里 copy 一份再操作。第三個坑是參數(shù)化組合爆炸。一開始圖省事把三個參數(shù)的所有組合都列在parametrize列表里20 個參數(shù)組合直接讓測試時間翻了 3 倍。后來我學(xué)會了在測試數(shù)據(jù)里做篩選冒煙測試環(huán)境只跑關(guān)鍵組合全量回歸才跑完整數(shù)據(jù)組合用標(biāo)記機制分流執(zhí)行時間立刻降下來了。第四個坑很隱蔽是編碼問題。Windows 環(huán)境下跑 pytest用例里包含中文斷言時控制臺輸出亂碼或直接報 UnicodeDecodeError。后來在pytest.ini里加了一行配置就解決了[pytest] addopts -p no:cacheprovider這行配置的作用是關(guān)閉 pytest 的緩存插件通過插件層面的跳過來繞開某些 Windows 環(huán)境下的編碼陷阱。具體來說這個插件在某些場景下會對測試文件的緩存與寫入產(chǎn)生影響尤其在控制臺代碼頁不是 UTF-8 時容易引發(fā)亂碼問題關(guān)閉掉之后清爽很多。如果你在 Linux 或 macOS 上開發(fā)基本不會遇到這個坑但 Windows 用戶一定要記住這個配置。9. 學(xué)習(xí)路徑與擴展方向建議9.1 從 Pytest 走向自動化測試全棧Pytest 是自動化測試的一個入口但不是終點。我的建議是先夯實基礎(chǔ)再往外擴展?;A(chǔ)階段要掌握 Python 語法、requests 庫、Pytest 核心功能、數(shù)據(jù)驅(qū)動、接口測試基本流程。這階段大概需要 4 到 6 周每天花 1 到 2 小時實操是能比較扎實完成的。進階階段可以往幾個方向拓展一是接 CI/CD把測試工程接入 Jenkins 或 GitHub Actions理解整個研發(fā)交付鏈路二是做自定義插件比如寫一個 Pytest 插件來自動統(tǒng)計用例耗時、自動生成測試報告三是往性能測試和安全測試方向延伸這時候 Pytest 依然可以用它不只是功能測試的專屬工具。給大家一條我自己的學(xué)習(xí)路徑參考先寫 50 條接口用例覆蓋 get/post/put/delete 四種方法掌握參數(shù)化和 fixture把工程結(jié)構(gòu)規(guī)范化引入 Allure 報告接上 Jenkins 定時任務(wù)再學(xué) Playwright 或 Selenium把核心用戶路徑做成 UI 自動化用例回頭重構(gòu)公共方法抽出數(shù)據(jù)驅(qū)動框架寫自定義斷言和工具庫嘗試用 pytest-xdist 做分布式執(zhí)行優(yōu)化整套測試工程執(zhí)行效率每個階段都要實際跑出效果來別在課程視頻上停留太久動手寫過代碼才算真正掌握。9.2 一個經(jīng)驗如何讓團隊接受自動化測試最后想聊一個技術(shù)之外的問題。很多測試同學(xué)學(xué)會 Pytest 后在團隊里推自動化測試卻遇到阻力開發(fā)覺得測試腳本沒用領(lǐng)導(dǎo)覺得投入產(chǎn)出不高。我的體會是自動化測試的落地不只是技術(shù)活更是管理活。從 Pytest 的視角看你需要讓報告會說話。Allure 報告里的用例通過率、失敗分布、執(zhí)行耗時能直觀地告訴團隊目前的質(zhì)量狀況和風(fēng)險點。先把一兩個核心模塊的自動化做起來用真實的數(shù)據(jù)證明它能發(fā)現(xiàn)多少 bug、節(jié)省多少回歸時間再逐漸擴大范圍比一上來就鋪開全量自動化要穩(wěn)妥得多。說實話Pytest 本身值得寫的東西太多一篇文章不可能面面俱到。我盡量把從選型到實戰(zhàn)、從接口到 UI、從本地調(diào)試到 CI 集成的完整路徑串了一遍也希望各位能在自己的項目中把這些經(jīng)驗落地驗證一遍。代碼寫多了自然會有手感坑踩多了自然會有經(jīng)驗。自動化測試這條路入門不需要太高的天賦但持續(xù)走下去一定會有豐厚的回報。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
中文在线视频久1| 色婷婷亚洲在线| 99久久网站| 99在线精品视频免费| 日韩精品AV一区二区三区| 成人超碰Av| 色碰干| 久久久久久久久久8888| AV成人在线播放| 丁香五月婷婷啪| 这里只有精品96| 久热这里只有精品6| 伊人五月综合网| 免费观看亚洲AV片| 我去色色网五雨天| 五月丁香婷婷老司机| 婷婷五月天综合网| z色五月播播久久| 情欲综合网| 91九色超碰正在播放| 欧美性爱五月天| 亚洲天堂aaa| 色八月婷婷| 婷婷色五月天色色| 色九九一二| 久久婷婷亚洲| 色欲久久综合| 九九碰九九爱97| 久久激情天堂| 婷婷人人操| 3www激情| 嫩草乱码一区三区四区| 色五月婷婷在线观看| 亚洲 精品 综合 精品| 激情久久网| 91夫妻网站九色| 激情综合五月| 91夫妻视频| 狠狠穞A片一區二區三區| 草五月| 婷婷六月插屄激情| 激情狠狠丁香月| 五月丁香六月婷婷精品| 欧日美女Va| 4399亚洲视频| WWW·天天操·视频?| 噜噜狠狠色综无码久久合欧美| 国内婷婷丁香社区在线播放| 天天舔天天摸天天射| 9色在线视频| 天天色99| 婷婷综合网站| 亚洲激情99| 99视频色在线观看| 草婷婷在线| 色色色在线免费视频| 亚洲色色色色色| 91热爆在线| 综合性爱网| 色婷六月| 婷婷激情五月天天天开心| 亚州精品色情无码A片| 大香蕉综合| 久操激情| 天堂爱爱| 第四色首页| 五月天另类小说| 婷婷五月天狠狠搞干| 综合色综合| 日韩在线婷婷五月天综合| 五月丁香狠狠| AV网站免费在线| 五月婷婷激情久久| 五月婷婷性爱| 国产成人亚洲综合亚洲| 99亚色色色| 99超在线| 七七色色综合| 中文字幕日产A片在线看| 九九精品免费视频99| 婷婷五月天激情影片| 五月天激情中文字幕| 淫荡综合网| 色婷婷社区| 色欲久久久久久综合网综合网| 97碰免费视频在线| 久综合九综合99| 婷婷色网址| 久久看婷婷| 五月婷婷在线短视频| 五月永久激情| 日韩成人AV在线| 九热视频| 婷婷五月色综合| 人妻内射麻豆视频| 五月婷婷啪啪啪| 色99色| 七七婷婷综合| 色 免费网站视频| 噜噜噜噜在线| 五月婷婷激情网| 九一娱乐在线观看视频| 五月丁香激情片| 久久九九大香蕉电院| 婷婷激情六月综合| 丁香花狠狠婷婷亚洲中文字幕| 九九热婷婷| 99在线观看视频精品| 岛国av电影网站| 亚洲人妻av| 激情婷婷丁香| 婷婷丁香大香蕉| 日本精品人妻无码77777| 色婷婷综合电影| 激情开心五月婷婷| 开心五月婷婷激情| 97干在线视频| 欧美日比视频| www,色综合| 五月情四婷婷| 九九黄色网| 色五月婷婷伊人| 色人久久| 久久激情网| 天天摸天天日天天舔| 五月丁香偷拍| 五月丁香婷婷色色| 六月99天天婷婷激情综合| 丁香婷婷狠狠97| 色噜噜狠狠色综合无码久久欧美| 丁香五月情| 玖玖婷婷色欲| 精品色色色| 久久婷婷视频| 五月熟妇婷婷久久| 九九九九精品精| 五月六月丁香激情视频| 99色色| 丁香五月婷婷基地| 这里只有精品视频免费在线观看| 五月综合色| 色色色国产| 99热在线观看99| 一本综合丁香日日狠狠色| 操操碰| 色情五月婷婷| 五月天激情视频| 久久激情综合| 99视频内射三四| 激情综合播播| 热思思九九| 思思久ren热| 久久停停超碰| 噜噜色五月| www.色综合| …亚洲黄色在线播放日韩、av中文a…| 2020夜夜操天天爽| 激情6月| 婷婷综合五月天激情| 亚洲这里只有精品| 开心五月天私房婷婷| 91久久婷婷| 色色色热热热| 99热老网站| 婷婷四色五月| 天天操天天爱天天日| 思思99久久| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 久操无码| 婷婷第六色| 91精品丝袜久久久久久| 热久久思思热思思| 香蕉影院色| 99日韩网站| 99在线精品免费视频| 色丁香五月婷婷| www.日韩国产| 久久99热这里只有精品23| 婷婷欧美| 十月丁香九月婷婷综合| 久久婷婷五月天激情| 婷婷 伊人 久久| 日韩精品一品二区三区的使用体验| 婷婷五月天高清无码| 欧美啪啪网| 啪啪 综合网| 激情婷婷久久| 亚洲成av人影院| 26UUU在线观看| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 婷婷免费视频| 91五月天| 狠狠五月综合在线| 久久色天堂| 色综合色色色| 激情五月婷黄版| 欧日韩成人| 婷婷金品综合视频| 狠狠草狠狠草| 怕怕視頻| 久久久久98| 六月丁香五月天| 色婷婷成人在线| 天天干天天日日| 五月天伊人| 第四色婷婷五月| 一区二区你懂的| 亚洲综合九九| www.五月瑟| 国产日韩av片| 久久成人亚洲欧美电影| 五月婷婷啪啪| 97干欧美| 人人爱人人草| Va另类视频| 日韩在线成人电影| www.91五月| 91久久色| 99re思思热久久| 五月婷俺去也| 午夜爱爱网站| 日本偷拍九九九| 婷婷五月天免费视频| 婷婷欧美色| 久久五月婷综合网| 亚洲黄网AV| 亚洲啪视频| 人妻尝试久久久久久久久久久久| 色色99| 五月天久久小说| 六月激情婷婷| 五月丁香婷婷导航视频| 人人操人av| 日日日,com| 伊人久久综合| 97人人操人人拍| www.zbzhongsen.com| 亚洲丁香五月天视频| 亚洲视频在线观看99| 九月av| 免费色婷婷| 亚洲V国产V欧美V久久久久久| 丁香九九九九| 狠狠色噜噜狠狠狠狠综合| 丁香婷婷伊人| 五月激情基地| 色播丁香婷婷五月激情| 婷婷涩五月天综合| 婷婷丁香综合成人| 免费做A爰片77777| 日日噜噜夜夜狠狠久久丁香六月| 色色a| 色色色色色色97| .操區COm| 亚州激情在线视频| 午夜 外网 精品 在线| 99热爱爱干干日| 六月丁香婷婷综合影院| 激情五月天婷婷色色色色色色色色色色色| 激情网 久久| 99精品在线观看| 久久久www| 五月丁香成人小说| 九九精品综合| 啪啪啪大香蕉| 久久曰曰| 极品人妻VIDEOSSS人妻| 五月成人丁香av91| 欧美性交一区二区三区| 97视频.干com| 精品色情一区二区三区四区| 色亚洲中文| 人人干天天舔| 婷婷五月丁香五月天| 成人色色综合| 五月天婷婷导航| 亚洲舔观看| 婷婷中文无码| 极品 少妇 内射| 色。 婷婷婷| 熟女乱论网| 97涩涩丁香五月天| 日日夜夜综合| 日韩在线9| 91婷色| 五月天久久婷婷| 99操碰| 日本丁香五月| 影音先锋秋秋五月婷婷| 狠狠色噜噜狠狠| 欧美 日韩 成人 在线| 日本色色色| 五月婷婷免费在线| 欧美成人精品老美女噜噜噜| 99青青草| 久久人妻精品| 日韩啪图| 九九综合视频在线观看| 五月激情五月婷婷五月天在线| 五月婷婷丁香瑟瑟视频| 色婷婷狠狠爱| www.久99| 99ri久久| 丁香五月激情鲁| 91大神操美女| 无码一区精品一区视频| 大香蕉久久草| | 人人摸人人摸| 精品人妻伦九区久久AAA片| 丁香影院五月综合| 91碰碰碰| 色噜噜狠狠插综合| 久久伊人大香蕉| 婷婷99综合| 五月丁香婷婷成人版| 99色区| 天天肏天天爽夜夜爽| 婷婷五月天综合网| 五月伊人91| 五月天天堂久久| 婷婷综合五月天激情| 五月丁香婷婷成人网| 操操啪| 99九九精品视频推荐| 97色永久免费视频| 天天日夜夜帕| 牛牛澡牛牛爽| wWwCom夜操wwW| 丁香六月亭亭久久综合| 日日日日日| 日本黄色精品| 久色资源网| 五月婷婷五月天| 五月天激情综合网| 五月婷婷视频ab| 久久久久久久97| 综合久久十三| 五月婷婷亚洲综合网| 91成人看片| 色和综合网| 婷婷五月在线免费| 91精品久久久久久久| 丁香九月激情在线视频| 亚洲色域网| 玖玖婷婷五月天| 另类图片五月天激情| 亚洲激情图文小说| 久久久久久久久久8888| 开心五月综合激情网| 色五月丁香六月欧美综合| 色五月丁香婷婷| 国产精品丝| 99热的无码| 成熟妇人A片免费看网站| 丁香五月天激情| 丁香婷婷色五月激情综合| 黄色国久久| 五月天婷亚洲天综合网综合| 99热在线播放| 九九人妻福利| 99热综合| 激情亚洲五月| 日本波多野结衣视频| 玖久精品视频9| 国产特级毛片AAAAAAA高清| 99无码视频| 久久伊人9| 六月丁香婷婷大香蕉| 婷婷五月六月激情| 91九色成人原创视频| 婷婷中文字暮| 中文字幕不卡视频| 天天日天天爽| 另类图片天天影视在线观看| 日韩色色视频| 丁香五月天殴美激情| 五月天婷婷色| 成年人看Va免费视频| 激情影院69| 狠狠色丁香久久婷婷综合五月| 国产精品成人AV在线观看春天| 日本天天综合| 激情婷婷五月在线合集| 久久人妻精品| www.婷婷网| 日本欧美成人片AAAA| wwccc久久久| 五月Huangsewang| 婷婷五月18永久免费视频| 成人久碰| 色久影院| 日本黄色精品| 狠狠干狠狠色| 成人精品99| 婷五月天| 狠狠综合| 丁香五月六月激情| av免费在线网站| 五月丁香婷婷成人网| 色综合色五月| 不卡在线中文字幕无| 丁香五月23111| 天天射色五月天| 婷婷久久综| 狠色综合网| 六月丁香五月婷婷| 日日操夜夜撸| 五月丁香婷婷婷婷综合网| 免费播放AV| 五月婷婷深深爱| 天搞天天天天天| 亚洲第一成人无码A片| 开心色五月天久久久久久久| 91欧美| 婷婷五月丁香青青草在线| 色色色99| 五月天成人在线视频丁香| 91大神在线免费看视频全集男男一起操| 性爱久久| 六月五月婷婷| 91精品91久久久中77777| 精品久9| 高清不卡一区| 天天谢天天操| 久久久久久久久久久久久久人妻视频| 97人妻碰碰碰久久| 日韩人妻AV在线| 99久精品视频| 五月丁香婷婷六月| 五月深爱婷婷| 99无码视频| 99精品丰满| www色五月| 色 色 色综合com| 天天日天天狠狠操| 五月丁香美女视频| 久久九九99桃花视频| 五月婷婷丁香| 丁香五月成人社区| 久久九精品| 婷婷六月久久| 婷婷日| 久热这里只精品| 怡春院天天干| 韩国中文字幕91| 五月花激情| 噜一噜在线| 激情五月天色婷婷综合| 丁香婷婷偷拍| 婷婷五月天综合蜜桃| 91视频精品99| 香蕉操亚洲| 九九99视频精品| 天天日天天插| www.yw尤物| 99亚州综合精品成人网| 五月天婷久精视频| 久久久精品色色色| 五月天婷婷视频30| 国产精品视频久久99| 五月久久噜噜| 在线VA视频| 狠狠色狠狠干| 久久99最新| 97福利视频| 丁香 久久| 天天肏天天肏| 日亚二欧美| 激情 婷婷| 狠狠色狠狠爱| 日韩超碰在线| 欧美99热| 天天色天天爽| 五月激情丁香五月宗合| 丁香婷婷成人在线播放| 第四色婷婷丁香五月| 婷婷爱五月天人人爱| 五月丁香六月婷婷亚洲| 五月好婷婷| 看久久性爱视频| xxx综合在线| 26uuuavcom| 色婷婷五月综合在线| 午夜精品777| 久久这里只有精品网| 丁香五月婷婷精品视频| 亚洲AV色婷婷人禽五月天| 亚洲激情婷婷| 91精品久久久久久| AA丁香综合激情| 99re6在线视频精品免费| 99精品无码网站| 国产成人综合在线| www久久久| 思思精品视频| 成人无码髙潮喷水A片| 日本色色影片| 97久操视频| 超碰91av| 五月天综合缴情网网站0| 思思久久96热在精品国产,| 99热99热| 影视av久久久噜噜噜噜噜三级| 丁香五月天色婷婷| 亚洲色就是色色色| 五月丁香毛片| 婷婷丁香成人在线视频| jizzdr| 99久久久久| 丰满老熟妇BBBBB搡BBB| 大香伊人婷婷| 激情另类综合| 思思热久热| 六月婷婷激情| 婷婷综合中文| 国产精品国产| 99精品成人无码A片观看金桔 | AV亚洲在线| 亚洲国产成人在线| 婷婷丁香成人网址| 99久久久久久| 在线视频九色97| 91人人澡人人爽人人看| 婷婷丁香五月激情中文字幕版| 伊人五月综合网| 久久怕怕视频| 色婷婷AⅤ| 欧洲一区二区| 丁香婷婷噜噜| 欧美肉大捧一进一出免费视频| 亚洲天堂玖玖| 天天日人人| 婷婷中文字幕| 国产精品久久久久久久久久| 国产老熟妇亲子乱对白| 五月婷婷干| 九九综合九九| 一区无码| 丁香婷婷啪啪啪| 婷婷五月成人| 91人人操人人爱| 色噜综| 99亚州综合精品成人网| 五月婷婷婷| 九九久久99| 六月激情婷婷| 97久久人人操| 五月天伊人久久久久| 国产古装妇女野外A片| 精品成人在线观看| 色五月婷婷在线| 超级碰碰碰久久网站| 九九热这里有精品23| 欧美综合五月丁香六月婷| tingtingseav| 青青草婷婷综合五月| 亚洲av成人在线| 久久婷婷综合色丁香| 午夜九九电影| 99热在线观看| 婷婷五月天777| 大香蕉五月天| 色,激情五月天| 五月丁香啪啪网| 国产av第一专区| 狠色狠色狠色狠色狠色网| 在线成人网站| 另类视频一区| 五月婷婷综合网| 久久婷婷国产| 色色五月天网站| 丁香六月激情综合网| 婷婷五月伦理网站| 五月婷婷综合天天操| 婷婷丁香五月欧美人| 最近中文字幕2019视频1| 婷婷六月丁香在线| 婷婷五月天AV| 久久综合热17c| 嫩BBB搡BBBB榛BBBB| 丁香五月视频在线观看| 九八Av| 色婷婷丁香五月天在线视频 | 婷婷丁香视频在线观看免费 | 成人VAV视频在线观看| 天天搞天天色综合| 玖玖婷婷综合| 色婷| 激情五月天婷婷激情| 婷婷爱五月天| 五月婷婷之综合激情| 九九自拍网| 五月天com| aaaaa黄色| 超碰在线国产| 久草xx性爱视频| 伊人九九68| 青青草原伊人网| 99色综合网| 俺去也五月| 六月色婷婷欧美| 激情五月丁香五月色| 五月丁香色婷婷基地| 精品99*| 天天噜噜| 婷婷五月色| 青草青草视频2免费观看| 亚州精品久久久久AV无码| 久久久99日本大片| 色五月激情五月开心五月| 色综合色欲综合天天免费| 三级黄色大片视频| 玖玖精品视频| 91网站黄| 99精品视频播放| 久热黄色| 天天 青草 丝袜制服 在线| 日本少妇AA一级特黄大片| 久久久久久人妻久久久久久久久久人妻久久久 | 婷婷久草| 噜噜噜精品欧美成人在线观看| 99久久精品国产色欲| 九九精品免费| 婷婷久久亚洲| 996er在线观看| 婷婷丁香五月在线观看91| 久久曰曰| 97色色在线视频| 色婷婷狠狠| 在线精品97| 欧美久久婷婷| 亚洲美女网Va| 很很干五月天| 九九99精品| 久久综合五月情| 婷婷色婷婷| 综合色色色色色色| 天天婷婷天天| 特黄三级片| 991自拍视频| 久久丁香五月婷婷| 大香蕉520| 欧美成人A片AAA片在线播放| 久久九九爽| 嫩BBB槡BBBB搡BBBB视频| 人伦30P| 92久久久| 9国产在线视频| 色色色色综合网| 五月丁香六月婷婷综合网站| 婷婷5月天激情综合| 99人人干| 丁香玖玖| 996re热精品视频| 天天干天天爽| 五月丁香香蕉| 超碰久热| 色综合综合色| 日亚二欧美| 99国产这里只有精品| 五月天另类综合网| 一本久久亚洲五月婷婷| 天天日天天狠狠操| 淫视馆aV二区一区| 日本九九视频| 久久人操-久草婷婷-成人AV| 色99免费视频中文| 亚洲视频在线网| 激情性爱五月天网页| 超碰99在线观看| 婷婷在线视频| 亚洲色五月| 激情www| 99热最新网址| 狠狠操综合| 91碰| 九色视频91疯狂| 26uuu欧美| 欧美久久网| 夜夜操狠狠操| www.91婷婷| 天天舔天天爽| 91精品综合久久婷婷九色| 99精品视频在线观看| 六月婷婷五月天| 99色免费观看全部| 深爱激情五月网| 婷婷天天日婷婷| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 丁香五月婷婷久久久| 久久婷婷六月综合国际| 91主播在线| 一级性爱大片| 91久久综合亚洲噜噜成人在线| 日亚二欧美| 五月婷婷天堂| 欧美99热| A A色色| 综合婷婷五月丁香在线观看| 婷香五月激情视频| 99热精品在线播放| 激情五月天网| 婷婷大香焦| 91丨九色丨国产打屁股网站| 九九九午夜视频| 97人妻碰碰中文无码久热丝袜| 婷婷五月天国产精品| 天天插综合在线| 99热大片| 婷婷在线激情| 99热66| 68热超碰在线| 亚洲无码yw| 激情六| 这里只有精品视频在线看| 人人草人| 九九热在线视频观看| 精品一二三区久久AAA片| 婷婷碰碰| 99日韩| www.思思99热| 99ri精品在线| 色五月情| 九九色影视| 怡红院院久久| 久草视频一,二三四| 狠狠干狠狠色| 久久一操| 影音先锋按摩| 亚洲精品午夜国产va久久成人| 色五月色五天色情网| www.五月天| 色婷婷狠狠18| 91欧美| 日本在线观看99| 综合久久综合| 夜夜谢天天干| 五月综合激情婷婷六月色窝| 18久久| 99热99热在线观看| 先锋资源91| 久操香蕉| site:hcxsz888.com| 天天色天天爱天天爱天天爱y| 九九久久99| 91热手机在线| 玖操97| www.色综合| 红桃91人妻爽人妻爽| 亚洲婷婷月丁香五月| 丁香婷婷色色| 亚洲成人电影在线免费观看| 在线观看熟女少妇| 免费黄色视频网址| 中文字幕婷婷在线| 99热99精品在线观看| 婷婷五月天成人网| 大大香蕉综合在线| 日本特黄aaaaa| 日本人妻A片成人免费看片| 亚洲精品九九| WWW,五月天| 夜夜撸日日操| 无码人妻一区二区一牛影视| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 亚洲综合草草| 丁婷婷五月天在线播放| 婷婷五月花| 欧美va视频不用播放器的va视频网| 色噜噜五月天| 欧美日韩国产一区二区| 26uuu欧美宗合| 四川女人毛多水多A片| 99热这里有精品6| 99热6这里只有精品| 91在线日本| 色婷婷五月中文字幕在线dvd| 六月五月天婷婷涩播在线| 久久五月六月| 国产精品色色| 亚洲五月天综合色| 99热这里是精品| 国产1区2区3区在线观| 97久久久| 久久草大香蕉| 99ri精品| 噜一噜免费视频| 欧美日韩成人| 97干在线| 777精品久无码人妻蜜桃| 久久66er久久| 婷婷五月成人| 丁香五月婷婷丫| 99久操视频| 天天干天天爽天天爽| AV在线不卡播放| 狠狠干激情五月| 思思热99er| 婷婷五月激情视频| 99久久.www| 五月丁香六月激情| 超碰成人免费| 日韩成人精品中文字幕| 亚洲爱爱无码婷婷色五月| 久久久香| 综合五月婷婷| 色婷婷婷综合五月天| 天天射天天插天天干| 九九热手机在线视频| ztEJj| 六月丁香五月天| 96精品久久久久久久久| 婷婷亚洲综合| 丁香五月天视频在线播放| 丁香激情五月天| 俺去也婷婷| 他改变了拜占庭| 国产午夜成人免费看片无遮挡| 狠狠色丁香婷婷综合久久97AV| 丁香五月激情综合久久| 精品婷婷| 能看的av片| 99久久久精品| 97狠狠色| 97色婷婷五月天| 久久在线大香蕉| 激情五月婷婷丁香| 欧美性二区| 4438亚洲欧美| 69色婷婷| 久热这里这里有精品| 婷婷丁香五月基地| 亚洲精品亚洲人成人网| 狠狠操天天日| 五月天婷综合| 九九日伊人| 日本3级片一区2区| 欧美色播综合在线观看| 日韩高清久久| 欧美槡BBBB槡BBB少妇| 综合网五月| 梁铮版蜘蛛女在线观看| 99碰| 熟女少妇内射日韩亚洲| 五月开心网| 五月丁香啪综合| 久久XX日本综合| 操人无码| 色婷婷久综合久久一本国产AV| 婷婷激情小说网| 99热黄| 色五月婷婷在线| 综合五月网| 丁香婷婷六月天| 五月丁香自拍| 婷婷伊人五月天| 26uuu国产| www.五月丁香av| 五月丁香美女视频| 天堂久久大香蕉| 五月婷婷综合激情小说| 成人丁香五月天| 99热在线这里| 色欲香综合网| 伊人春天av| 五月激情射| 90色免费视频| 少妇真实被内射视频三四区| 91热爆在线| 五月婷婷色激情| 亚洲视频丁香网va| 久久99热这里只有| 中文字幕丰满人妻无码专区| 91麻豆国产三级精品福利在线观看| 久久这里有精品| 99综合自拍| 久久视频这里99| 亚洲精品乱码久久久久99| 久久草大香蕉| 伊人婷婷大香蕉| 激情久久网 | 香蕉操亚洲| 日本丁香五月| 99国产这里只有精品| 丁香开心深爱| 成人片在线播放| 丁香六月婷婷综合欧美| 月丁香久久久| 婷久久久| 五月婷婷精品视频| 婷婷五月天综合久久日美女| 综合AV网| 大香蕉丁香五月| 日韩黄色影院| 婷婷丁香五月综合网| 99精品视频在线观看| 九九色影院| 99爽视频| 999婷婷综合| 狼人久草| 超碰操网| 啪啪激情网| 另类激情综合| 97色色婷婷| 婷婷午夜| 九九成人电影婷婷| 曰韩五月丁香色婷婷无码| 91久久精品国产91性色TV| 午夜成人片400| 爱穴久久| 婷婷五月天久| 免费看片在线观看| 另类图片激情五月| 激情久久综合| 亚洲国产精品成人免费一区久久久在线观看AAAA| 五月婷色| 久1色色| 狠狠人妻久久久久久综合丁香| 婷婷综合网在线| www.激情五月天com| 亚艹艹| 日本婷婷五月天| 激情六月综合| 香蕉AV福利精品导航| 亚洲V国产V欧美V久久久久久| 九色激情| 大香蕉久热| 成人噜噜网| 99久在线视频| 国庆精品久久| 九九精品在线网| 这里只有免费的精品| 天天天操天天天日| 久久99精品久久久久久三级| 色五月激情网| 五月天成人在线视频网站| 成人国产欧美大片一区| 色欲久久99精品久久久久久| 91干在线| 99 频99热国里只有精品| 五月天激情国产综合AV| 极品另类| 亚洲综合另类| 精品热九九| 久久九色| 99视频这里只有久久精品| 伊人五月综合网| 丁香六月激情| 综合久久综合五月天婷婷| 五月丁香婷婷啪啪综合| 性小说五月天| 91精品久久久久、久五月天| 五月天综合久久| wuyuedingxiang| 在线不卡视频| 人人操人人爱丁香五月| 亚洲99热| 丁香婷婷综合影院| 丁香五月天堂网| 人人爱国产| 天天色天天日| 黄色毛片精品| 婷婷激情五月综合基地| 超碰国产在线观看| 无码免费人妻A片AAA毛片西瓜| 操97在线观看| 91超碰人人操| 丁香五月婷婷激情蜜桃| 色色亚洲五月天| 影音先锋美国A| 9999三级片| 另类色网| 婷婷射丁香| 婷婷色资源| 五月亭亭欧美女人| 天天成人丁香美女AV| 激情丁香五月天| 婷婷久综合| 天堂爱爱| aa久久| 一二线视频 另类| 99热99ai| 久久9精品视频| 99热在线精品观看| 欧美啪啪9| 欧美日韩AAA| 色色a| 色偷偷色婷婷| www.激情五月天| 亚洲日本韩国| 久久这里都是精品免费| 综合色影院| 高清国产一级婬片a免费| 亚洲成人电影aaaa| www色色com| 丁香色综合| 99超级碰碰| 婷婷94s| 久鲁鲁色网| 色爱五月天| 99福利导航| 日韩人妻在线观看| 五月天婷婷丁香花| 一级操逼内射在线视频| 婷婷丁香六月天| 亚洲色婷婷婷婷人人爽| 第五色婷婷| 只有精品在线观看| 五月婷婷激情综合| 久久大香蕉视频| 色色色色网| 激情精品久久| 久久性爰视频这里只有精品| 亚洲九九99精品视频在线播放| 婷婷爱综合| 激情久久五月天| 狼人婷婷综合| 五月天婷婷基地综合网| 色婷婷天堂| 天天综合色丁香| 六月丁香开心婷婷欧美| 天天干天天日日| 无码免费人妻A片AAA毛片西瓜| 99热免费精品| 中文无码婷婷| 亚洲午夜精品久久久久久人妖| 99热6精品| 久久这里只有精品5| 天天干天天干天天干天天干天天干| 色色色色热热| 五月综合久久| 婷婷深爱五月天在线| 碰碰碰97国产| 99热在线免费| 一起肏在线视频| 久久综合性| 九月丁香婷婷| 五月天激情国产综合婷婷婷| 99re这里只有精品视频6| 国产精品国产成人国产三级| 中文网av| 免费AV在线网址| 98色花堂98t.R| 丁香五月天欧美成人| 丁香五月AV| 四色AVwww| 91视频免费后入强操| 五月婷婷99热| www.色婷婷。com| 五月天丁香久久综合| 色播激情五月天| 亚洲激情综合网| 99在线免费视频| 日屌日日操日日色| 色色激情网| 精品一二三区久久AAA片| 俺也高清无码高清视频| 五月久久网| 内射人妻视频国内| www.成人婷婷综合| 99热亚洲| 激情六月婷婷啪啪| 狠狠狠狠狠狠| 99久久a线观| 精品自拍97| 99啪啪| 六月丁AV| 国产超碰在线| 人操91在线| 激情综合色| 伊人9999| 综合激情五月四射婷婷| 99久| 久久激情网| 久久激情五月天| 99操逼视频| BlACKEDRAW视频一区二区| 婷婷伊人综合中文字幕| 另类综合网| 成人 在线 日韩| 色五月综合激情网| 婷婷五月丁香基地| 一本综合丁香日日狠狠色| 色 免费网站视频| 五月丁香亭亭A片| 91色综合| 国产va视频| 欧美激情xxxXX| 亚洲AV人人操| 五月桃花网综合| 99精品自拍| 色婷婷小说网| 丁香五月狠狠综合欧美| 激情综合五月丁香| 丁香深五月婷婷| 丁香伊人网| 丁香婷婷视频| 色婷婷成人影片| 色色综合网站| 五月天婷婷涩涩| 九九热9| 久久激情五月天| 一本婷婷丁香久久| 专区无日本视频高清8| 七七九色| 人人干av| 天天舔天天插天天干| 人人叉久| 婷婷丁香五月基地| 欧美激情综合五月色丁香| 五月丁香婷婷综合网| 大香蕉欧美在线| 婷婷丁香小说| 亚洲色色色色| 干亚洲天堂| 天天人人综合| 99热精品观看| 玖玖婷婷精品| 操b视频在线观看一区二区| 亚州在线中文字幕| 久久婷婷精品| 夜夜爽天天爽| 五月天啪啪啪| 五月综合六月婷婷| 色婷婷五月天综合网| 亚洲激情淫网| 九月婷婷综合八月丁香在线观看| 丁香五月六月婷婷殴美综合| 黑人糟蹋人妻HD中文字幕| 国产麻豆视频| 啊v视频在线观看| 九九热最新| 色色五月婷| AV在线大香蕉| 超碰九色| 丁香五月中文字幕| 99热偷拍| 婷婷丁香五月麻豆| 午夜婷婷| 91精品91久久久中77777| 丁香六月在线| 99综合视频| 大香蕉九九| 激情第四色| 草草操操| 日本在线观看aaa 99| 丁香五月婷婷深爱综合激情| 99免费| 2018国产大陆天天弄| 亚洲av成人在线| 婷婷五月伦理| 99综合| www91精品| 开心久久五月天| 97热在线精品| 超碰国产一区| 亚洲欧洲自拍图片专区五月天| 日本色99| 久热在线观看视频9| 婷婷五月天国产手机在线视频观看| 综合久久97| 欧美色必爱| sewuyuejiqingwang| 97色色色| av一区免费看| 色婷婷狠狠色| 五月丁香综合啪啪| 97操在线视频| 色色色热热热| 影音先锋AV男人站| 黄色99网| 狠狠狠狠狠狠| 五月丁香啪啪激情| 182TV大香蕉| 六月婷婷日| 五月草影视| 99在线精品免费视频| 激情精品久久| 人妻中文在线| 97精品自拍| 激情久久丁香| 色播jjjj| 婷婷中文字幕版| 97干97色| 五月丁香另类图片| 99综合自拍| 97欧美在线| 五月亭亭直播| 欧美日韩日韩成人| 这里只有精品视频一区| 91婷婷视频| 五月花婷婷最新| 国产古装妇女野外A片| 丁香亭亭久久| 婷婷亚洲天堂| 久久婷五月天| 精品人妻一区二区三区四区不卡在| 五月天激情久久| 久久精品4| 久久婷婷国产| 激情另类综合| 色欲九区| 激情综合网五月婷婷| 97香蕉久久超级碰碰高清版 | 91丁香五月| 99精品在线观看视频| 五月天久久网站| 国产成人在线精品| 99热在线中文字幕| 91色色色| 天天干天天操天天爽| 六月欧美综合色情| 五月激情综合网| 天天干天天操天天干天天操天天干天天操| 日本乱子人伦在线视频| 精品色色网| 狠狠噪| 五月婷婷之综合激情| 日韩AV免费| 精品99在线观看| 日本九九视频| 色播五月| peg 2区三区四区的| 亚洲精品一区中文字幕乱码| 天天摸日日舔狠狠添婷婷婷| 91fuliwang| 色色色色网| 欧美va视频| 婷婷激情小说| 色月视频| 久久婷婷七月丁香| 亚洲日日操| 九色七七| 26uuu精品一区二区| 日韩超碰在线| 久草性爱| 九九色色| 综合逼五月激情婷婷| 久久久婷丁香五月| 婷婷婷婷色| 色色丁香婷婷综合| 99ri在线视频| 久久激情五月网| 91操在线观看| 五月天伊人网| 第六色在线| 丁香五月婷婷99| 中文字幕在线免费观看视频| 亚洲色婷婷99一9|| 黄色高清无码| 中文无码婷婷| 五月香蕉综合| 五月色丁香婷婷综合| 人草人人| 99啪啪| 五月婷三级片| 婷婷五月天在线视频网站| 99色这里| www.金莲av| 99激情在线| 五月丁香网站在线播放| 69综合在线| 五月丁香影院| 亭亭五月丁香五月天激情| 九月婷婷综合|