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

ARTICLE DETAIL

資訊詳情

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

深入理解unittest:核心組件、斷言藝術(shù)與工程化實(shí)踐

深入理解unittest:核心組件、斷言藝術(shù)與工程化實(shí)踐 1. 為什么我還在用unittest聊聊這個(gè)老框架的底子先說個(gè)可能讓不少新人意外的事實(shí)即便到了今天翻開企業(yè)內(nèi)部那些跑了好幾年的自動(dòng)化測(cè)試項(xiàng)目Python生態(tài)里出鏡率最高的依然是unittest而不是各種新潮的測(cè)試框架。我知道很多人第一反應(yīng)是unittest不是Python自帶的那個(gè)基礎(chǔ)庫嗎有什么好學(xué)的。但恰恰是這個(gè)被當(dāng)成基本功的東西在真實(shí)項(xiàng)目里被用歪的概率是最大的。我見過太多測(cè)試代碼是這樣寫的一個(gè)TestCase類里堆了五十個(gè)test方法setUp里連數(shù)據(jù)庫連接都順手建了某個(gè)測(cè)試失敗后后面一串用例跟著崩。我們也見過另一種極端——為了避開unittest的各種別扭項(xiàng)目組直接上pytest結(jié)果寫出來的用例風(fēng)格五花八門最后沒人敢改公共conftest。這兩種路我都走過今天這篇就是想從實(shí)際使用的角度把unittest這個(gè)框架從頭到尾捋一遍它的核心組件怎么配合、什么樣的用例設(shè)計(jì)能經(jīng)得住項(xiàng)目迭代、哪些坑是我花了好幾個(gè)晚上才排查出來的。它適合誰來讀如果你是剛?cè)腴T自動(dòng)化測(cè)試、想把測(cè)試代碼寫得有章法的同學(xué)這篇能幫你把unittest的邏輯徹底理清。如果你已經(jīng)在用其他的測(cè)試框架這篇里關(guān)于fixture作用域、mock邊界、測(cè)試組織和排查思路的部分換到哪個(gè)框架里都一樣用。我們不講教科書式的定義堆砌只講在項(xiàng)目里真正靠得住的用法。補(bǔ)充一句我的立場這篇文章不是要吹unittest貶pytest兩個(gè)框架我都重度用過。弄清楚unittest的工作機(jī)制對(duì)你理解pytest的設(shè)計(jì)反而有幫助——pytest很多人性化的設(shè)計(jì)其實(shí)就是在給unittest的痛點(diǎn)打補(bǔ)丁。打蛇打七寸你總得先知道七寸在哪。2. 骨架拆解TestCase、TestSuite、TestRunner、TestLoader到底各管哪攤事很多教程喜歡把unittest四大組件列出來然后逐個(gè)念定義念完讀者還是不知道它們之間怎么聯(lián)動(dòng)。我用一句話先建立起整體印象TestCase定義測(cè)試邏輯TestLoader負(fù)責(zé)發(fā)現(xiàn)和加載用例TestSuite把用例組織成可執(zhí)行的集合TestRunner執(zhí)行并輸出結(jié)果。一套標(biāo)準(zhǔn)的測(cè)試執(zhí)行流程就是這四樣?xùn)|西接力跑。2.1 TestCase一個(gè)用例類究竟該長什么樣先看一段最常見的代碼結(jié)構(gòu)import unittest class TestLogin(unittest.TestCase): classmethod def setUpClass(cls): # 整個(gè)測(cè)試類只執(zhí)行一次適合放耗時(shí)的公共初始化 cls.base_url https://api.example.com def setUp(self): # 每個(gè)test方法執(zhí)行前都會(huì)跑一遍適合做用例間的隔離 self.session create_test_session() def tearDown(self): # 每個(gè)test方法執(zhí)行后跑負(fù)責(zé)清理 self.session.close() def test_login_success(self): resp self.session.post(/login, json{name: user1, pwd: 123456}) self.assertEqual(resp.status_code, 200) self.assertIn(token, resp.json()) def test_login_wrong_password(self): resp self.session.post(/login, json{name: user1, pwd: wrong}) self.assertEqual(resp.status_code, 401) if __name__ __main__: unittest.main()關(guān)鍵的規(guī)矩是類里凡是以test開頭的方法都會(huì)被自動(dòng)識(shí)別成測(cè)試用例執(zhí)行順序按方法名的字典序排。這個(gè)方法名排序經(jīng)??拥饺撕竺嫖視?huì)專門講。其實(shí)按名字排序是有歷史原因的——最早的設(shè)計(jì)就是要保證多次運(yùn)行結(jié)果一致從而讓測(cè)試可重復(fù)。真要靠執(zhí)行順序來控制用例依賴那基本就是把自己往火坑里推。fixture這塊我要多說一句。setUpClass / tearDownClass和setUp / tearDown的區(qū)別本質(zhì)是類級(jí)一次還是方法級(jí)多次。選型原則只有一條資源和時(shí)間成本高、且被所有用例共享的放類級(jí)或者模塊級(jí)需要每個(gè)用例獨(dú)立環(huán)境的放方法級(jí)。我以前在一個(gè)項(xiàng)目里見過有人把所有HTTP連接池初始化放在setUp里300個(gè)用例每個(gè)用例都重建一次連接池跑一遍要近一個(gè)小時(shí)。改成setUpClass之后時(shí)間直接砍到十幾分鐘。反過來如果你在setUpClass里初始化了一個(gè)可變對(duì)象又寫了好幾個(gè)test方法去改它這些測(cè)試就互相污染了——典型的共享可變狀態(tài)問題后面踩坑部分會(huì)展開。2.2 TestLoader和TestSuite怎么把散落的用例抓到一起unittest.main()適合玩具項(xiàng)目真實(shí)項(xiàng)目里測(cè)試分布在十幾個(gè)目錄你要的是有選擇地收集和執(zhí)行。這里就要用TestLoader了import unittest # 從指定目錄遞歸發(fā)現(xiàn)所有測(cè)試模塊 loader unittest.TestLoader() suite loader.discover(tests, patterntest_*.py) # 也可以按類/模塊直接加載 suite2 loader.loadTestsFromTestCase(TestLogin) suite3 loader.loadTestsFromModule(test_user_module)TestSuite則是手動(dòng)組裝用例的容器suite unittest.TestSuite() suite.addTest(TestLogin(test_login_success)) suite.addTest(TestOrder(test_create_order))注意addTest的寫法它接收的參數(shù)是用例實(shí)例里的某個(gè)方法不是整個(gè)測(cè)試類。這在做冒煙測(cè)試集時(shí)特別有用——從各模塊把最核心的三五個(gè)用例撈出來組成smoke_suite每次發(fā)版前先跑它十幾分鐘就能拿到基本結(jié)論。實(shí)用命令再補(bǔ)兩個(gè)。在命令行指定模塊跑python -m unittest tests.test_login指定目錄跑python -m unittest discover -s tests -p test_*.py-m unittest discover這種方式能正常工作前提是tests目錄下有__init__.py或者你從項(xiàng)目根目錄啟動(dòng)。常見報(bào)錯(cuò)ModuleNotFoundError八成就是目錄結(jié)構(gòu)沒帶__init__.py導(dǎo)致Python不把tests當(dāng)成可導(dǎo)入的包。對(duì)這個(gè)問題卡過不少剛接觸的同學(xué)。2.3 TestResult除了綠和紅你還該看什么TestRunner把用例跑完之后產(chǎn)出的TestResult對(duì)象里面信息比終端顯示的多得多。它可以告訴你成功多少、失敗多少、報(bào)錯(cuò)多少、跳過多少、預(yù)期失敗多少。result unittest.TestResult() suite.run(result) print(result.testsRun) print(result.failures) print(result.errors)failures和errors是有區(qū)別的這是新手最容易混淆的一點(diǎn)。failure 斷言沒通過即預(yù)期與實(shí)際不符error 用例執(zhí)行過程拋了未捕獲異常??吹絝ailure你應(yīng)該去查業(yè)務(wù)邏輯是不是被改動(dòng)了看到error則優(yōu)先懷疑測(cè)試代碼本身或者環(huán)境依賴出了問題。區(qū)分這兩者能省下大量定位時(shí)間。我見過團(tuán)隊(duì)把接口返回格式變動(dòng)引發(fā)的AttributeError當(dāng)成了測(cè)試失敗來回查業(yè)務(wù)代碼查了半天才發(fā)現(xiàn)是協(xié)議變了導(dǎo)致測(cè)試代碼里的解析函數(shù)拋異常。知道error先看環(huán)境、failure先看業(yè)務(wù)這類問題一分鐘就能定位。3. 斷言的藝術(shù)從assertEqual到自定義斷言你的測(cè)試在多大程度上說真話斷言是整個(gè)測(cè)試用例的靈魂。斷言寫得好不好直接決定一個(gè)用例失敗時(shí)你能多快地定位到問題。我經(jīng)??吹接腥藬嘌詫懙煤芊笱鼙热缢薪涌谥粰z查HTTP 200結(jié)果下游解析字段時(shí)報(bào)KeyError——這個(gè)200除了說明服務(wù)沒掛什么信息量都沒有。3.1 內(nèi)置斷言到底覆蓋了多少場景unittest的斷言方法比很多人以為的要多。最常用的這些建議全部吃透斷言方法適用場景常見誤用assertEqual / assertNotEqual數(shù)值、字符串、對(duì)象比較用assertTrue(a b)代替失敗時(shí)沒有詳細(xì)上下文assertTrue / assertFalse布爾條件判斷所有斷言都用它丟失類型比較能力assertIs / assertIsNotNone判斷、對(duì)象身份用assertEqual(None, x)語義不清晰assertIn / assertNotIn成員關(guān)系判斷手動(dòng)寫if x in list失敗時(shí)無上下文assertAlmostEqual浮點(diǎn)數(shù)比較可指定小數(shù)位直接assertEqual兩個(gè)浮點(diǎn)數(shù)精度問題隨機(jī)失敗assertRaises驗(yàn)證期望的異常手動(dòng)try/except包裹繞一大圈還容易漏assertRegex正則匹配響應(yīng)內(nèi)容先re.search再加assertTrue多寫三行代碼assertDictEqual / assertListEqual容器對(duì)象比對(duì)assertEqual失敗時(shí)diff信息不夠直觀我想單獨(dú)聊一下assertRaises。這個(gè)斷言有兩種寫法上下文管理器版本是最推薦的# 推薦的寫法 with self.assertRaises(ValueError): parse_user_input() # 另一種寫法可同時(shí)拿到異常對(duì)象做額外檢查 with self.assertRaises(ValueError) as cm: parse_user_input() self.assertEqual(cm.exception.code, 1001)setUp里放了一堆無關(guān)的耗時(shí)操作。有人為了省事把所有用例可能需要的資源全部塞進(jìn)setUp()結(jié)果單個(gè)簡單用例跟著背了十幾秒初始化的鍋。正確做法是區(qū)分核心依賴和邊緣設(shè)施核心放setUpClass或模塊級(jí)邊緣設(shè)施按用例按需加載。斷言寫得太聰明。有些同學(xué)喜歡在斷言里塞復(fù)雜表達(dá)式比如self.assertTrue(any(item[status] done for item in resp_list))。用例失敗時(shí)你能看到的只是True is not false根本不知道resp_list里實(shí)際有什么。改成先篩出結(jié)果再斷言列表非空失敗信息就直觀多了。寫斷言的時(shí)候多想想這行代碼失敗時(shí)你希望自己看到什么。對(duì)我印象最深的一次同事寫了個(gè)測(cè)試斷言u(píng)ser.name ! 結(jié)果某天user是None拋了AttributeError報(bào)錯(cuò)信息完全沒說是哪個(gè)用例哪一行。排查一個(gè)多小時(shí)才發(fā)現(xiàn)是mock沒打上。這類問題如果一開始就注意斷言的可讀性其實(shí)可以避免。3.2 自定義斷言給項(xiàng)目沉淀自己的黑話當(dāng)項(xiàng)目里某些判斷邏輯反復(fù)出現(xiàn)就該考慮封裝自定義斷言了。unittest支持通過子類擴(kuò)展斷言方法規(guī)則是類里定義assertXxx開頭的方法失敗時(shí)拋AssertionErrorclass BaseAPITestCase(unittest.TestCase): def assertResponseOK(self, resp): self.assertEqual(resp.status_code, 200, fHTTP狀態(tài)碼異常: {resp.status_code}, body: {resp.text}) data resp.json() self.assertEqual(data.get(code), 0, f業(yè)務(wù)碼異常: {data}) return data class TestUserAPI(BaseAPITestCase): def test_get_user(self): resp self.client.get(/user/1) data self.assertResponseOK(resp) self.assertEqual(data[name], 張三)這筆賬很容易算封裝之前每個(gè)用例里要寫兩遍斷言一遍看HTTP狀態(tài)一遍看業(yè)務(wù)碼。封裝之后一個(gè)assertResponseOK搞定并且所有用例失敗時(shí)的報(bào)錯(cuò)格式統(tǒng)一了。測(cè)試代碼也是代碼同樣要講DRY原則。3.3 浮點(diǎn)數(shù)比較assertEqual為什么會(huì)莫名其妙失敗這是個(gè)高頻坑。接口返回0.1你代碼里計(jì)算出來0.1兩個(gè)浮點(diǎn)數(shù)直接assertEqual偶爾會(huì)掛。原因在于浮點(diǎn)數(shù)的二進(jìn)制表示天生有精度誤差0.1在計(jì)算機(jī)里實(shí)際存儲(chǔ)的是0.1000000000000000055511151231257827。兩邊計(jì)算路徑不同誤差累積就可能導(dǎo)致最后幾位不一致。解決辦法是assertAlmostEqual它會(huì)比較兩個(gè)數(shù)的差的絕對(duì)值是否在指定精度內(nèi)self.assertAlmostEqual(calc_result, api_result, places5)places5表示保留5位小數(shù)也即誤差容忍到0.00001。什么時(shí)候用幾乎相等金額計(jì)算、比例計(jì)算、多步運(yùn)算后的浮點(diǎn)數(shù)結(jié)果這些場景用assertEqual就是給自己埋雷。整數(shù)和精確十進(jìn)制場景則放心用assertEqual。4. 組織測(cè)試的工程化套路discover規(guī)則、子測(cè)試subTest、跳過機(jī)制單個(gè)用例寫得好只是第一步幾十上百個(gè)用例怎么組織才能長期維護(hù)是真正考驗(yàn)工程能力的部分。這一節(jié)我講三個(gè)實(shí)際用下來回報(bào)率最高的組織套路。4.1 測(cè)試目錄設(shè)計(jì)discover怎么看到你的用例推薦一套經(jīng)過多項(xiàng)目驗(yàn)證的目錄結(jié)構(gòu)project/ ├── src/ │ └── myapp/ │ ├── __init__.py │ ├── auth.py │ └── order.py └── tests/ ├── __init__.py ├── test_auth.py ├── test_order.py └── fixtures/ └── user_data.json這套結(jié)構(gòu)下從項(xiàng)目根目錄執(zhí)行python -m unittest discover -s tests -p test_*.pydiscover會(huì)遞歸掃描tests目錄下所有匹配test_*.py的文件并在每個(gè)文件里找TestCase的子類和test開頭的方法。有幾個(gè)細(xì)節(jié)值得注意模塊名重復(fù)會(huì)導(dǎo)致加載沖突。比如tests目錄下有test_auth.py另一個(gè)子目錄里也有test_auth.pydiscover可能只加載其中一個(gè)。解決辦法是保證模塊名全局唯一。導(dǎo)入路徑基于項(xiàng)目根目錄。運(yùn)行命令時(shí)要在根目錄執(zhí)行或者把根目錄加進(jìn)PYTHONPATH。很多新人是在tests目錄里直接跑discover然后發(fā)現(xiàn)from myapp.auth import ...報(bào)找不到模塊。因?yàn)槟_本運(yùn)行時(shí)當(dāng)前目錄變成了tests根本找不到src下的包。對(duì)比一下pytest在這塊的處理pytest會(huì)自動(dòng)把項(xiàng)目根目錄插入sys.path所以不需要關(guān)心__init__.py這確實(shí)是省事。但理解背后的導(dǎo)入機(jī)制對(duì)排錯(cuò)仍然重要。4.2 subTest一個(gè)用例里循環(huán)校驗(yàn)多條數(shù)據(jù)拆還是不拆假設(shè)你要驗(yàn)證搜索接口對(duì)10組關(guān)鍵詞的返回結(jié)果。最常見的寫法是def test_search_keywords(self): for keyword, expected_count in [(蘋果, 10), (香蕉, 5), ...]: resp self.client.get(/search, params{q: keyword}) data resp.json() self.assertEqual(data[total], expected_count)問題顯而易見第3組數(shù)據(jù)斷言失敗時(shí)整條用例直接中斷后面7組全不執(zhí)行而且失敗信息里根本看不出是哪組關(guān)鍵詞出了問題。用subTest重寫def test_search_keywords(self): cases [(蘋果, 10), (香蕉, 5), (西瓜, 8)] for keyword, expected_count in cases: with self.subTest(keywordkeyword): resp self.client.get(/search, params{q: keyword}) data resp.json() self.assertEqual(data[total], expected_count)subTest干的活是每一輪循環(huán)都算一個(gè)獨(dú)立的子測(cè)試。某個(gè)子測(cè)試失敗時(shí)其它子測(cè)試照常運(yùn)行最后報(bào)告里明確列出是哪組keyword失敗、期望值和實(shí)際值分別是什么。對(duì)subTest的報(bào)錯(cuò)展示非常直觀 FAIL: test_search_keywords (test_search.TestSearch) (keyword西瓜) ---------------------------------------------------------------------- AssertionError: 8 ! 6一眼看清楚是西瓜這組數(shù)據(jù)掛了。這種結(jié)構(gòu)在參數(shù)化場景里極致好用又不破壞unittest本身的框架約束。4.3 跳過測(cè)試什么時(shí)候用skip怎么避免濫用跳過測(cè)試有三種方式。unittest.skip(功能未開發(fā)完) class TestV2API(unittest.TestCase): ... unittest.skipIf(sys.platform win32, 該功能不支持Windows) def test_linux_only_feature(self): ... unittest.skipUnless(redis_available(), Redis未安裝) def test_cache(self): ...我個(gè)人的使用原則代碼還沒實(shí)現(xiàn)的用例用skip掛著依賴特殊環(huán)境的用skipIf/skipUnless。但skip要定期清理和復(fù)查拖太久就成了跳過一時(shí)爽上線火葬場。我見過一個(gè)項(xiàng)目里上百個(gè)skip裝飾器一查都是半年前加的沒人說得清這些功能到底好沒好。skip本來是為了給未就緒的東西一個(gè)體面的位置結(jié)果變成了拖延癥的溫床。一個(gè)務(wù)實(shí)的做法每次跳過的測(cè)試都附帶一個(gè)issue編號(hào)或者截止日期比如unittest.skip(TODO: 依賴外部廠商修復(fù)2025-06-30復(fù)審)。這樣定期清理時(shí)至少有線索可查不至于整個(gè)測(cè)試套件里堆一堆僵尸用例。5. 沒有接口也能測(cè)mock和patch的正確使用姿勢(shì)做測(cè)試的同學(xué)遲早會(huì)遇到這種情況代碼里調(diào)用了一個(gè)第三方支付接口或者要等某個(gè)下游服務(wù)凌晨兩點(diǎn)才開放。不mock測(cè)試根本沒法跑。unittest自帶的mock模塊正是干這個(gè)的。5.1 patch的三種打法從簡單到靈活from unittest.mock import patch, MagicMock # 方式一裝飾器 patch(myapp.services.payment.gateway.charge) def test_create_order_success(self, mock_charge): mock_charge.return_value {trx_id: 12345} ... # 方式二上下文管理器 def test_create_order_success(self): with patch(myapp.services.payment.gateway.charge) as mock_charge: mock_charge.return_value {trx_id: 12345} ... # 方式三start/stop手動(dòng)控制適合setUp/tearDown場景 def setUp(self): self.patcher patch(myapp.services.payment.gateway.charge) self.mock_charge self.patcher.start() def tearDown(self): self.patcher.stop()這里最關(guān)鍵的一個(gè)認(rèn)知是patch里的路徑字符串指向的是使用該對(duì)象的位置不是定義該對(duì)象的位置。舉個(gè)例子你在myapp/services/payment.py里寫了from myapp.clients.pay_gateway import charge然后調(diào)用時(shí)直接用charge()函數(shù)。如果要mock它patch的目標(biāo)應(yīng)該寫myapp.services.payment.charge因?yàn)樗呀?jīng)被導(dǎo)入到payment這個(gè)模塊的命名空間里。寫成myapp.clients.pay_gateway.charge是打不到的等于白打。這個(gè)細(xì)節(jié)坑了很多人測(cè)試跑起來還是真實(shí)調(diào)用下游接口一查才發(fā)現(xiàn)patch路徑寫錯(cuò)了位置。5.2 side_effect才是mock的靈魂return_value只能讓mock返回固定值遇到第一次返回成功、第二次返回失敗這種帶狀態(tài)的場景就抓瞎了。side_effect可以傳入一組值每次調(diào)用依次返回mock_charge.side_effect [ {trx_id: 111}, # 第一次調(diào)用 TimeoutError(超時(shí)), # 第二次調(diào)用拋異常 {trx_id: 333}, # 第三次調(diào)用 ] mock_charge.side_effect lambda order_id: {trx_id: order_id}把side_effect設(shè)置為異常對(duì)象調(diào)用時(shí)就會(huì)拋異?!@其實(shí)是觸發(fā)assertRaises最優(yōu)雅的方式。用真實(shí)的下游服務(wù)去制造一個(gè)第三方超時(shí)代價(jià)太大mock一行就搞定了。5.3 什么時(shí)候不該用mock這個(gè)邊界要想清楚這是我最想強(qiáng)調(diào)的部分。mock好用但什么都mock會(huì)讓測(cè)試失去意義。一個(gè)項(xiàng)目如果所有外部服務(wù)全被mock測(cè)試就變成了純邏輯演練真實(shí)環(huán)境的連不通、協(xié)議對(duì)不齊、數(shù)據(jù)格式變化全都發(fā)現(xiàn)不了。我的經(jīng)驗(yàn)是做如下分層該mock第三方不可控服務(wù)支付、短信、需要特定環(huán)境才出現(xiàn)的行為Windows下測(cè)Linux邏輯、代價(jià)極高的操作真實(shí)發(fā)送郵件。不該mock你自己服務(wù)的內(nèi)部邏輯、項(xiàng)目依賴數(shù)據(jù)庫層的表結(jié)構(gòu)變更——這些恰恰是回歸測(cè)試要抓住的東西。用一句話把握邊界mock應(yīng)該用來屏蔽不可控的外部因素而不是用來掩蓋被測(cè)代碼的真實(shí)行為。如果某個(gè)mock是為了讓測(cè)試通過而硬湊的它通常是個(gè)壞味道。6. 真實(shí)項(xiàng)目踩坑實(shí)錄四個(gè)讓我熬夜的典型問題這一節(jié)的內(nèi)容全部來自真實(shí)項(xiàng)目的排錯(cuò)記錄。我盡量把詳細(xì)的排查鏈路寫出來而不是只給最終結(jié)論。因?yàn)檫@些問題的共同特點(diǎn)是表面上的現(xiàn)象和真正的原因差了不止一層。6.1 坑一用例一多就變慢問題出在setUp而不是代碼現(xiàn)象測(cè)試套件跑了一個(gè)半月之后單次執(zhí)行從20分鐘膨脹到55分鐘同事以為是代碼量增長導(dǎo)致。排查過程我用python -m unittest discover -s tests -v逐個(gè)記錄耗時(shí)發(fā)現(xiàn)一個(gè)非常普通的test_user_profile用例居然花了6秒。再看setUp里面竟然初始化了完整的數(shù)據(jù)庫連接池、Redis客戶端、消息隊(duì)列生產(chǎn)者和第三方支付客戶端。這些是當(dāng)初反正都要用順手加進(jìn)去的。思路糾正setUp是每個(gè)test方法執(zhí)行前都要跑的任何寫在setUp里的初始化都會(huì)乘以測(cè)試用例總數(shù)。一個(gè)功能模塊的公共初始化應(yīng)該按需拆成setUpClass類級(jí)一次或模塊級(jí)fixture?;◣追昼娊osetUp做瘦身收益是幾何級(jí)的——尤其當(dāng)用例數(shù)從一兩百漲到上千時(shí)這個(gè)差距從能忍變成無法忍受。6.2 坑二同一套用例本地是綠的CI上必掛現(xiàn)象本地執(zhí)行全綠推到CI竟然隨機(jī)掛掉兩三個(gè)點(diǎn)開日志看是連接超時(shí)。第一反應(yīng)是CI機(jī)器網(wǎng)絡(luò)不行排查半天發(fā)現(xiàn)其實(shí)是并發(fā)問題。項(xiàng)目里的人為了提速讓CI上兩個(gè)workers并行跑測(cè)試。問題在于測(cè)試代碼里有一個(gè)共享的臨時(shí)文件多個(gè)進(jìn)程同時(shí)在寫寫完一個(gè)進(jìn)程把文件刪了另一個(gè)進(jìn)程讀文件時(shí)FileNotFoundError。排查鏈路先看報(bào)錯(cuò)堆棧指向的文件訪問再看有沒有進(jìn)程間共享的可變資源。定位到臨時(shí)文件之后修復(fù)方案是把臨時(shí)文件改成按進(jìn)程名隔離或者干脆用tempfile模塊自動(dòng)生成每次不同的臨時(shí)路徑。測(cè)試用例之間要絕對(duì)隔離包括進(jìn)程級(jí)別的隔離。寫測(cè)試時(shí)多問一句如果這個(gè)代碼被兩個(gè)進(jìn)程同時(shí)跑會(huì)不會(huì)出事6.3 坑三測(cè)試A失敗測(cè)試B跟著失敗但B的代碼沒有錯(cuò)現(xiàn)象test_auth_token_test失敗之后test_create_public_order必然也報(bào)錯(cuò)。單跑test_create_public_order又是綠的。第一反應(yīng)是跑了什么全局初始化代碼順著調(diào)用棧去查確實(shí)在test_auth_token_test的setUp里有人把當(dāng)前進(jìn)程的全局默認(rèn)時(shí)區(qū)改成了America/New_York。test_create_public_order里生成訂單編號(hào)用到了本地時(shí)間于是時(shí)間差導(dǎo)致斷言失敗。設(shè)計(jì)原則被違反得很典型setUp/tearDown里的全局副作用沒有在tearDown里恢復(fù)。修復(fù)很簡單tearDown里寫time.tzset()恢復(fù)到系統(tǒng)默認(rèn)時(shí)區(qū)。但更根本的問題是setUp里做全局副作用操作時(shí)要極其克制。測(cè)試框架的隔離不只是數(shù)據(jù)隔離還包括全局狀態(tài)環(huán)境變量、時(shí)區(qū)、目錄、配置單例的隔離。這就像用公用的廚房做完飯要收拾干凈不然下一個(gè)人進(jìn)來根本沒法做飯。6.4 坑四assertEqual明明是一樣的為什么還是紅現(xiàn)象mock一個(gè)外部接口返回{total: 8}斷言self.assertEqual(data[total], 8)居然失敗日志顯示8 ! 8。排查到這里基本能鎖定類型問題。data是JSON解析出來的JSON數(shù)字有整數(shù)也有浮點(diǎn)json.loads(8)得到的是float 8.0而期望值是int 8。Python里8 8.0是True所以還能過但assertEqual({total: 8}, {total: 8.0})在dict比較時(shí)8和8.0是不同的key-value。更隱蔽的是有些JSON庫會(huì)把大整數(shù)解析成字符串或Decimal。這類問題排查起來很費(fèi)勁因?yàn)槟闳庋劭吹降臄?shù)字一模一樣。定位方法在斷言前打印type。print(type(data[total]))一行就看出門道。修復(fù)統(tǒng)一接口返回?cái)?shù)據(jù)的解析方案金額和計(jì)數(shù)類字段在做斷言前顯式轉(zhuǎn)成期望類型或者用Decimal比較。斷言之前先確認(rèn)類型一致可以省掉一大類看都看不懂為什么失敗的問題。我至今記得在一個(gè)數(shù)據(jù)驅(qū)動(dòng)項(xiàng)目的上線準(zhǔn)備期測(cè)試報(bào)告里突然冒出一片! in的報(bào)錯(cuò)肉眼看著完全一樣。最后發(fā)現(xiàn)就是類型——某些字段在test環(huán)境是字符串在某些環(huán)境是整數(shù)。測(cè)試的職責(zé)之一就是盡早暴露這類不一致暴露的時(shí)候不要慌先查類型再查值。7. unittest和pytest怎么選以及如何平滑過渡肯定會(huì)有人問現(xiàn)在pytest這么火我是不是應(yīng)該直接學(xué)pytest我的答案是項(xiàng)目的技術(shù)棧和團(tuán)隊(duì)習(xí)慣決定選型但unittest是更普適的底子。而且凡是把unittest邏輯搞清楚的上手pytest也就是一天的功夫。7.1 兩者的核心差異一句話說清pytest相比unittest最大的變化有三點(diǎn)一是不用強(qiáng)制繼承TestCase類普通函數(shù)加test_前綴就能被識(shí)別二是fixture體系更靈活通過函數(shù)參數(shù)自動(dòng)注入作用域和依賴關(guān)系表達(dá)得極清晰三是插件生態(tài)豐富allure報(bào)告、xdist并行、repeat重試全都能以插件方式無縫接入。舉例更直觀。unittest寫參數(shù)化需要subTest或者自己拼TestSuitepytest直接用裝飾器import pytest pytest.mark.parametrize(keyword,expected, [(蘋果, 10), (香蕉, 5)]) def test_search(keyword, expected): assert search_total(keyword) expectedfixture也直觀很多pytest.fixture def session(): s create_session() yield s s.close() def test_login(session): resp session.post(/login, ...) assert resp.status_code 200yield前面是setup后面是teardown讀起來就是準(zhǔn)備資源→執(zhí)行用例→清理資源。7.2 pytest到底比unittest進(jìn)步在哪fixture作用域是pytest最值得學(xué)習(xí)的設(shè)計(jì)。unittest的setUp/tearDown只能區(qū)分方法級(jí)和類級(jí)做不到整個(gè)session共享一次或者每個(gè)模塊執(zhí)行一次。pytest的fixture可以精確聲明scopepytest.fixture(scopesession) def db_pool(): pool create_db_pool() yield pool pool.close()這個(gè)能力在實(shí)際項(xiàng)目中用處太大了數(shù)據(jù)庫連接池這種重資源理應(yīng)session級(jí)共享一次而每個(gè)用例獨(dú)立的數(shù)據(jù)準(zhǔn)備則用function級(jí)。unittest要用setUpClass去模擬session級(jí)效果很多場景下還力不從心。7.3 我的選型建議別盲目跟風(fēng)也別死守舊賬具體怎么選我的判斷依據(jù)是這樣的團(tuán)隊(duì)已經(jīng)重度使用unittest沒有特別痛苦的點(diǎn)就繼續(xù)用??蚣苓w移本身就是成本換個(gè)框架不會(huì)讓測(cè)試質(zhì)量變好好的設(shè)計(jì)習(xí)慣才是根本。新項(xiàng)目、成員以Python為主可以優(yōu)先考慮pytest。它的表達(dá)更簡潔參數(shù)化和fixture的工程化程度確實(shí)高。測(cè)試量大、并行需求強(qiáng)pytest-xdist帶來的進(jìn)程級(jí)并行方案成熟適合測(cè)試集規(guī)模上了幾千之后。unittest要并行得自己去折騰進(jìn)程池和報(bào)告合并。純單測(cè)、輕量場景unittest完全夠用少引入一個(gè)依賴也是一種工程減法。還有一條很實(shí)在的路pytest的框架本身兼容unittest編寫的測(cè)試用例。項(xiàng)目可以在現(xiàn)有unittest代碼上建立pytest運(yùn)行入口pytest能自動(dòng)收集unittest.TestCase類里的test方法不用重寫一行代碼就能先吃上pytest的插件生態(tài)。想遷移的時(shí)候這條平滑路徑能把風(fēng)險(xiǎn)降到最低。把遷移看成漸進(jìn)優(yōu)化而不是推倒重來心理壓力小得多。8. 寫在最后的實(shí)踐建議測(cè)試代碼最好的狀態(tài)是讓新人接手時(shí)能安心地改、放心地跑。這一點(diǎn)上統(tǒng)一的約定往往比花哨的框架更重要。我個(gè)人有幾個(gè)堅(jiān)持了很久的習(xí)慣分享給你參考。第一個(gè)所有測(cè)試都要能獨(dú)立運(yùn)行。單跑某個(gè)用例和跑整個(gè)套件結(jié)果必須一致。如果做不到這個(gè)基準(zhǔn)線其余一切都免談。第二個(gè)每個(gè)測(cè)試類只測(cè)一個(gè)維度。測(cè)試登錄的類就只寫登錄相關(guān)用例測(cè)試訂單的類就只寫訂單相關(guān)混在一起短期省事長期結(jié)構(gòu)就爛掉了。第三個(gè)套件執(zhí)行時(shí)間當(dāng)作工程質(zhì)量指標(biāo)來跟蹤。整體用時(shí)有明顯膨脹的時(shí)候別急著加機(jī)器先回去看是不是setUp里堆了太多東西、或者是用例之間出現(xiàn)了競爭。第四失敗信息要照顧好未來的自己。斷言里帶上具體的上下文報(bào)錯(cuò)時(shí)能清楚看到哪個(gè)用例、哪組數(shù)據(jù)、期望值和實(shí)際值——這些信息的價(jià)值往往要在你說出這到底是在哪失敗的那一刻才體現(xiàn)得出來。如果你打算用unittest跑真實(shí)項(xiàng)目我最后再補(bǔ)充幾個(gè)直觀的小操作入門跑main工程化跑discover報(bào)錯(cuò)看不懂先查_type再查值共享狀態(tài)要警惕mock路徑要打在使用處。把這五條變成肌肉記憶unittest這個(gè)老框架其實(shí)一點(diǎn)都不老——它的設(shè)計(jì)思路到今天仍然是自動(dòng)化測(cè)試的基石而且很多新框架的便利恰恰是先把這些基礎(chǔ)邏輯吃透之后才體會(huì)得到的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
啊啊啊啊免费视频| 久久欲| 日韩有码中文字幕女同性恋| 91人妻Pr| 91久| 伊人96在线| 日本一区二区做爱的视频| 日韩精品人妻中文字幕不卡乱码| 九色97| 97在线免费观看视频| 素人美腿视频网站| 国产色精品午夜大片| 精品9999| 天天日B狠狠操| WWW操逼| 国产操操日韩三级黄| 日本中文字幕一区| 九久9热| 飘花国产午夜精品不卡| 欧美激情高清性猛交| 九九九久久久久| 一级免费啪啪片| 2024黄色视频| 久久久久国产精品喷潮免费观看臀 | 色青青久久影视| 欧美日韩小说| 天天综合网1| 噜噜噜无码AV一级一级久久影院| 极品白嫩美少妇在地板上位骑射淫水泛滥| 国产精品国产精品国产| 91男人综合| 一本一道人妻久久一区二区三区 | 亚洲一区二区中文字幕| 亚洲 中文 欧美 日韩 在线| 精品久久99| 欧美在线观看综合国产| 骚逼高潮久久精品| www.人人cao| 自慰白浆在线观看| 激情AV| 99久久久无码精品国产人| 亚洲色图片区| 欧美综合传媒| 午夜人人操| AV天堂因数| 美女t无毒不卡不卡| 大香蕉日亚洲日本亚大| 久久久男人的天堂| 日韩内射视频| 青青操国产夫妻| 黑人性欧美| 97se综合| 在线综合网| 26uuu最新| 熟妇人妻精品一区二区| 中英熟女操女| 亚洲日韩人妻中文字幕一区| 99热这里只有精品地址 | 激情婷婷丁香网| 午夜精品久久久久久久久久久久久| 亚热日本熟女| 天天舔天天日天天射| 激情四射五月天| 亚洲一区二区中文字幕| 国产成人亚洲精品无| 九九九九精品视频| 国产强奸乱伦xd| 久久av成人无码免费| 亚洲一区操| 看黄片视频免费| 国内毛片免费h片在线| 婷婷爱五月| 婷婷色色网| 天天爽天天爽| 96久久久精品| 搡老熟女免费视频| 亚洲第一在线视频| 东北女人操比视频| 搡老女人老91妇女老熟女| 免费av高清无码| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 天天日天天插| 操逼短片| 亚洲色人阁| 91肉片| 国产精品亚洲天堂网址| 美女啊啊啊啊啊| 激情抓乳插进去啪啪啪日韩| 色五91| 99久久9| 久久线上视频免费看| 国产强奸91| 天美传媒国产原创中文字幕亚洲欧美另类 | 日本免费一级AAA大片器 | 中精品一区二区三区| 久久狠狠色噜噜狠狠狠狠97| 99视频精品| 亚洲国产中文字幕| 26uuu性| 97精品国产97久久久| 精品久久久一本一道| 欧美真人抽搐一进一出gif| 久久婷婷热| 激情五月天网| 怡春苑东京热| TS人妖另类精品视频系列| 色婷五月| 一二三区视频在线观看| 欧美强奸一区二区诱惑| 久久啊哟| 欧美色图99| 久久精品国产亚洲AV成人直播| 久久综合女优| 亚洲激情视频| 伊人久操| 亚洲同性aV综合| 日本五十路熟女一区二区| 日欧美色| 亚州一区二区| 嗯嗯啊啊亚欧精品| 国产Av超碰| 亚洲少妇诱惑| 午夜福利在线合集| 麻豆性爱视频在线播放| 91久久青青草原精品| 久久香蕉网| 亚洲av资源| 日韩啪啪啪啪啪| 欧美日韩亚洲天堂| 婷婷久久五月天| 国产AV天美传媒一区二区三区| 中文字幕免费看大片| 日韩色图 一区二区| 女人 A一级| 欧美亚洲清纯| 东京热男人的天堂网| 2020中文字幕在线| 亚洲欧洲另类| 精品人妻一区二区三区在| 丁香五月激情啪啪| A片大香蕉在线| 美女超碰978| 嗯嗯啊啊操我| 亚洲色图国产另类| 在线精品福利免费播放| 亚洲一区二区AV| 九九九九九九九九九九九免费国产| 26uuu成人影片| av东京热男人的天堂| 天天色播亚洲综合网站| 欧美不在线| 亚洲欧洲日产国产综合网| 亚洲最大成人a毛毛片| 日日骚av| 国产综合久久久鬼色| 美女极品一区二区三区| 国产精品操| 自拍视频大全亚洲专媒视频/一区二区三区 | 放黄片放3级黄片没穿衣服| 亚洲城人男人的天堂| 免费人成在线观看网站品爱网| 亚洲色图自拍| 久久综合乱子伦国产免费| 欧美 日韩 亚洲 春色| 大屁股国产在线视频| 蜜桃久久一区二区三区| 精品超碰国产| 色欲三区| 久久这里只精品免费福利| 亚洲男人天堂视频| 黑人中出21连凳花野真衣| 国产精品久久久吖| 青草伊人久久| 18禁久极品美女久久哦哟呀!| 成人av免费观看| 婷婷色色五月天福利| 玖色av| 国产天美传媒精品| 伊人色综合网电影| 超碰无码加勒比| 成人性交免费视频| 超碰4A| 爱爱久久| 日韩丝袜高跟制服在线观看| 久妇网| 日韩av乱伦| www.久久最新地址| 亚洲av综合色区图片亚洲| 91伊人| 高清视频一区| 日本免费二区三区| 无毛精品| 国产亚洲色婷婷99精品91| 男人天堂婷婷五月天校园春色| 一级性爱aaaa| 粉嫩av在线一区二区| 国产高清26uuu| 国产路线专区| 色97干| 伊人欧美大香蕉视频| 老鸭窝日丰县女人| 久污| 69久久| 伊人网一本| 欧美性视频二区三区| 国产五码丝袜屁眼| 欧日韩一二三f区| 爱丝福利| 精品视频一二三中文| 老熟乱一区二区三区四区| 死我十八禁| 91色综合色| 91久热| 色区97| 2017天天插| 亚洲欧美清纯| 久久9久| 上床啊啊啊| 中文字幕av一区二区三区人妻少妇 | 少妇久久| 偷拍亚洲熟女视频播放| 强奸乱伦Av网| 天天弄天天操| 鸥美插入视频| 超碰碰97资源站| 校园春色五月天| 国产无马在线| 久久久久九九九| 丁香五月婷婷基地| 人妻久热在线| 激情小说亚洲视频| 久久午夜色播影院免费高清| 久久久久久国产精品免费网站| 欧美日韩操操操| 超碰免费在线| 五月天伊人| 色踪合AV| 91丨人妻丨国产丨丝袜| 十八禁成人网站在线观看| 久久婷婷色| 久热69九色熟妇97| 欧美青青草视频| 中文字幕一区二区三区50路| 性爱综合一区二区| 亚洲精品中文字幕一区在线视频| 99re6久热只有精品6在线直播 | 国产一区二区在线看| 九九碰九九爱97超| 天堂中文日本在线观看| 少妇人妻精品| 2024黄色视频| 超碰免费人人| 91国产丝袜美女| 97综合久久| 亚洲国产婷婷在线播放| 亚洲熟妇图片| 九九九不卡| 日韩人妻有码免费视频| 亚洲精品男人的天堂| 青青伊人加勒比海| 搡老女人911熟妇老熟女| 国产人妻天天干精品| 97视频观看| 黑丝制服中文字幕 | www被窝色com| 亚洲成人激情小说视频| 欧美一级三级| 亚洲色图片区| 亚洲精品一区二区三区在线播放 | 人人搞人人插人人操| 免费的黄片wwwwww| 中文久久96| 绯色一区二区三区不卡少妇| 婷婷伊人綜合中文字幕| 校园春色第一页| 无码人妻丰满热妇又大又粗| 久久99精品九九久久久婷婷| 日韩欧美福利视频看看| 欧洲无码一区二区| 国产无码久久高清| 青青草精玖玖69精品| 老熟女网站| 五月婷婷激情综合| 99少妇| 亚洲网站一区二区在线| 久草免费福利在线播放| 日本精品一级二级三级| 久久婷婷伊人| 亚洲中文国际强奸字幕| 欧美曰韩国产精品| 91精品国产91久久青草| 天天日少妇逼AV| 亚洲欧美激情小说| 我要看免费韩日黄片| 操逼短片| 激情开心五月天| 天天搞欧美| 国产三级日产三级韩国三级| 久久精品视| 欧美日韩国产高清在线一二三区| 精品美女久久一二三| 91伊人久| 久久天堂网| 五月婷婷久久综合| 蜜臀久久99精品久久久久久酒店| 啊啊啊操一区| 一级AV性爱| 小草三级久久观看| 高清国产精品福利网站| 亚洲综合网图| 人妻81p| 欧美亚洲宗合色性图| 亚洲精美粉嫩嫩泬在线观看 | 欧美久久人体| 激情第四色| 白丝AV| 亚洲日韩青青草色月| 青青草久久| 人人看人人摸人人色| 日韩欧视频| 高清不卡一二三区视频......| 日韩成人私密一级精品av| 欧洲乱码一区二区| 性爱精品一区| 欧美色www亚洲国产阿娇要播| 一区,二区,三区网站| 思思热免费视频观看| 舔人妻中文免费视频| 五月天综合| 91无码西班牙视频在线| 美女网站黄页| 毛片视频白嫩| 日韩欧美亚洲一区二区三区影院 | 亚洲一区二区三区欧美日韩| 亚欧高清| 国产91丝袜 在线播放| 亚洲欧洲日产国产综合网| 色9999日韩国产| 热无码中文亚洲H一道本一区二区| 五毛骚逼极品美女怕怕| 国产精品情侣啪啪| 99热这里是精品| 天天干天天燥| 欧美少妇人妻| 九九九九一区| 老熟女中文字幕高清| 99热综合| 欧美黑人精品一区二区| 午夜男女爽爽爽影院视频| 欧美手机在线综合| 91校园春色长篇| 91色色网站| 国产热av| 品亲网欧美品亲网| 蜜桃精品一区二区三区ww| 日日碰狠狠添天天爽超| 啪啪AV导航| 日本成人免费一区二区三区| 清纯唯美亚洲| 精品少妇999| 丰满人妻-区二区三区免费看| 性色国产东北露脸精品视频| 骚货人妻偷情自拍在线视频| 国产一区二区三区精品观看啪| 欧美性爱97超碰 | WWW美腿丝袜香蕉中文| 欧美色图中文字幕| 一区二区久久天天干狠狠| 精品久久人妻成人网| 日本操色导航| 国产99精品一区二区三区免费| 天天综合亚洲综合| 综合夜夜| 麻豆天美传媒毛片| 激情五月天中文字幕色| 中文字幕精品探花视频| 舔足天天操天天射| 五十路三区在线| 精品女同一区二区三区| 日本不卡中文| 亚洲日韩美女丝袜美腿人妻视频| 啊啊啊好舒服视频| 亚州一区二区| 乱伦一二三| 免费岛国一级片| 久久久性| 欧美的性爱网站免费| 一本色道久久天天射天天干| 中文精品一区二去| 亚一综合久久久久久久久久| 欧美一区二区三区另类精品| 日本女优在线视频福利| 色青青久久影视| 天天干,夜夜爽| 亚洲欧美大香蕉| 嗯嗯啊中文字幕| www老逼91| 色狠狠综合噜一二三区| 人妻丝袜肏逼| 国产麻豆91欧美一区二区久久婷婷国产精品| 伊人久久亚洲色欲综合网站| 一本色道熟妇| 中文字幕日韩精品久久| 国产92麻豆天美精品色欲5| 人人操人人大香蕉| 91色女| 欧美97| 久久久久亚洲Av无码专区老牛影视| 国产一级高清免费观看| 成全在线观看免费观看| 日本黄 R色 成 人网站| 精品久久久中文字幕不| 伊人色综合欧美| 青女偷拍网| 亚洲欧美不卡线| 6080YYY午夜理论片在线观看| 久久人人爽爽人人爽人人片αV| 在线强奷到舒服的无码视频 | 伊人四虎综合| 99久久久无码国产精品性啊聊| 亚洲乱色熟女一区| 激情五月天视频| 日本少妇va7777| 亚洲精品国产熟女久久久| 热热色中文无码| 人人操我人人干| 人人射人人操人人摸| 96久久科窝| 物业黑人 AV一区| 九九九网站| 亚洲中文日韩精品| 牛牛久久国产精品视频一二三| 91综合天天看| 久久久久亚洲AV无码专区少妇 | 97亚洲精品| 亚洲一区二区精品福利| 亚洲宗合电影| 中文字幕一二三| 秋霞蝌科网日本一区| 久久久亚洲精品电影免费看| 91色射| 超碰在线香蕉| 亚州综合电影| 色五月AV| 婷婷色婷婷| 日韩中文9| 日韩操逼性鲍| 日韩AV色图| 变态综合色| 全球成人中文在线| 中文字幕第23区| 99久久久久久亚洲精品不卡| 久久超碰爱| 99在线精品观看视频中文| 大香蕉黄色一级片免费看| 色av中文字| 啊啊啊骚| 亚洲超碰在线| 欧美色老汉| 久久精品国产亚洲AV无码电影| 亚洲色9| 日本一道在线播放高清| 超碰超碰欧美| 麻豆久久精品亚洲精品88| 久久久久久国产精品| 91痴汉| 91精品久久综合熟女| 国产麻豆一区二三区| 色黄色美女大长腿午夜视频| 四虎免费看黄| 亚洲欧美综合区自拍另类| 夜夜久久| 男男H黄动漫啪啪无遮挡网站| 欧美传媒一区| 91干熟女| 欧美亚洲小说| 超碰色中文| 老外又粗又长一晚做五次| 欧美综合色站| 温婉少妇玩3p| 96超碰网| 欧美少妇第一页| se吧提供国产乱老熟视频胖女人| 先锋音影AV| 色情乱伦AV| 久久成人东京热人妻| 六月丁香久久| 操屄日韩| 天天干1区2区在线| 欧美黑人性猛交91| 台湾成人无码AV| 久久久精品,3| 在线女人91| 在线无码网站| 欧洲人妻视频| 97日视频| 婷婷五月av| 久9re热视频这里只有精品| 久久亚洲熟妇在线视频| 久久这里只精品99re66图| 蜜臀久久久99久久久久 | 暴力av在线| 久无码| 在线A日本| 欧美热图99| 干B视频伊人网| 草草影院日本第一页| 青青草国产一区二区三区| 久久人妻办公室视频| 三级日本一区二区三区| 91色人| 精品91摸| 91精品国产麻豆国产自产在| 亚洲国产一级黄色视频| 91中文字幕在线观看| 日本青青草在线| 无码在线亚洲| 欧美亚洲素人制服精品| 九t超碰| 91n免费处女| 精品人妻一区二区三区-国产| 一级A片女人高潮叫床| 91丝袜在线观看| 舔舔啊| 大香蕉伊人在线成人AV在线观看| 熟妇熟女视频一区二区三区| 欧美性爱1080p| 人妻色偷色噜| 亚洲欧美综合图片| 欧美在线综合| 日韩人妻无码精品系列| 东京热激情视频一二三区| 自拍偷拍 高清无码| 无码人妻精品酒店| 亚洲性天堂| 人妻 欧美亚洲| 色九九九综合| 国产精品午夜成人福利| 97爱免费插| 五月丁香综合激情| 免费综合亚洲中文| 操逼视频免费日韩无码| 亚洲97久久精品亚洲| 久久这里只精品免费福利| 热99re69精品8在线播放| 久久久性少妇| 91成人亚洲色图| 人妻无码视频一区二区三区久久| 伊人久久大香线综合无码| 91 丝袜在线| 欧美亚综合色图| 色婷婷aV一区二区三区麻豆综合 | 亚洲无码电影久久久| 91爱| 天天躁日日躁狠狠躁| 91久| 亚洲综合电影| 91精品人妻偷情| 亚洲一区日韩精品中文字幕| TS人妖另类精品视频系列| 狠狠超| 欧美第一页| 99热| 国产精品爱欲| 大香蕉强奸乱伦| 亚洲成人性爱在线观看| 日本福利二区视频| 五月丁香影院| 精爱久久| 亚洲91大片| 青青草导航在线视频| 国语精品av| 97国产超碰| 超碰在线欧美性爱激情| 日韩无码黄色片| 日韩不卡av一二三| 黑操B| 久久av网| 亚洲综合另类色图| 亚洲综合第一页| 久久受www免费人成| 无码日韩人妻av一| 四虎AV在线观看| 亚洲AO在线| 亚洲丝袜99| 欧美色图91| 亚洲熟女乱色一区二区三区| 在线观看AV片| 麻豆精品久久久久久久| 人妻熟女一区二区三区在线| 欧美综合中文| 人妻性爱一区二区| 操逼网站地址| 人人综合| 老熟乱一区二区三区四区| 成人精品在线免费视频| 最新日韩黄片| 欧美色图天堂网m| 久热这里| 久久综合国产精品国产| 99色在线观看| 国产av热热色| 中文字幕熟女人妻丝袜| 成年人一级黄色毛片大全在线观看| 夜夜一区二区| 看看日B真人视频| 青娱乐休闲视频在线观看| 强奸乱伦Av网| 日韩少妇丰满亚洲| 啊啊啊啊操死我| 亚洲精品亚洲人成在线麻豆| 精品福利视频| 人妻精品一区二区| 91丨熟女丨丰满熟女| 欧美色图片91| 69一区二区| 亚洲精品成人激情在线| www.AV有限公司一区| 久久久人妻| av片在线观看免费播放| 嫩草影院永久在线制服丝袜| 欧美精品三级黄片| 久久久久免费少妇| 91狠狠狠| 偷窥自拍A片| 国产精品久久久久久久免牛肉蒲团| 精…码一二三区| 日本岛国黄色网址| 我想要啊 啊 啊| 中文字幕一区二区韩| 99re95| 日韩成人高清一区二区| 黄色乱论网站| 夜夜爽夜夜爽| 日韩乱码av| 午夜男人的天堂| www.久久| 91亚洲欧美激情| 99操视频| 78精品| www99热| 欧美激情精品| 六六久久日韩不卡| 91精片| 用力操死我| 一区二区三区美女超清| 人妻插插人妻人| 天天射天天| 国产又大又粗又长视频在线| 久久久久久99AV无码免费网站| 草b在线| 日本韩国国产精品一区| 精品一区二区三区四区女| 一本色道综合久久欧美| 一区,二区,三区视频| 日韩精品人妻一| 91在线丝袜| 久久婷婷伊人| 亲子敌伦对白在线播放| 狠插 制服 自拍| 中文字幕一区二区在线日韩精品| 九九九九欧美| 九九黄色视频在线观看| 東南亚性呦成人伦理资源在线视频| 一区黄二区黄| 成人无码电影在线观看网| 在线黄色污污网站| 爆操无码| 亚洲日韩天堂| 亚洲男人的天堂在线看| 欧美特大黄一级片片免费| 97伊人| 夜夜嗨AV蜜臀av| 日本操逼视频导航| 亚洲中文丝袜美腿诱惑字幕| www.四虎在线| 中文字幕91页| 丰满人妻一区二区三区四区| 亚洲宗合电影| 新版天堂中文资源8在线| 久久国产乱子伦精品免费女,网站| 久九九九九九九热| 另类一区| 午夜男女爽爽大片免费观看| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 人妻激情视频| 色九月综合| 欧美一级A片在线看视频性色| 日韩无码一区二区三区| 老司机免费视频在线91| 婷婷爱五月| 国产一级内射无挡观看| 亚欧美综合网| Aa东京男人的天堂| 日韩一999精品| 国产成人bd在线观看| www.av家庭乱伦| 91痴汉| 天天天天天天天天综合| 长长久久免费视频| 欧美十八禁网站| 成人一道本免费视频| 巨乳特殊服务按摩| 91超碰在线播放| 老熟女91av| 99九九精品| 欧美强奸乱能| a片久久久久久久久久久久| 久伊人网78| 久草在| 国产福利夜| 污啪啪啪视频| 一级免费啪啪片| 亚洲精品性爱片| 水多多映视AV| 欧美性夜| 变态另类专区| 熟女露脸激情自拍视频| 麻豆国产成人精品| 久久欧洲| 欧美内射少妇| 亚洲熟女乱色| 久久久工口| 日韩精品 资源| 香蕉久久国产AV一区二区| 国产黄色 A 片免费看| 欧美日韩大黄片| 亚洲另类欧美精品| 久久国产逼| 香港澳门日本三级网站| 丝袜美腿亚洲| 九九碰九九爱97超碰| 亚洲人妻精品一区二区| 天天影视综合色| 天干天干天干天天做| 国产又长又大又粗的视频| 亚洲日韩XXX| 九九九九免费视频| 亚洲精品久久一区二区三区蜜桃臀| 亚洲欧美一区二区不卡视频播放| 蜜臀99999| 都市激情人妻一区二区青青操视频 | 超碰欧美COM| 五月天精品| 91白嫩| 精品人妻一区二区免费蜜桃视频| 偷拍 亚洲 欧美| 啊啊啊好多水| 女人与公拘交酡2020视频| 国产 亚洲 一二三四| 午夜.DJ高清在线观看免费7| 国产精品原创巨作?v网站| 免费?级毛片无码?∨蜜芽试看| 免费一级精品啪啪视频| 日韩精品黄片免费观看| 国产精品久久久三级无码| 五月综合久久| 国产suv精品一区二区四| 91网亚洲| 九一国产精品| 我想要 啊 啊 啊| 五月天婷婷在线看| 综合五月婷婷亚洲一区| 日本一级性爱| 色色色色色色色色色色色色色色综合| 麻豆区99999| 亚洲视频二区 | 色69大色97香蕉| 九九九九9999| 在线a v| 久久精品国产精品亚洲艾通辽熟妇 | 国产女性无套 免费观看| 日本大片日本一区二区免费高清| 色女网日韩| 试看60秒| 黑人猛交| wwwcaobibi| 国产视频一区二区三区久久亚洲天堂 | 一级做受视频免费是看美女| 天天日天天操VV| 国产精品人妻熟女aⅴ| 国产最火爆久久国产网站网站| 人妻啪| 日本护士高潮| 四虎永久在线精品免费网址| ai欧美亚洲小说| 亚洲高清欧美总合| 亚洲中文字幕久久人妻| 91大学精品激情戏| 国产视频第2页| 国产久久久久久| 欧美性爱www免费版| 欧美乱色| 欧美精品系列| 狠狠中文字幕| 7月婷婷综合| 91青青| 久久社区一区二区三区| www.欧精品| 美女91网址| 伦伦成年午夜免费视频| 九九热免费国产视频婷婷伊人 | 日本操大逼| 欧美制服网站美腿丝袜| 玖玖资源视频一区二区三区| 最新日日夜夜天天干干| 校园春色制服丝袜中文字亚洲| 日本熟妇色熟妇在线视频播放| 大JI巴好深好爽又大又粗视频| 欧日a| 精品久久久不卡一区二区| 中文字幕av亚洲精品| 大香蕉九九| 久久久久深夜无码| 国产亚洲精品农村妇女| 蜜桃视频一区二区三区在线观看| 综合久久9| 激情五月综合| 亚洲春色欧美| 欧美疯狂做爰xxxx| 久久人妻少妇| 亚洲色色探花| 都市激情人妻一区二区青青操视频 | 后入人妻无码| 日韩成人大片一区二区| 偷拍综合亚洲| 午夜福利精品| 无码操逼天堂| AA特级绝黄| 97就爱干| 人人操人人大香蕉| 加勒比性爱成人在线| 中国一区二区亚洲人妻| 人妻熟女一区二区| 欧美日韩香蕉| nuu12国产麻豆精品| 亚洲成?V人片在线观看福利| 欧美性综合| 曰韩成人免费视频| 亚洲丨在线| AV中文在线可看| 一区二区三区国产在线播放| 91大神电影天堂| 操逼视频国产无套| www.AV有限公司一区| 午夜AV人气不卡| 大香蕉伊然在亚洲91| 久久性爱大全| 9丨久久九九九| 久久精品亚洲婷婷| 91av一区二区在线观看| 91欧美性| 婷婷五月激情综合| 又粗又长又大国产不卡| 亚欧美天堂在线| 天天摸夜夜添无码小视频| 91亚洲欧美综合高清在线| 亚洲日本韩国在线| 欧美色图综合| 亚洲天堂日本| 亚洲欧洲另类| 高清无码久操视频| 青青草久久在线| 色色99| 日韩av免费一级电影| 色偷偷人人玩人人舔人人操人人摸人人爽| 免费人成?大片在线播放| 人妻丝袜一区二区三区在线| 天堂资源欧美| 被体育老师抱着c到高潮| 亚州男人天堂| 91路www| 婷婷五月天小说| 情趣丝袜无码操逼视频| 一区超碰一区| 欧美97日韩| 91超碰人人操| 日本精品网站在线中文| 欧美色97| 久久99999| 六月激情网| 上海一级黄片| 91熟女视频| 欧美91色| 亚欧中文字幕在线视频| 成人av免费观看| 黄色片一区二区三区四区五区| 亚春色色| 国产精品久久久久久久久久久久久久久| 99人人干| 国产亚洲女v在线观看| 亚洲另类春色| 久久九九热| 丁香五月天久久精品视频一区二区三区| 欧美视频在线视频免费va| 狠狠久久手机视频精品| 色色97爱| 蜜桃臀一区二区aV| 国产乱弄免费在线视频。| www.狠狠| 国产精品久久久久无码AV会牛| 熟女乱3伦999| 97欧美综合| 欧美爱国产综合、| 欧美 日韩 婷婷 五月| 黄色乱论网站| 五月天偷拍| 九九无码视频| 国产白嫩漂亮KTV在线| 操B视频日韩无码| 久久久精品网站| 三四中文字幕| 自拍啪啪视频| 大香蕉日韩欧美| 嗯嗯啊啊好大好爽| 亚州久久9| 超碰97网址| 少妇诱惑视频| 蜜桃久久久久久久| 精品四五区| 国产精品久久久亚洲一区| 久久99精品视频| 一起草精品人妻| 日韩不卡a级视频专区| 日韩精品亚洲专区在线影视| 再深点灬舒服灬太大了添视频| 日韩有码 一区二区三区| 少妇综合| 搡老熟女免费视频| 国产家庭乱伦表演| 成人性爱免费播放| 亚洲精品一区二区精华| 国产一国产一级毛片古装| 国产99热| 东京热男人天堂| 欧美色乱| 国产在线视频午夜精华在| 久久超碰网| 久久国产在线一区二区| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 日韩紧密久久| 亚州再线| 亚洲日韩少妇一道本视频| 大香蕉色欲AV| 亚洲另类色综合网站| 日韩欧美麻豆| 亚洲在线91| 亚洲春色一区二区三区| 99久久精品无码一区二区毛片免费 | 99久re热视频精品98| 92福利社视频| 九一屌逼| 欧美影音在线| 日韩欧美~中文字| 超碰九区| 日韩性爱免费观看视频| 亚州免费啪啪视频| 91人妻Pr| 旡码电影特区| 97爱b| 日韩AV噜噜噜一区二区三区四区 | 一个人在线看的黄色电影网站| 亚洲天堂自拍| 天美传媒精品一区二区三区| 亚洲人综合19| 白丝被操91| 人人妻人人狠人人| 国产亚洲一黄| 秋霞一区二区三区四区五区六区七区| 日日日日做夜夜夜夜做无码97| 在线天堂资源亚洲| 免费看黄片现成| 亚洲成人美女无吗| 亚洲综合色男人网| 久日综合网| 日本色日夜干| 91精品女厕偷拍视频| 99久久九九| 久久有码| 国产精品另类| 操逼免费视频无码国产| 99九九久久| 女生自91网站| 酒色综合网| av在线免费一区二区| 久久综合九九| 青青草乱入乱欲视频在线观看| 人妻熟妇一区二区三区| 天天操人人操狠狠插| 国内外色色色色色成人视频| 欧美中字二区| 精品黄色电影| 色官网在线| 青青青青草av在线观看| 极品色综合| 国产区性爱在线视频秋霞豆| 九九九网页| 日日夜夜骑| 国产精品色片一区二区| 久久9亚洲| 欧美午夜熟妇黑人精品91| 无码人妻精品一区二区中文| 激情一区二区三区在线观看| 欲色啪| 国产美女销魂在线观看不卡| 91熟女熟妇视频网站| julia ann久久| ji熟女.com| 精品久久久中文字幕不| 久久欧美激情| 欧美亚洲中文字幕| 噜噜噜亚洲精品| 亚洲精品成人动漫在线| 国产精品91一样| 97资源亚洲| 黄色av一区二区在线| 亚洲无限观看| 在线播放免费av福利片| 熟妇人妻一区二区三区| 超碰在线91| 99精彩视频| 97人人夜| 成人综合久久精品色婷婷| 欧美大干日韩| 国产高清成人mv在线观看| 91黑丝美女| 男人的天堂午夜av| 樱花草社区www中国| 欧美成人免费在线观看| 天天看综合网| 久久久久九九九九| 高清不卡一二三区视频......| 老熟女91视频| 97超级久久强资源| 亚洲国产精品成人久久蜜臀| 日日夜夜干| 在线视频97| 日韩精彩免费| 青娱乐老司机视频| 久久蜜色情在线视频xxx免费观看| 免费A片三p视频| 台湾大香蕉99热| 国产毛片在线| 九九九九一级| 国模精品娜娜一二三区 | 色色色综合网| 天堂综合网| Av色五月| 翔田千里一区二区三区奶水| 日韩操呦呦影院在线观看| 久久精品国产亚洲AV无码做| 中文一区在线日| 国产一级αv免费看片| 日韩99999| 亚洲有码 欧美精品| 天天影视色香欲综合网小说| 亚洲综合影片| 中文字幕精品日韩中文字幕| 天天影视之亚洲综合网| 97啪啪| 国产精品人妻无码久久久互動交流 | 久久婷婷视频| 91麻豆天美| 五月天综合网| 太久视频| 久久一二三四五六七八九区| 色婷婷丁香五月| 国产兽交视频在线播放| 91欧美另类| 亚洲操操操| 欧美中文字幕日韩在线| 四虎免费视频| 久久免费中文字幕在线观看| 国产精品亚洲高清在线| 国产久9| 天天干天天日天天射黄色大片| 日韩欧美aⅴ综合网站发布| 美女91网址| 成人老鸭窝人人在线视频| 黄色大香焦1级‘′‘| 狼人狠干| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 一本道综合色图| 成人无遮挡毛片免费看| 91超碰丝袜制服| 欧美性,亚州色| 欧美黄色大香蕉一区二区| 国产精品直播在线观看直播| 久久女女| 白丝AV网站| 亚洲无码色| 男人a天堂手机在线版| 91狠狠综合| 精品丰满熟妇人妻一区| 人妻大相焦在线| 日本大片日本一区二区免费高清 | 国产女人9999| 黑操B| 国产精品久久伊人| 久久透逼视频| 欧美在线啊啊| 9ⅰ久久久天天| 区一在线观看| 欧美亚洲日韩人妻在线观看| 成人亚欧免费视频| 少妇99| 丰满人妻无码一区二区三区| 黄骗免费网站| 久久99草| 蜜桃臀 后入 一区 二区 三区 在线| 国产做?爰片久久毛片?片美国| 日韩操p| 干少妇视频| 久草电影网| 日本久久999| 欧洲一区二区三区免费| 国产精品91一样| 日本狠狠干| 偷看洗澡一二三区美女| 亚洲第一精品在线视频| 天天看夜夜看日日干| 天天日夜干| 亚洲午夜精品久久久中文影院| 亚洲国内精品成人不卡| 六月丁操逼| 人妻出轨一区二区三区| 欧美78p| 婷婷综合| 99色在线观看| 日本九九九九| www.激情| 久久婷婷色| 狠狠色综合网| 操逼逼无码| 日韩性爱高清免费视频| 竹菊影视国产一区二区| 日韩激情中文字幕有码| AA特级绝黄| 囯产乱伦一区二区三女| 一区二区三区免费岛国片| 淫荡熟女乱伦网| 操逼片国产| 午夜偷拍久久熟女| 欧美亚洲另类在线蜜桃| 国产h片在线观看视频| 亚洲av综合色区无码一| 日韩午夜精品一区二区三区电影| 久久社区一区二区三区| av网页一区二区三区| 日韩精品黄片免费观看| 全球成人中文在线| 国产做?爰片久久毛片?片美国| 簧片免费看视频| 欧美性爱五月天| 淮穴色AV| 爱欲AV| 色男人色天堂东京热| 亚洲人妻久久久| 国产精品久久久久久久久久久久久久| 亚洲色交|