久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

接口自動(dòng)化框架代碼生成工具:從YAML配置到Java測(cè)試代碼

接口自動(dòng)化框架代碼生成工具:從YAML配置到Java測(cè)試代碼 1. 為什么要給接口自動(dòng)化框架配一個(gè)代碼生成工具做接口自動(dòng)化測(cè)試這些年從最早用Postman手動(dòng)點(diǎn)接口到后來(lái)寫(xiě)Python腳本再到現(xiàn)在搭建Java TestNG的自動(dòng)化框架我一直在跟“寫(xiě)測(cè)試代碼”這件事打交道。后來(lái)逐漸發(fā)現(xiàn)一個(gè)現(xiàn)實(shí)接口自動(dòng)化里真正需要人工去寫(xiě)的代碼其實(shí)沒(méi)那么多大量代碼都是重復(fù)結(jié)構(gòu)——發(fā)起請(qǐng)求、接收響應(yīng)、比對(duì)結(jié)果、記錄日志翻來(lái)覆去就那幾套邏輯。既然框架本身已經(jīng)把底層能力封裝好了那上層那些千篇一律的測(cè)試方法為什么不能交給工具去生成這個(gè)念頭直接催生了給框架適配的代碼自動(dòng)生成工具。我先說(shuō)明一下這個(gè)工具是干什么的。它并不是要取代自動(dòng)化框架也不是什么測(cè)試平臺(tái)而是一個(gè)輕量級(jí)的“翻譯器”你給它一份結(jié)構(gòu)化的接口測(cè)試配置它按模板渲染直接產(chǎn)出符合當(dāng)前框架規(guī)范的Java測(cè)試代碼。換句話講這個(gè)工具就是框架和測(cè)試人員之間的橋梁——測(cè)試人員只需要描述測(cè)試意圖復(fù)雜的技術(shù)細(xì)節(jié)全部由工具處理。1.1 手工維護(hù)接口腳本的三種痛先說(shuō)沒(méi)有代碼生成工具的時(shí)候我的團(tuán)隊(duì)是怎么維護(hù)接口測(cè)試的。我們用的是自研的基于Java TestNG RestAssured的框架每個(gè)接口對(duì)應(yīng)一個(gè)測(cè)試類(lèi)每個(gè)測(cè)試類(lèi)里寫(xiě)若干測(cè)試方法。第一個(gè)痛點(diǎn)就是純重復(fù)勞動(dòng)。創(chuàng)建一個(gè)訂單接口的用例無(wú)非就是拼URL、設(shè)Header、填請(qǐng)求體、發(fā)POST請(qǐng)求、斷言返回值聽(tīng)著不難但換個(gè)商品接口、換個(gè)用戶接口這些代碼幾乎要重寫(xiě)一遍。粗略統(tǒng)計(jì)過(guò)一個(gè)新接口從開(kāi)始寫(xiě)腳本到跑通大約60%的工作量消耗在復(fù)制粘貼改參數(shù)上真正需要思考的斷言和業(yè)務(wù)判斷不到四成。第二個(gè)痛點(diǎn)是風(fēng)格不統(tǒng)一。團(tuán)隊(duì)里每個(gè)人寫(xiě)測(cè)試代碼的審美都不一樣有人用TestNG的Assert.assertEquals有人習(xí)慣if else判斷后手動(dòng)拋異常還有人偏好Hamcrest的Matcher那一套。單看個(gè)人寫(xiě)的代碼都沒(méi)毛病但一旦別人要接手維護(hù)就得先搞清楚這個(gè)類(lèi)用的是哪種風(fēng)格這是非常隱性的成本。時(shí)間一長(zhǎng)測(cè)試代碼庫(kù)就變成了一個(gè)風(fēng)格雜糅的“大雜燴”統(tǒng)一風(fēng)格這件事靠制度約束永遠(yuǎn)做不到只能靠工具。第三個(gè)痛點(diǎn)是數(shù)據(jù)驅(qū)動(dòng)做不流暢。很多人會(huì)把測(cè)試數(shù)據(jù)放到Excel里再用一個(gè)DataProvider去讀取??蓡?wèn)題在于接口一多參數(shù)結(jié)構(gòu)一復(fù)雜寫(xiě)數(shù)據(jù)提供器和參數(shù)映射關(guān)系本身就很費(fèi)勁。接口一旦有變更Excel文件、讀取代碼、斷言邏輯三處要聯(lián)動(dòng)修改牽一發(fā)而動(dòng)全身。這種維護(hù)成本逼著我去琢磨能不能從源頭減少這些重復(fù)且容易出錯(cuò)的環(huán)節(jié)。1.2 代碼生成工具解決的核心問(wèn)題代碼生成工具要解決的不是“寫(xiě)代碼”這個(gè)動(dòng)作本身而是“重復(fù)地寫(xiě)同樣的代碼”這件事。我可以把大量的通用邏輯下沉到模板里框架里所有發(fā)起請(qǐng)求、解析響應(yīng)、記錄日志的代碼都沉淀在模板中最后生成出來(lái)的代碼只保留當(dāng)前用例的業(yè)務(wù)差異點(diǎn)。我給這個(gè)工具定了三個(gè)目標(biāo)。第一個(gè)是消除重復(fù)代碼同類(lèi)接口的測(cè)試代碼保持高度一致人能一眼看出生成模板的風(fēng)格第二個(gè)是統(tǒng)一測(cè)試代碼的產(chǎn)出規(guī)格因?yàn)樗袦y(cè)試類(lèi)都從同一套模板渲染出來(lái)天然解決了風(fēng)格不一致的問(wèn)題第三個(gè)是降低寫(xiě)用例的門(mén)檻讓不精通Java的測(cè)試工程師也能產(chǎn)出合規(guī)的用例——他們只需要在YAML文件里描述“調(diào)用哪個(gè)接口、傳什么參數(shù)、期望什么結(jié)果”其余的事情交給生成器。我做這個(gè)工具時(shí)用了一個(gè)很樸素的判斷標(biāo)準(zhǔn)如果給框架配了代碼生成工具之后寫(xiě)一條新用例的時(shí)間從“分鐘級(jí)”降到了“秒級(jí)”同時(shí)團(tuán)隊(duì)里一個(gè)不會(huì)寫(xiě)Java的人也能在半天內(nèi)產(chǎn)出可運(yùn)行的測(cè)試代碼這個(gè)工具就是值得的?,F(xiàn)在回看這兩個(gè)目標(biāo)都實(shí)實(shí)在在達(dá)成了。2. 整體設(shè)計(jì)思路配置先行模板驅(qū)動(dòng)在設(shè)計(jì)這個(gè)工具的最初階段我最先想清楚的不是用什么編程語(yǔ)言、用哪個(gè)模板引擎而是整個(gè)工作流程。工具不可能憑空生成代碼它必須有一個(gè)輸入來(lái)表述“測(cè)試意圖”我用這個(gè)輸入作為整套工具的入口。2.1 三個(gè)方案我為什么選了模板驅(qū)動(dòng)參考市面上的代碼生成思路大體有三類(lèi)方向。第一類(lèi)是基于OpenAPI/Swagger文檔自動(dòng)生成測(cè)試用例掃描接口定義后批量生成測(cè)試代碼。這個(gè)方案自動(dòng)化程度看著最高但實(shí)際落地效果并不好——Swagger描述的是接口協(xié)議不是測(cè)試場(chǎng)景。比如一個(gè)“先登錄、再下單、再查詢”的業(yè)務(wù)鏈路Swagger文檔根本表達(dá)不出來(lái)同時(shí)生成的用例往往只是“能發(fā)請(qǐng)求”的空殼缺少業(yè)務(wù)判斷邏輯還需要大量的人工補(bǔ)全。第二類(lèi)是錄制回放把Postman里發(fā)過(guò)的請(qǐng)求、抓包工具中記錄的真實(shí)流量轉(zhuǎn)成測(cè)試代碼。上手確實(shí)快但問(wèn)題也很突出錄制內(nèi)容跟具體的執(zhí)行環(huán)境強(qiáng)綁定Cookie、時(shí)間戳、訂單號(hào)都是當(dāng)時(shí)那個(gè)時(shí)間點(diǎn)上的值直接轉(zhuǎn)成代碼回放大概率是失敗的必須再做一遍數(shù)據(jù)清洗。清洗成本有時(shí)候比手寫(xiě)還高對(duì)于持續(xù)集成的場(chǎng)景意義有限。第三類(lèi)就是模板驅(qū)動(dòng)也是我最終選定的方案。提前定義好測(cè)試配置的格式和代碼模板生成器讀取配置、渲染模板、輸出代碼。配置的抽象層級(jí)可以由自己控制——想支持業(yè)務(wù)斷言就在配置里增加斷言描述想讓模板更簡(jiǎn)單就控制配置的維度。相比前兩個(gè)方案模板驅(qū)動(dòng)的優(yōu)勢(shì)在于配置承載的是“測(cè)試意圖”而不是“協(xié)議格式”生成代碼的復(fù)雜度由團(tuán)隊(duì)自己掌控。代價(jià)是前期模板設(shè)計(jì)需要投入一些精力但這部分投入換來(lái)的是后續(xù)所有用例以統(tǒng)一方式生成長(zhǎng)期收益非常可觀。2.2 配置載體的選型YAML憑什么勝出配置用什么格式寫(xiě)我當(dāng)時(shí)在YAML、JSON、Excel三個(gè)候選里反復(fù)對(duì)比過(guò)最終選了YAML。原因有這么幾個(gè)。第一是可讀性。YAML天然用縮進(jìn)表示層級(jí)寫(xiě)出來(lái)的配置很像一份精簡(jiǎn)的測(cè)試說(shuō)明文檔哪怕沒(méi)有編程經(jīng)驗(yàn)的測(cè)試同事也能大致讀懂。JSON的括號(hào)嵌套在有深層結(jié)構(gòu)時(shí)閱讀成本陡增。Excel雖然直觀但它的結(jié)構(gòu)是二維表格很難描述復(fù)雜的嵌套參數(shù)也支持不了注釋。第二是版本控制友好。一個(gè)接口用例的配置就是一個(gè)YAML文件它跟測(cè)試代碼一起放進(jìn)Git倉(cāng)庫(kù)。改動(dòng)在哪里、誰(shuí)改的、為什么改提交記錄里一目了然。這一點(diǎn)在團(tuán)隊(duì)協(xié)作中極其關(guān)鍵比如代碼評(píng)審時(shí)可以直接對(duì)YAML文件的diff逐行討論。Excel沒(méi)法這樣操作它的二進(jìn)制特性和不同版本之間的格式差異讓diff變成一件很痛苦的事。第三是支持注釋。YAML原生支持#注釋我可以在用例文件的開(kāi)頭寫(xiě)一段說(shuō)明告訴后來(lái)的人這個(gè)用例為什么這樣設(shè)計(jì)、依賴了哪些前置數(shù)據(jù)、有哪些特殊注意事項(xiàng)。這種上下文信息在測(cè)試代碼維護(hù)階段價(jià)值極高。另外還有一個(gè)技術(shù)層面的理由YAML本身就是JSON的超集用解析庫(kù)加載之后可以直接轉(zhuǎn)成Map或Java對(duì)象后續(xù)做參數(shù)嵌套、動(dòng)態(tài)值取值都很方便。Java里的SnakeYAML、Python里的PyYAML都已經(jīng)非常成熟幾乎不需要額外的學(xué)習(xí)成本。2.3 模板引擎選型背后的邏輯模板引擎的選型跟自動(dòng)化框架的語(yǔ)言強(qiáng)相關(guān)。我的框架是Java體系所以主要是在Velocity和FreeMarker之間做選擇。最終選了FreeMarker原因是FreeMarker的語(yǔ)法檢查和錯(cuò)誤提示更嚴(yán)格——模板中如果出現(xiàn)拼寫(xiě)錯(cuò)誤或者未定義的變量它會(huì)明確報(bào)錯(cuò)而Velocity在這方面的提示相對(duì)模糊。這個(gè)差異在模板復(fù)雜起來(lái)之后會(huì)被放大調(diào)試成本少一點(diǎn)是一點(diǎn)。如果你用的是Python系的自動(dòng)化框架比如pytest或基于requests封裝的框架對(duì)應(yīng)的方案就是選Jinja2。Jinja2是目前Python生態(tài)里事實(shí)上的標(biāo)準(zhǔn)模板引擎語(yǔ)法表達(dá)能力足夠生態(tài)也成熟。選型邏輯是共通的優(yōu)先選那個(gè)團(tuán)隊(duì)熟悉度更高、報(bào)錯(cuò)信息更明確、版本演進(jìn)更克制的引擎。這里有一條實(shí)際經(jīng)驗(yàn)值得分享模板引擎的版本一定要鎖死。代碼生成工具一旦跑起來(lái)就是團(tuán)隊(duì)寫(xiě)用例的主路徑。升級(jí)模板引擎這種操作哪怕是小版本更新都可能因?yàn)殇秩炯?xì)節(jié)的變化導(dǎo)致全量生成的代碼出現(xiàn)微妙的差異屬于典型的高風(fēng)險(xiǎn)低收益改動(dòng)沒(méi)有充分的理由不要碰。3. 核心模塊實(shí)現(xiàn)模板、解析器、生成器工具整體拆成三個(gè)模塊模板模塊負(fù)責(zé)定義代碼骨架解析模塊負(fù)責(zé)讀取和校驗(yàn)測(cè)試配置生成模塊負(fù)責(zé)把配置和模板結(jié)合并輸出代碼。三個(gè)模塊各司其職下面把關(guān)鍵實(shí)現(xiàn)逐一展開(kāi)。3.1 測(cè)試類(lèi)與測(cè)試方法的代碼模板我的框架里一條接口測(cè)試用例在代碼層面對(duì)應(yīng)一個(gè)測(cè)試類(lèi)類(lèi)里有一個(gè)或多個(gè)測(cè)試方法。測(cè)試類(lèi)負(fù)責(zé)組織用例邏輯測(cè)試方法負(fù)責(zé)執(zhí)行具體的請(qǐng)求和斷言。模板就圍繞這兩層來(lái)寫(xiě)??匆幌翭reeMarker模板文件的核心片段這是渲染規(guī)則也是所有生成代碼的源頭package com.example.autotest.cases.${caseModule}; import org.testng.annotations.Test; import org.testng.annotations.DataProvider; public class ${caseClassName} extends BaseApiTest { Test(dataProvider ${caseName}Data, description ${caseDesc}) public void test${caseMethodName}(String caseName, MapString, Object params) { Response response apiClient.${httpMethodLower}(${apiPath}) #if hasPathParams .pathParams((Map) params.get(pathParams)) /#if #if hasQueryParams .queryParams((Map) params.get(queryParams)) /#if #if hasBody .body(params.get(body)) /#if .execute(); AssertUtils.executeAssertions(response, (List) params.get(assertions)); attachLog(caseName, response); } DataProvider(name ${caseName}Data) public Object[][] ${caseName}Data() { return TestDataLoader.load(${caseConfigPath}); } }這個(gè)模板在設(shè)計(jì)時(shí)我定了兩條底線第一生成出來(lái)的代碼必須是“合格的框架代碼”遵循框架里BaseApiTest的約定和注解規(guī)范第二業(yè)務(wù)變化點(diǎn)全部收斂在數(shù)據(jù)層——你看測(cè)試方法里除了caseName之外請(qǐng)求參數(shù)和斷言都從DataProvider加載而DataProvider的數(shù)據(jù)源就是測(cè)試人員維護(hù)的YAML配置。這樣測(cè)試代碼里幾乎沒(méi)有需要人工改動(dòng)的東西也就杜絕了維護(hù)時(shí)改錯(cuò)代碼的風(fēng)險(xiǎn)。踩過(guò)的坑也得提一句模板中千萬(wàn)不要寫(xiě)死任何業(yè)務(wù)數(shù)據(jù)和提示信息。比如模板里寫(xiě)了一個(gè)認(rèn)為合理的3秒超時(shí)等到真有接口需要5秒超時(shí)的時(shí)候測(cè)試人員就得去改生成后的代碼。改一次是偶然改多了模板就形同虛設(shè)。模板里只放通用邏輯所有可變參數(shù)都從配置走這個(gè)原則要咬死。3.2 請(qǐng)求參數(shù)動(dòng)態(tài)綁定的實(shí)現(xiàn)接口測(cè)試?yán)镒铍y處理的往往不是發(fā)請(qǐng)求本身而是參數(shù)的動(dòng)態(tài)性。創(chuàng)建訂單每次需要一個(gè)唯一的訂單號(hào)登錄后需要一個(gè)有效的Token查詢接口可能需要當(dāng)前時(shí)間戳——這些值如果寫(xiě)死用例跑第二次就會(huì)失敗。我在配置層定義了一套動(dòng)態(tài)參數(shù)標(biāo)記用特定語(yǔ)法聲明參數(shù)來(lái)源配置看起來(lái)是這樣的request: pathParams: orderId: ${random:orderId} queryParams: timestamp: ${time:yyyyMMddHHmmss} body: token: ${extract:login.token} userId: ${from:data/common_user.yml:userId}這套標(biāo)記語(yǔ)法規(guī)定了三層約定。第一層是內(nèi)置生成器random表示生成一個(gè)帶指定前綴的隨機(jī)字符串time表示按指定格式生成當(dāng)前時(shí)間。第二層是上下文提取extract表示從之前執(zhí)行的用例響應(yīng)里提取值login.token的含義是“讀取login用例響應(yīng)中的token字段”這個(gè)值會(huì)先被寫(xiě)入框架的ContextStore后續(xù)用例再按key取出。第三層是文件引用from表示從外部數(shù)據(jù)文件讀取靜態(tài)測(cè)試數(shù)據(jù)避免在YAML配置里堆一大段JSON。生成器在渲染配置之前會(huì)先把所有參數(shù)表達(dá)式掃描一遍區(qū)分靜態(tài)參數(shù)和動(dòng)態(tài)參數(shù)。靜態(tài)參數(shù)直接嵌入生成的代碼動(dòng)態(tài)參數(shù)則生成對(duì)應(yīng)的取值邏輯——隨機(jī)數(shù)用UUID或Random工具類(lèi)生成上下文提取用ContextStore讀取。這樣寫(xiě)配置的人不需要關(guān)心框架的取值細(xì)節(jié)只需要記住那幾種參數(shù)標(biāo)記即可。這套規(guī)則的抽象層級(jí)是整個(gè)工具最容易忽略卻又最值得花時(shí)間打磨的部分。3.3 斷言與數(shù)據(jù)校驗(yàn)的自動(dòng)生成說(shuō)到代碼生成最容易低估的是斷言層。有人覺(jué)得斷言不就是“比較期望值和實(shí)際值”嗎其實(shí)接口測(cè)試的斷言可以分成多層我在工具里分別做了處理。第一層是狀態(tài)碼斷言斷言HTTP狀態(tài)碼是否為200、201或某個(gè)約定值。這一層最簡(jiǎn)單配置里寫(xiě)一個(gè)value模板里渲染一行代碼。第二層是響應(yīng)體字段斷言用點(diǎn)號(hào)分隔的路徑定位JSON字段比如data.orderId表示響應(yīng)體data節(jié)點(diǎn)下的orderId字段。第三層是業(yè)務(wù)規(guī)則斷言包括響應(yīng)耗時(shí)是否小于閾值、某個(gè)字段值是否與數(shù)據(jù)庫(kù)記錄一致等。這一層最靈活我在模板里預(yù)留了自定義斷言鉤子允許測(cè)試人員生成代碼后在指定方法中補(bǔ)充特殊邏輯。配置里斷言的寫(xiě)法如下assertions: - type: statusCode value: 200 - type: jsonField path: data.state matcher: equalTo value: PAID - type: responseTime matcher: lessThan value: 500生成器讀取這些配置后會(huì)映射到框架里已經(jīng)封裝好的斷言方法。jsonField的equalTo對(duì)應(yīng)AssertUtils.assertJsonFieldEqualsresponseTime的lessThan對(duì)應(yīng)AssertUtils.assertResponseTimeLessThan。這里有一個(gè)持續(xù)積累的過(guò)程每當(dāng)出現(xiàn)一種新的業(yè)務(wù)斷言類(lèi)型先確認(rèn)它值得納入工具再到框架的斷言工具類(lèi)里封裝對(duì)應(yīng)方法最后在生成器里增加配置類(lèi)型和映射關(guān)系。我在這個(gè)環(huán)節(jié)的體會(huì)是斷言類(lèi)型寧缺毋濫——只有高頻使用的斷言才值得做成配置項(xiàng)過(guò)于個(gè)性化的斷言應(yīng)該留給人工擴(kuò)展。4. 實(shí)操過(guò)程從YAML配置到跑通一條完整用例光講設(shè)計(jì)思路不落地那是耍流氓。下面我用一個(gè)真實(shí)的例子把完整流程走一遍從零定義“查詢訂單詳情”的接口用例經(jīng)過(guò)代碼生成器產(chǎn)出Java測(cè)試代碼再編譯、執(zhí)行、看報(bào)告。整個(gè)流程我盡量按照實(shí)際操作順序來(lái)寫(xiě)。4.1 環(huán)境準(zhǔn)備與框架目錄結(jié)構(gòu)代碼生成器本身是Java寫(xiě)的一個(gè)可執(zhí)行jar通過(guò)命令行調(diào)用。它不依賴數(shù)據(jù)庫(kù)只依賴模板文件路徑和配置目錄兩條信息所以部署難度極低——把jar和模板目錄放到任意一臺(tái)機(jī)器即可運(yùn)行。自動(dòng)化框架的標(biāo)準(zhǔn)目錄結(jié)構(gòu)如下api-auto-test/ ├── src/main/java/com/example/autotest/ │ ├── core/ # 框架核心HTTP客戶端、ContextStore、斷言工具 │ ├── cases/ # 生成后的測(cè)試代碼 │ └── BaseApiTest.java ├── src/main/resources/ │ ├── templates/ # 代碼生成器的模板文件 │ └── testdata/ # 測(cè)試數(shù)據(jù)目錄YAML配置放在這里 ├── pom.xml └── generator.jar # 代碼生成工具注意cases目錄放生成后的測(cè)試源碼testdata目錄放YAML配置兩邊按約定對(duì)應(yīng)一個(gè)YAML配置文件生成一個(gè)Java測(cè)試類(lèi)。我把配置目錄和代碼目錄分開(kāi)的根本用意是讓測(cè)試人員日常只碰配置不碰代碼從物理上減少人為破壞代碼的風(fēng)險(xiǎn)。測(cè)試人員打開(kāi)倉(cāng)庫(kù)、進(jìn)入testdata、寫(xiě)配置、提交全程不需要打開(kāi)一個(gè)Java文件。4.2 定義第一條接口用例配置現(xiàn)在給“查詢訂單詳情”接口寫(xiě)用例。接口信息是GET請(qǐng)求路徑為/api/v1/order/detail需要一個(gè)路徑參數(shù)orderId和一個(gè)查詢參數(shù)includeItemsHeader里需要攜帶Bearer Token。在testdata/order目錄下新建query_order_detail.ymlcase: name: 查詢訂單詳情-正常場(chǎng)景 api: method: GET path: /api/v1/order/detail headers: Authorization: Bearer ${extract:login.token} pathParams: orderId: ${random:orderId} queryParams: includeItems: true assertions: - type: statusCode value: 200 - type: jsonField path: data.state matcher: equalTo value: PAID寫(xiě)這個(gè)配置有兩個(gè)細(xì)節(jié)需要說(shuō)明。第一orderId沒(méi)用實(shí)際訂單號(hào)而是用了隨機(jī)變量是因?yàn)橥粋€(gè)訂單號(hào)反復(fù)查詢會(huì)導(dǎo)致測(cè)試場(chǎng)景不可重復(fù)——第一次查可能返回PAID第二次再查可能已經(jīng)過(guò)期狀態(tài)就不一樣了。用隨機(jī)訂單號(hào)配合測(cè)試環(huán)境預(yù)埋的數(shù)據(jù)生成邏輯才能保證用例每次執(zhí)行都處于可控狀態(tài)。第二Token從login用例響應(yīng)中提取這是接口測(cè)試?yán)镒畹湫偷挠美g依賴關(guān)系用一行extract配置就解決了不需要寫(xiě)任何前置代碼。4.3 執(zhí)行生成命令驗(yàn)證產(chǎn)出代碼配置寫(xiě)好后命令行執(zhí)行生成操作java -jar generator.jar \ -config testdata/order/query_order_detail.yml \ -output src/main/java/com/example/autotest/cases/order/生成器內(nèi)部跑的動(dòng)作依次是加載并校驗(yàn)YAML配置、解析參數(shù)表達(dá)式、按配置中的case信息匹配模板、渲染代碼、把生成的Java文件寫(xiě)入目標(biāo)目錄、再打印一條渲染日志。如果配置里有字段缺失或者類(lèi)型錯(cuò)誤此時(shí)就會(huì)直接報(bào)錯(cuò)不會(huì)等到編譯階段才暴露。生成的測(cè)試代碼大致如下package com.example.autotest.cases.order; import org.testng.annotations.Test; import org.testng.annotations.DataProvider; public class QueryOrderDetailTest extends BaseApiTest { Test(dataProvider queryOrderDetailData, description 查詢訂單詳情-正常場(chǎng)景) public void testQueryOrderDetail(String caseName, MapString, Object params) { String orderId RandomUtils.randomOrderId(); String token ContextStore.get(login.token); Response response apiClient.get(/api/v1/order/detail) .pathParam(orderId, orderId) .queryParam(includeItems, params.get(includeItems)) .header(Authorization, Bearer token) .execute(); AssertUtils.assertStatusCode(response, 200); AssertUtils.assertJsonFieldEquals(response, data.state, PAID); } }這里有一個(gè)容易被忽視但極其重要的點(diǎn)代碼生成不是一次性的而是可重復(fù)的。如果之后需要調(diào)整斷言規(guī)則我只需要修改YAML配置再跑一遍生成命令代碼會(huì)自動(dòng)更新。這種“可重復(fù)生成、可覆蓋更新”的能力才是生成工具真正的價(jià)值所在——它讓用例維護(hù)從“改代碼”變成了“改配置”這是一個(gè)質(zhì)的變化。4.4 編譯、執(zhí)行與CI集成生成代碼之后就是常規(guī)的構(gòu)建步驟mvn test -DtestQueryOrderDetailTest執(zhí)行完畢框架生成測(cè)試報(bào)告。通過(guò)就是綠色失敗就是紅色報(bào)告里能明確看到是哪個(gè)斷言失敗了、期望值是多少、實(shí)際值是多少。在接入CI之后整個(gè)流程可以完全自動(dòng)化GitLab CI里配置一個(gè)任務(wù)每當(dāng)testdata目錄有配置變更的提交就自動(dòng)運(yùn)行生成命令接著執(zhí)行測(cè)試最后把測(cè)試報(bào)告推送到內(nèi)部報(bào)表平臺(tái)。測(cè)試人員只需要關(guān)心配置的編寫(xiě)和斷言結(jié)果的確認(rèn)剩下的環(huán)節(jié)全部由流水線接管。在接入CI時(shí)我有個(gè)建議不要嘗試動(dòng)態(tài)生成“正在執(zhí)行的源碼”而是把生成后的代碼提交到Git倉(cāng)庫(kù)作為可追蹤的產(chǎn)物。這樣做的原因是生成的代碼本身就是執(zhí)行記錄的一部分如果某次測(cè)試異常你需要在對(duì)應(yīng)的代碼版本上排查而不是去追溯“當(dāng)時(shí)生成的代碼長(zhǎng)什么樣”。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄任何工具落地的過(guò)程都不可能一帆風(fēng)順代碼生成工具更是如此。下面把我在實(shí)際運(yùn)行中遇到的高頻問(wèn)題整理成速查表每一條都是我真實(shí)踩過(guò)的坑也是后來(lái)團(tuán)隊(duì)新人遇到問(wèn)題后最先查的底稿。5.1 常見(jiàn)問(wèn)題速查表現(xiàn)象根因解決方案生成的Java代碼編譯報(bào)錯(cuò)提示找不到類(lèi)模板里引用了框架中沒(méi)有的類(lèi)名或依賴版本不一致檢查模板引用的類(lèi)是否在pom.xml中已聲明重點(diǎn)檢查utils包和框架內(nèi)部類(lèi)動(dòng)態(tài)參數(shù)在生成的代碼里變成null配置里的extract表達(dá)式引用的上下文key不存在確認(rèn)前置用例先執(zhí)行檢查ContextStore中實(shí)際寫(xiě)入的key名YAML配置加載時(shí)映射到Java對(duì)象失敗YAML字段名和解析器的POJO字段對(duì)不上統(tǒng)一采用下劃線轉(zhuǎn)駝峰映射規(guī)則避免在配置里混用兩種命名風(fēng)格生成代碼中包含中文亂碼模板文件和Java源文件的編碼不一致模板統(tǒng)一用UTF-8保存生成器讀取模板時(shí)顯式指定UTF-8編碼多次生成后代碼出現(xiàn)重復(fù)方法生成器沒(méi)有在生成前清理目標(biāo)目錄生成前刪除目標(biāo)目錄中上次生成的文件或按類(lèi)名做冪等覆蓋FreeMarker渲染報(bào)錯(cuò)但看不出問(wèn)題位置模板語(yǔ)法錯(cuò)誤信息不夠直觀給模板寫(xiě)單元測(cè)試固定配置輸入后逐段定位渲染失敗的模板塊并發(fā)執(zhí)行時(shí)不同用例的上下文數(shù)據(jù)互相污染全局Map存儲(chǔ)的提取值沒(méi)有按用例隔離改用ThreadLocal或按用例作用域隔離的上下文容器上面表格里我想著重展開(kāi)“動(dòng)態(tài)參數(shù)變null”這一類(lèi)問(wèn)題因?yàn)樗钣忻曰笮浴W畹湫偷男螒B(tài)是本地跑是好的一到CI環(huán)境就報(bào)空指針。原因往往是本地用單線程按序執(zhí)行而CI里開(kāi)了并行測(cè)試——前置用例的數(shù)據(jù)還沒(méi)來(lái)得及寫(xiě)入ContextStore后續(xù)用例就發(fā)起了請(qǐng)求。解決辦法有兩種一是在配置里顯式聲明依賴關(guān)系讓生成器在生成的代碼上增加TestNG的dependsOnMethods注解強(qiáng)制前置用例先執(zhí)行二是在框架的數(shù)據(jù)上下文里加一個(gè)同步等待機(jī)制取不到值就阻塞等待超時(shí)再失敗。兩個(gè)方案可以疊加使用并行測(cè)試場(chǎng)景下效果都還算穩(wěn)定。5.2 代碼生成器自身的測(cè)試與維護(hù)代碼生成器本質(zhì)上也是一段程序是程序就必須有自己的測(cè)試保障。我的經(jīng)驗(yàn)有三條。第一條模板必須有快照測(cè)試。把一組固定的配置輸入渲染出的代碼存成基準(zhǔn)文件此后每次修改模板都跑一次對(duì)比看哪些代碼的哪些段落發(fā)生了變化。這個(gè)機(jī)制能有效防住“模板改動(dòng)一個(gè)空格導(dǎo)致全量代碼變化”這類(lèi)隱蔽事故。我記得有一次只是調(diào)整了模板里一個(gè)縮進(jìn)結(jié)果幾百個(gè)測(cè)試類(lèi)全被觸發(fā)重新生成Git diff里全是無(wú)關(guān)緊要的格式變更好在有快照對(duì)比才及時(shí)發(fā)現(xiàn)并回滾。第二條生成后的代碼必須經(jīng)得起“可編譯驗(yàn)證”。工具內(nèi)部集成編譯命令每次生成完畢立即對(duì)產(chǎn)出代碼做一次編譯檢查編譯失敗就直接拋錯(cuò)。這個(gè)設(shè)計(jì)把發(fā)現(xiàn)問(wèn)題的時(shí)間點(diǎn)從“測(cè)試人員手動(dòng)編譯時(shí)”提前到了“生成器執(zhí)行時(shí)”成本低效果好。第三條也是最容易忽略的模板的演進(jìn)要克制。模板是團(tuán)隊(duì)的公共資產(chǎn)改一次就會(huì)影響到所有后續(xù)生成的代碼。模板修改必須遵循兩個(gè)原則——向后兼容優(yōu)先、改動(dòng)可回滾。改之前先拉獨(dú)立分支用git diff觀察生成代碼的實(shí)際差異確認(rèn)無(wú)異常再合入主分支。我見(jiàn)過(guò)有團(tuán)隊(duì)一次性大改模板結(jié)果整個(gè)測(cè)試庫(kù)幾百個(gè)用例全部重新編譯光排隊(duì)編譯就耗掉半天。這個(gè)教訓(xùn)得來(lái)全不費(fèi)工夫但代價(jià)不小。5.3 幾個(gè)讓生成工具更貼合團(tuán)隊(duì)實(shí)際的技巧最后分享三個(gè)我實(shí)踐下來(lái)覺(jué)得價(jià)值很高的做法。第一是分層擴(kuò)展不要一開(kāi)始就做一個(gè)“全自動(dòng)生成一切”的萬(wàn)能工具。先從高頻的接口類(lèi)型切入比如CRUD接口里的GET和POST把這兩類(lèi)模板打磨到極致——穩(wěn)定、直觀、覆蓋絕大多數(shù)場(chǎng)景。之后再逐步擴(kuò)展PUT、DELETE、文件上傳、參數(shù)化查詢等場(chǎng)景。分層推進(jìn)的節(jié)奏比攢一個(gè)大版本再發(fā)布穩(wěn)妥得多團(tuán)隊(duì)在每一層都能立刻感受到收益。第二是配置校驗(yàn)前置。生成器在渲染之前先對(duì)配置做合法性校驗(yàn)字段缺失、枚舉值非法、斷言格式錯(cuò)誤等都要在生成階段攔截下來(lái)而不是等生成的代碼編譯時(shí)才報(bào)錯(cuò)。這個(gè)校驗(yàn)用JSON Schema或者簡(jiǎn)單的POJO校驗(yàn)注解就能實(shí)現(xiàn)成本不高但能把大量低級(jí)錯(cuò)誤擋在測(cè)試人員修改配置的當(dāng)下。第三是保留人工干預(yù)的出口。再完善的模板也不可能覆蓋所有業(yè)務(wù)場(chǎng)景所以生成器要允許在配置里聲明“使用自定義模板”或者提供鉤子方法讓測(cè)試人員補(bǔ)充框架沒(méi)有涵蓋的邏輯。我見(jiàn)過(guò)一些代碼生成工具因?yàn)橐?guī)則過(guò)于僵硬逼著測(cè)試人員放棄工具去手寫(xiě)代碼這屬于本末倒置——工具存在的意義是降低人的負(fù)擔(dān)不是制造一套新的規(guī)則牢籠。從我個(gè)人的實(shí)際體會(huì)來(lái)說(shuō)給自動(dòng)化框架配代碼生成工具這件事本質(zhì)上是在改變團(tuán)隊(duì)的工作方式。它把接口測(cè)試用例的關(guān)注點(diǎn)從“怎么寫(xiě)代碼”拉回到“怎么設(shè)計(jì)場(chǎng)景”上——這恰恰是測(cè)試工作里真正有價(jià)值的部分。工具本身不難寫(xiě)難的是讓團(tuán)隊(duì)相信“改配置”比“改代碼”更可靠、更高效。一旦這個(gè)認(rèn)知建立起來(lái)代碼生成工具就會(huì)成為整個(gè)接口自動(dòng)化體系中回報(bào)率最高的那一塊投入。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
青青操青娱乐| 色综合天天爱去电影网| 东北丰满熟女国产一区| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 韩三级a视频在线观看 | 免费a在线播放v| 日本高清加勒比| 精品人妻一区二区视频| 一区二区三区色综合| 狠狠色伊人亚洲综合网站色| 亚洲最大的黄色电影网站。| 377p欧洲日本亚洲大胆| 国产后入内射| 99国产在线绯色一区| 国产白丝精品在线观看| 75大香蕉| 国产精品免费日韩| 日韩本不卡视频在线观看 | 91这里只有精品| 青青操少妇| 久操九九九九| 97爱亚洲| 97精| 美女诱惑一区| 91久久九九精品国产综合| 97欧美综合网| 超碰免费人妻在线| 26UUU欧美日本| 日韩亚洲欧美中文字幕| 在线a亚洲视频播放在线| 老熟妇91| 婷婷av在线中文字幕| 一级性爱视频免费观看| 亚欧毛片基地国产毛片基地| 欧美日本一区二区a人| 精品偷拍13p欧美dodk视频| ji熟女.com| 五月婷网站| 蜜臀操逼黄色视频操的好爽| 九色97| 欧美狠狠操| 国产99999久久精品| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 午夜福利无毒不卡| 久久美女福利是上海美女| 在线v中文字幕一区二区三区| 亚洲性爱无码乱伦av| 激情综合亚洲| 很很很很操| 成人性交午夜免费片| 国产精品视频内谢女人| 欧美日韩香蕉| 密臀AV在线| 亚洲美女高潮喷水视频| 国产精品点击进入在线影院| 五月天婷婷影院| 蜜臀99999| 天天色综合影视网| 欧美亚洲另类在线蜜桃| 久久久中文版| 亚洲男人综合| ′ !γ}丶。。久久精品欧美一区二区三区| 91丨国产丨白浆| 亚洲91射| 日韩黄色成人性爱| 亚洲偷91色| 欧美性爱日韩高清| 久久精品视频28| 亚州男人天堂| 久久黄黄| 狠狠操狠狠操操| 婷婷丁香九月| 丰满少妇高潮无码| 中文字幕美女91| 91xingse| 日本熟女不卡视频| 天天日日本| 91欧美大片| 99九九久久| 欧美在线大香999| 人妻人人做人人澡人人爽欧美一区| 欧美AB在线观看| 欧美97爱| 日本东京热大香蕉a片| 人妻精品视频一区二区三区| 99抽插| 亚州欧美在线| 国产亚洲精品A在线观看下载| 色欲Av人妻精品一区二| 亚洲无码com| 伊人久久大香线蕉无码| 高清孕妇孕交 交孕妇| 国产探花日韩援交| www.久久最新地址| 日本午夜久久电影| 伊人AAA| 日韩无码嘿咻黑热久| 人妻嗯啊啊在线播放| 91麻豆天美| 牛牛久久国产精品视频一二三| 国产专区第一页| 九月伊人中文字幕| 乱伦一二三区| 裸体美女久久久| 欧美亚洲性爱一区二区| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 午夜.DJ高清在线观看免费7 | 超碰97资源大奶| 亚洲国产精品V?在线播放| 97色碰| 1769国内精品视频| 男同专区一区二区三区在线| 亚洲AV无码久久精品蜜桃小说| 看黄片视频免费| 日韩av在线精品观看| 懂色av中文字幕一区二区三区天美| 五月婷婷丁香| 92午夜免费福利视频| 农村女一级毛卡片| 欧美亚洲中文字幕| 亚洲色天堂九9| 久久亚洲人妻| 日日黄色三级网站| 午夜天堂精品久久| 二对二中文字幕。| 第45页一区二区| 在线女人91| 天堂蜜桃无码视频一区二区| 久热大香蕉| 99久久久er直播网址| av天堂天堂av日韩| 国产性久久久| 日韩操人| 欧美在线官网| 最新精品久久蜜桃 | 中文字幕99999| 天天综合~91| 国产视频一区二区三区在线免费观看| 国产AAAAAABBBBB| AV一起草在线| 丁香婷婷久久| 极品白嫩福利在线| 亚洲鸥美色图| 欧美在线天堂| 亚洲天堂一区二区久久| 最新国产亚洲精品精品国产亚洲综合| 亚洲成?V人片在线观看福利| 性开放中文AV高清无码免费看| 最新日日夜夜天天干干| 中国熟女老妇仑乱一区二区三区| 国产h小视频在线观看免费| 91天天| 国产福利一区二| 国产日韩欧美中文在线播放| 精品性爱一二三区| 资源在线观一 二| 99精品久久久久久久婷婷蜜桃| aaaa黄片| 日本天天干天天操一区| 熟女人妻一区二区三区| 亚洲成a人在线观看久| 亚洲一区二区在线观看91| 国产精品亚洲一区二区三区四区 | 性爱视频免费网址| 亚洲日韩成人性爱视频| 91精品国| 国内黄色精品| AAAAAAAAA黄片| 免费视频观看60秒| 丁香五月天激情综合| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 国产日韩欧美| A 天堂在线观看视频| 一区二区三区麻豆| 五月天综合网| 桃花色涩综合影院| 人人么人人操| 蜜桃臀AV在线| 夜夜高潮夜夜爽高清视频一 | 色五天伊人| 大乔未久88一区| 久久人妻四季| 宗合情欲网| 91挑色欧美| 天天操天天谢| 日韩在线性爱免费视频| 国产一级高跟丝袜| 五月婷婷AV| 九九视品黄色| 国产白领连续中出在线播放| 97伪v| 偷偷人人精品女女久久| 天天综合网网欲色| 野狼福利社区| 国产欧美精选激情视频| 美女十八禁| 青青操青娱乐| 九九无码视频| 日韩无码精品综合久久| 日韩 女同 综合| 国产女上位好爽在线| 欧美性爱综合,免费| 不卡六六在线91| 日韩草久视频| 九九九综合精品| 伊人久久在线视频观看| 久久大黄片| 超碰97欧美日韩| 欧洲色| 中国AV美女| 婷婷激情丁香| 亚洲伊人久久精品影院| 天天天天天天天天综合| 伦在线97| 日本一卡二区在线| www欧美91| 东北老女人的激情视频| 懂色AV一区二区三区| 久久香蕉国产线看观看猫咪av| 国产精品久久天天干| 亚洲高清在线| 久久久性少妇| 欧美亚洲AN| 97综合在线| 中文字幕av亚洲精品| 久久久久久久六六| 五月久久HDAV| 欧美疯狂做爰xxxx| 永久免费观看的毛片的网站| 91劲爆| 口爆吞精在线观看| 翔田千里AⅤHD无码| 东京热毛片调教| 欧美组图日韩亚洲中文字幕| 最新日产中文在线麻豆| 亚洲黄色网址| 色综和网| 国产超碰在线一区| 97超碰伊人| 欧美一区二区三区互相| 户外裸露刺激视频第一区| 色色色综合网| 蜜臀久久99'精品久久久| 久久99网站| jizz啪啪| 青青草原综合久久大伊人精品| 先锋影音av先锋一区| www.久久制服糖| 婷婷丁香五月天亚洲天堂网| 日本大香蕉| 美女丝袜激情小说| 欧美性爱第一页久久| 欧美黑人精品一区二区| 日本熟妇熟色97一本在线观看| 97爱爱影院| 精品日韩| 日韩免费av片高清无码| 91五十路| 91狠狠色丁香婷婷综合久久精品| 91在线欧色| 国产亚洲精品农村妇女| 青草精品视频日本久久久久网站在线| 国产一区二区三区久久精品太古里| 亚洲Av无码成人精品国产| 亚洲熟女av中文字幕| 亚洲熟女乱熟乱熟妇综合网二区| 婷婷五月天av| JULIA一区二区三区在线播放| 激情文学亚洲| 精品人妻一区二区三区-国产精品| 秋霞免费AV| A 天堂| 中文在线视频| 日本不卡二三区| 亚洲五月天激情| 亚洲成人日韩小说| 免费观看日本操逼视频| 四方色播| se吧提供国产乱老熟视频胖女人| 探花激情视频| 黄色AAAAAAAAAAA大片| 91亚州| 亚洲色图欧美色图制服丝袜| 亚洲码专区| 摸奶性爱视频网站在线免费播放| 日韩无限资源| 国产一级高清免费观看| 久一区久久蜜桃| 九九亚洲色在线观看| 欧色综合| 伊人影院中文字幕| 色优久久| www.欧精品| av天堂影视中文在字幕在线中文 | 天美国产三级传媒| 激情五月婷| 一起草精品人妻| 中文字幕91页| 欧美一级久久久久久久大片动画| 国产精品点击进入在线影院| 国产多人在线观看视频| 国产a片操逼| 人人做,人人操,人人摸| 欧美日韩精品一区二区三区高清| 黑丝自慰喷水网站| 亚洲一欧洲中文字幕在线| 国模无码人体一区二区三| 久久精品国产精品一区| 亚州熟女乱伦| 成人八戒网站| 黄片无码在线制服| 一牛一区二区三区久久| 国产精品熟女一区二区三区| 八戒无码国产午夜福利| 亚洲国产成人福利在线观看| 手机在线视频国内精品| 国产剧情AV不卡在线观看| 久久亚洲AV无码专区国产精品| 一级二级三级黑人无码| 青青草依人大香蕉| 俄罗斯及免费在线看| 国产丝袜美女诱惑| 九九热五区| 超碰夫妻97| 狠狠亚洲| 欧美综合网在线| 久热大香蕉网站| 久久久9 9 9精品| 人妻少妇精品无码专区二区密桃| 天天亚洲| 尤物黄色在线观看网站| 精品黑人一区二区| 情色日播放AV| 97国伦国色| 99国内熟女露脸视频| 2019男人的天堂| 97日亚洲欧美| 99久久久久久亚洲精品不卡| 熟女五十路一区二区三| 天天爽人人综合免费7799| 激情五月天婷婷| 久久久不能久久久久| 好吊色一区| 欧美色图小说综合| 99久久无码| av天堂精品久久| 99综合视频| 久久一二三四不卡| 欧美啪啪啪91| 8x福利精品第一福利视频导航| 色噜噜精品一区二区三| 岛国小电影| 大香蕉伊人在线成人AV在线观看| 日日AV加勒比| 五月天AV资源| 被男人吃奶很爽的毛片| 婷婷五月天av| 国产盗摄美女如厕大神作品在线观看| 色九九久九九| 国产精品久久妻无码网站| 综合五月婷婷亚洲一区| 夜夜操天| 久久久久久免费电影| 五月亭亭六月丁香| 亚洲一区中文字幕一区| 三级网站超变态精品| 夜夜夜夜久久久久| 熟女精品va中文字幕| 小少妇| 日韩精品国模| 久久久久久国产成人| 5月婷婷6月六月丁香| 人人超碰在线观看黄| 玖玖爱伊人玖玖爱| 日va操| 乱码熟妇人妻久久久| 九九操久久国产免费视频| 97在线视频观看网站| 中文字幕国产精品1区| 热G综合热G中文| 日韩综合无码色欲vv| 亚洲天堂电影精品一区| 欧美性第1页| 中文字幕精品一区二区精| 久操B网| 亚州欧美在线| 亚洲色图亚洲无码强奸乱伦| 大香蕉综合在线| 青青操网| 欧美一二三区四五区| 国产精选视频| 日本人体九九九九九九| 91久久久亚洲| 久9久| 成人小电影网站tex| 啪啪视频免费在线观看| 大奶啊啊好爽| 国内外内射高清视频| 一级免费啪啪片| 超碰偷拍| 97色婷| 久热精品在线| 婷婷九月| 免费观看一区| 久草视频分类在线| 婷婷婷婷婷婷久久久久| 精品国产99| 欧美日韩午夜精品一区二区三区| 色婷婷婷五月天激情四射| 亚洲国产另类在线中文| 免费看毛片操穴| 青青草好吊色| 亚洲精品欧美专业| 欧美日韩精品一区二区三区高清| 九一国产精品| 99婷婷| 一级黄色性爱裸体视频| 亚洲综合贴图91| 久久九九视频九九视频| 久久精品女同亚洲女同13| 国产在线精品偷| 欧美碰碰综合色| 欧美|91色综合| 中文字幕蜜乳av| 97欧美色资源| 一区三区啪啪| 野狼福利社区| 日韩 欧美 国产 麻豆| 久久久久国产精品片区无码直播| 夜色91| 手机不卡视频不卡在线一二三区| 午夜啪啪片| 久久久久久免费电影| 中文字幕一区av| 牛牛AV人人夜夜澡人人爽| 亚洲大色堂| 欧美黄片欧美黄片xxx| 外国免费性情大片| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 亚洲图片91| 日韩在线女优天天干| 一级人妻性爱视频| 97操碰| 夜夜嗨av午夜成人| 青青草天天亲夜夜操网| 91处女在线观看| 国产成人精品午夜福利| www.狠狠干.coom| 女沟厕偷窥piss小便| 搡老女人老91妇女熟女| 野狼激情网| 国产操操日韩三级黄| 日本大香蕉综合网红本杳社区| 麻豆AV短剧| 国内精品伊人久久久久影院会| 激情小说亚洲色图| 久久人妻一区二区三区高清| 混色激情av| 色在线综合| 校园春色亚洲色图| 97精品视频在线播放| 久久久久久久 九九九九九九九| 3d成人精品一区二区| 无码人妻毛片丰满熟妇精品区 | 丁香五六月啪啪| 97中文综合| 裸体1区| 欧美 亚洲 偷拍自拍| 超97在线精品视频| 亚洲欧美日韩制服另类| 性色综合网| 熟女熟妇一区二区三区视频| 操b网站亚洲无码| 亚洲色图超碰在线| AV污污污污| 亚洲脚交| 97国产综合欧美| 亚洲精品国产av天美传媒| 蜜桃色色网站视频三区| 激情视频网址| 狠狠操狠狠插| 久青草影院| 日韩乱插| 久9热| 亚洲国产高清福利视频| 欧美一级国产一级| 最新国内自拍av免费| 91精品国产91久久青草 | 亚洲天堂区| 色噜噜人妻丝袜a∨先锋影| 亚欧成人一级片在线播放| 美女好片色日本| 天天综合欧美黑人| 人妻蜜桃臀| 日韩欧美麻豆| 国产精彩女在线观看视频| 色情婷婷久久五月天| 性生活无遮挡纯毛片在线看| 欧美少妇内射| 97色妞| 亚洲综合性网址| 天堂伊人久久| 亚洲无限观看| 超碰这里有精品| 加勒比综合a∨| avav青青草久久夜| 亚洲黑人在线| 欧美传媒| 五月综合婷婷久久网站| 日本综合久久| 九色 人妻 大香蕉| 麻豆天美制片厂网站视频| 夜夜嗷嗷一区二区| 超碰97玖玖爱| 成年女人一区| av婷婷色网| 国产成自自拍在线观看| 日日干夜夜欢| 欧美亚洲首页| 1769一区| 操我无码| 四虎AV在线观看| 91人妻视频在线| 天天夜夜久久| 是还免费视频1727我| 日日摸日日弄日日拍| 97天天| 中文字幕乱码在线| 午夜福利一区二区影院| 黄aaaaaaaaaaaaaaaaaa色网站| 97香蕉碰碰人妻国产欧美| 国产91美女高潮| n1038 一二三区| 色呦呦、国产精品| 中文字幕青青草| 加勒比伊人| 亚洲精品无码成人久久久99| 99久久99久久综合| 久久男人网| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 性影在线视频| 99热在线观看| 蜜桃久久久久久久久久久久| 99999亚洲另类| 插入逼91| 色99视频| 婷婷五月天无码| 亚洲丝袜少妇在线| 乱伦av麻豆| 日本熟妇一区二区三区| 做爱福利视频一区二区| 中出在线视频| 精品国产丝袜一区二区三区乱码| 欧美视频在线视频免费va| 久久香蕉综合一本到3atv| 丰满少妇一区二区三区专区| 久久久久久免费电影| 蜜臀无码视频在线观看| 国产综合操逼高清| 亚洲熟女乱综合一区二区三区 | 午夜免费视频1000| 91九九九吃| 人妻啪| 极品五月天噜噜| 欲色啪| 岛国片在线视频网站| 婷婷综合网站| 97欧美色| 九月丁香综合网| 性生活久久久久久久久久| 一区二区三区麻豆| 91人妻Pr| 欧洲精品欧洲精品| WWW啪啪的com| 日日夜夜国产综合| 国产亚洲色停停久久99精品91| 高清国产av无码| 91 亚洲情侣偷拍 久久| 成人国产视频在线观看| 按摩中文字幕| 欧美裸体美女日麻屄| 中文字幕在线观看丝袜| 超碰在线免费一区二区三区| 人人做人人妻人人夜视频| 国产视频小说| 久热香蕉精品在线视频| 亚射在线| 日韩精品在线观看观看| 97色妞| 国产精品视频自拍在线| 绯色AV粉色AV蜜臀AV| 试看日韩黄片| 亚洲 图片 欧美 色图| 日产操逼| 性色乱AV一区二区| 91亚州日韩高清| 91色色色| 亚洲色人阁| 欧美|91色综合| 加勒比综合| 天天看天天综合成人网| 亚洲欧美综合| 97色97好| 成人性爱电影一区二区| 好湿好紧视频| 婷婷六月天| 91综合中文字幕| 67194无码不卡| 91av一区二区在线观看| 亚洲国产青青| 国产免费永久精品无码| 亚洲无码精品AV久久久| 91殴美大片| 亚洲一欧洲中文字幕在线| julia ann久久| 中文字幕黄色片| 久草资源在线| 少妇六月天| 国产精品免费视频人成| 草草草视频| 红桃视频高潮| 欧美久久伊人| 久久精品熟妇丰满人妻99| 久久色一区| yellow网站免费观看日韩高清无码| 熟女露脸激情自拍视频| 德国一二三不卡| 三级三级三级a级全黄三| 精品国产乱码久久久久久久久久毛片| 欧美美女自慰一区二区三区| 91丨九色丨国产丨人妻在线| 日本 情色 1区2区3区| 欧美天天插| 日本成人在线不卡一区二区三区| 天天操熟妇| 中文字暮97| 亚洲国产婷婷在线播放| 老司机香蕉| 精品无人区麻豆乱码久久久| 一级啊性爱在线视频| 97色碰| 五月天婷婷小说| 大香蕉色欲AV| 男人的天堂色偷偷青青草视频婷婷网| 国产精品成人蜜臀AV在线| 97在线视频观看| 亚洲在高跟鞋自慰久久在色线| 亚洲精品成人激情在线| 成人av在线播放| 男同专区一区二区三区在线| 欧美精品三区| 91撸色网 玖玖网 欧美| 久久久五月天| 亚洲欧美在线观看免费| 亚洲欧美日韩中文播放| 色与欲影视天天看综合网| 欧美在线伊人色| 日本高清一区二区在线| 日本东京热加勒比久久| 久久综合九色综合欧洲98| 97中文字幕一区| 精品人妻一区二区乱码一区二区| 韩国一区二区精品亚洲| 中文自拍欧美影视| 在线国产福利网址导航| 少妇无码av专区线| 亚洲欧美日韩免费观看| 麻豆91熟妇人妻中文字幕茄子| 免费超碰97久久| 夜夜操老骚逼视频网站| 九九av| 亚洲超碰AV| 日韩欧美国产一区二区三区四区| 欧美真人抽搐一进一出gif| 最新AV在线| 五月天AV资源| 国产精品国产| 欧美综合网1| 天天干天天日天天射黄色| 日本 成 人 小说 电影 一区二区| 婷婷久久五月| 中文字幕一区二区三区视频播放| 伦伦成年午夜免费视频| 欧 美 自 拍 偷 拍| 日韩av免费一级电影| 黄色香蕉视频网站一区| 国产中出内射一区二区| 日本不卡二区| 91人妻在线视频| 亚洲狠狠入| 日夜久久久九九九久| 嗯……啊…嗯嗯…啊…好舒服| Julia在线播放亚洲久久| 色综合色欲色综合色综合色综合| 日本99视频| 99色热| 色婷婷99| 激情自拍 校园春色| 九九九九久久久| AV中文在线可看| 青青草日韩无码| 国产剧情一区在线观看| 成人综合色网| 亚洲一区二区三区麻豆传媒| 97 超碰 人人做 人人爱| 蜜臀人妻少妇久久在线观看| 精品乱码久久久久| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 嗯嗯不要视频| 思思热国产高清| 美女裸体无遮挡永久免费观看网站 | 操逼内射干逼白丝91| 久久最新视频免费观看| 99精品丰满人妻| 日本丝袜美腿人妻九九| 999九九精品| 久久久久久中文| 天天久久| 久久久久久久久久久免费精品| 欧美大香蕉同搞| 六月婷婷综合| 男人的天堂亚洲| 97亚洲资源| 大乔未久88一区| 208天天久久九九九| 国产精品9999| 八戒无码国产午夜福利| 国产高清成人传媒影视| 久久超碰爱| 美女毛片999| 亚洲乱妇p22| 欧美aa一级片| 激情婷婷五月天| 日韩熟女精品无码专区一区二区| 国产精品久久久九九九| 日韩射图| 无遮挡一级毛片视频免费的| 色九月婷婷| 又摸又舔在线观看网站| 久久国产精品视频| 亚洲一区二区三区春色| 白嫩国模丰满一二三区| 久草久热| 日韩一卡二卡三卡| 欧美性生活免费网| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 精久久久| 偷拍 欧美 日韩| 中文字幕av亚洲在线| 国产天美欧美| 精品人妻视频一区二区在线播放 | 久热网| 无码一区二区精品视频久久久春药 | 劲爆欧美人妖三区91| 综合色一区三区二区| 国产一级αv免费看片| 色综合加勒比四四季| 欧美日韩国产精品久久色婷婷| 国产高清自拍视频| 另类天堂| 亚洲一二三四区在线免费看视频 | 97色论| 综合第一页| hd成人一区二区在线| 啊啊啊好舒服好爽啊啊啊视频| 91久| 强奸乱伦大香蕉网| 九九九热精品| 欧美黄色大片在线观看| 麻豆蜜桃视频在线观看| 精品免费囯产一区二区三区| 欧美人妻久久精品二区三区 | 日本免费中文字幕在线| 久久偷拍人| 欧美亚洲中文| 天天干天天做| 亚洲综合色图欧美| hd成人一区二区在线| 久久婷婷欧美| 思思性爱| 天天爱综合网| 郑州宾馆老熟女露脸啪啪| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 色 婷97| 国产精品午夜AV完会免费| 91丝袜美女国产| 青青草这里只有精品| www.色操逼| 97se综合| 国产三级中文有码在线视频| 亚洲男人天堂2013| 中文视频在线观看| 熟妇视频一区二区三区在线观看| 五十路三区在线| 97色五月天完| 国产女大学生AV| 国产人伦精品一区二区三区| 亚洲天堂精品日韩电影| 国产精品久久久亚洲一区| 国产深夜福利| 超碰国产情侣自拍网| A片大香蕉在线| 久久99手机免费视频| 国产精品午夜福利亚洲综合网| 熟妇女人妻呻吟久久AV| 无码一区免费在线不卡| 精品十三区| 色网在线视频观看免费| 蜜臀aV午夜一区二区三区| 午夜爽爽爽在线观看永久入口姬片| 97一区二区三区视频| 中文字幕精品一区二区精| 九九av| 五月综合婷婷久久网站| 精品人妻15区| 超碰97爽| 久久黄片国产一区二区| 中文字幕精品丝袜| 岛国黄色短视频| 九九久久国产精品怡红院| 另类天堂| 免费A片三p视频| 天天摸夜夜操视频| 国产一区免费午夜视频| 五月天精品| 射 色综合| 国产一区二区三区免费视频在性观看 | 爆操无码| 亚洲欧美色图片| 91挑色欧美| 性爱av在线免费观看| 狠狠操,使劲操| 国产丸一视频| 精品女人999| 国产精品亚洲高清在线| 久久久精选| 啊啊啊啊啊操我视频| 激情五月天丁香社区| 欧美色图20p| 熟女AV一区| 在线 制服丝袜中出 人妻| 日本人妻伦在线中文字幕| 国产成人主播| 大香蕉色十月| 国产中文精品一区二区在线观看| 98超碰欧美| 91 亚洲情侣偷拍 久久| 六月丁香啪啪啪| 亚洲色 国产 欧美 日韩| 久久人人爽av亚洲精品天堂桃色| av天天在线观看| 中文字幕一区二区韩| 试看60秒 爽| 在线色资源| 97香蕉人人乳| 日本一级一级一级一级| 偷拍亚洲熟女视频播放| 亚洲影视综合| 91热色| 欧美91久久久久| 蜜桃传媒一区二区亚洲| 色婷婷五月综合激情中文字幕| 亚洲一区日韩精品中文字幕| 四虎在线视频| 大香蕉性欧美| 国产地址二三| 成人熟女视频一区二区三区| 国产高潮AA片免费看| 久久精品国产亚洲AV高清演员表| 污色区网站| 97久久久久| 精品久久久一本一道| 四虎视频在线观看| 精彩视频日韩| 中文字幕啊啊啊在线观看视频| 欧美成人性爱视频大全| 日本东京热加勒比久久| 欧美性爽xyxOOOO| 日少妇视频| 日韩 欧美 国产 麻豆| 日韩欧美麻豆 | 男女打扑克高清网站| 亚洲古典另类欧美在线| 乳欲人妻办公室奶水| 97超碰人人操人人操| 清纯唯美亚洲综合| 91中文字幕制服丝袜免费视频| 久久熟女久| 尤物视频网 刘玥| 蜜桃精品视频一区| AV天堂男人的天堂| 亚洲天堂另类小说男人| 天堂av2019| 日韩AV色图| 日本三级小说中文字幕| 国产日本熟女顶级一区二区三区视频 | 97日韩欧美亚洲| 久湿久久| 久久r精品| 少妇蹲下买菜露大唇0| 96精品久久久| 青青操在线视频| 久久风骚城市人| 日韩精品人妻中文字幕不卡乱码| 色99久草| 久久久九九| 国产精品69久久久久孕妇欧美| 一级免费精品| 欧美,日韩,中文,另类| 69久久久久久久久久久久久| 本道在线| 91美女视频直播| 精品无码少妇| 神马麻豆福利院 | 最新中文字幕av| 韩国嫰模上门援交视频| 超碰9 7女人| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 老熟女乱伦片| 色呦呦国产精品免费看| 手机在线中文字幕国产 | 国产女人视频三四五区| 国产无码精品久久久久久| 中文字幕第9页萱萱影音先锋| 亚洲97成人在线观看| 国产色精品午夜大片| 亚洲欧美国产其他二区| 色婷婷五月天| 九九九午夜| 丝袜综合色图| 精品二区久久| 久久久97| 国产高清精品一区二区三区毛片| 99久久久er直播网址| 96精品在线| 第45页一区二区| 国产精品粉嫩福利在线| 99999久久精| 亚洲成成熟女人综合一区二区| 国产午夜福利电影免费在线观看 | www.av不卡中文字幕| 久久精品久久久久久久| 亚洲av综合伊人久久| 久久直播国产| 加勒比大香蕉视频在线| 噜噜噜亚洲精品| 欧美一级二级三级| 香蕉国产精品麻豆亚洲欧美日韩 | 97精品久久| 色成人Www精品永久观看| 丁香六月婷婷久久综合| 亚洲大色堂| 超碰欧美COM| 9Ⅰ老熟女| 影音先锋国产精品| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 手机在线看片免费人成视频| 欧美毛片在线网| 久久婷婷欧美| 亚洲图片激情小说| 操逼操逼视频操逼| 久久超碰免费的| 激情综合 婷婷五月 红杏| 欧美v亚洲v综合v国产v妖精| 亚洲国产成人高清在线| 超碰人人妻| 青青草无码视频| 三男一女不戴套的A片| 午夜精品视频777| 天美传媒Av在线| 97色亚洲| 99熟女| 男人的亚洲天堂| 欧洲在线性爱视频| 日韩国产乱子伦App| 久久久久久亚洲精品中文字幕人妻| 亚洲AV不卡在线观看| 人人干黄色| 91快色色色色色| 97 九色| 国产 日韩,欧美 自拍| 九九香蕉网| 亚洲熟女乱色一区二区三区久久久 | 夜夜狼人妻| 欧美色女人| 五月婷婷色色| 欧美色图在线视频少妇| WWW操逼| 久久精品视频28| 大学生美女口爆| 色色热| 午夜福利 成人 91| 五月丁香激情综合网| 亚欧洲一区二区视频| 中国操逼无码| 一牛影视久久久一区二区三区| 在线播放中文字幕| 操逼国产免费| 美女毛片999| 国产亚洲深夜激情| 五月丁香啪啪啪| 特色a在线上| 大香樵伊人网| 亚州色综合| 免费看欧美美女黄色大片| 亚洲 中文 欧美 日韩 在线| 搡老人老9丨女老熟人| 亚洲伊人久久精品影院| 蜜臀久久99精品久久久电影| 中文一区二区婷婷视频| 久草午夜| 亚洲。日韩。欧美| 国产午夜精品在线观看| 久久人人爽爽爽人久久久| 国产午夜精品理论片a大结局| 女优免费一区二区永久| 丝袜亚洲综合| 久久只有精品一区二区三区| 国产一区二区三区免费视频在性观看 | 美女久久久| 麻豆视频test| 热思思免费视频| 熟女天天干| 久久成人国产| 欧美亚洲特P| 日韩国语字幕| 一起草三级AV电影在线观看| 乱理日韩中文| 全免费a敌肛交毛片免费| 天天综合,91入口| 日本狠狠干| 久久精品国产亚洲粉嫩| 国产a级精品| AV和黑人在线播放| 后入日本1234| 青青草视频爽一爽| 日韩性爱毛片操骚逼| 精品女同一区| 小少妇| 啪啪AV导航| 97超级久久| 色哟哟-国产专区| 日韩精品人妻一| 巨乳特殊服务按摩| 国产久久一区二区三区野外在线| 福利操逼| 综合夜夜| 大香蕉之青青草原| 久热99| 福利社区午夜一区二区| 啊啊啊操死我了| 99热超碰| 日韩AV无码中文一区二区| 好爽视频在线观看视频| 老汉网| 日本中文字幕在线电影| 伊人操你| 亚洲色婷婷综合久久久久中文| 丝袜内射| 思思热免费视频观看| 又大又大又大又粗爽高潮观看 | 亚洲天堂精品日韩电影| 中文字幕精品一区二| 尤物视频偷拍免费| 天天欧美色| www.大香| 亚洲在线91| 久久夜精品一区二区三区| 日韩精品一二三四| 黑人狂躁日本妞一区二区三区| 91老熟女| 国产精品69久久久久久久| 麻豆区99999| 天天干天天爽| 在线综合色| 一级片视频啪啪| 999精品乱码| 久久中文字幕女同性恋一区| 用力操死我| 韩国一级婬片A片AAAAA| 青草精品视频日本久久久久网站在线| 大香蕉欧美国产日韩高潮| 天堂蜜桃无码视频一区二区| 可以免费观看的日韩av毛片| 丝袜美女诱惑 91 视频| 一区二区三区一亚洲中文字幕、综合区灬| av操操不卡| 欧美性爱一级操| 天天色,天天干,天天干| 日本不卡一区二区| 亚洲国产97在线精品一区| 无卡一区=区| 亚洲吊色| 天天综合有色网| 影音先锋国产精品| 欧美一级特黄淫片在线观看| 国产精品午夜AV完会免费| 欧美综合色图片| 一卡二卡在线播放| 欧洲精品欧洲精品| 精品亚洲俞拍视频一区| 91亚洲欧美色图| 久久国产精品91| 人妻久久久久久| 国产一级137片内射麻豆| 国产丝袜美女在线一区| aa片毛片| 亚洲丝袜综合| 精品国产Av无码久久久伦古装| 欧美伊人电影| 麻豆天天躁天天揉揉AV| 国产尤物在线三区| 97超碰中文字幕| 日韩丨制服丨中文|在线| 久久久一区二区| 大香蕉免| 国产日韩欧美亚洲精品95| 天天狠操| 色综合91好| 日本色色色网站免费看不卡| 精品久| 欧洲一区二区三区四区在线观看| 男人的天堂日韩| 九9精品| 激情内射| 亚洲图片91| 亚洲丝袜综合| 国产v亚洲v日韩v欧美v片另类| 亚洲色图欧美一区二区不卡| 另类图片综合| 久久狠狠色噜噜狠狠狠狠97| 婷婷色色五月天福利| 日韩免费一级性爱视频| 我想要 啊 啊 啊| 校园春色亚洲| 国产精品一区二区三| 日韩免费中文字幕视频| 黄色免费网| 色综合一本| 免费一级特黄特色大片在线观看看| 国产成人一级av88| 中字幕人妻一区二区三区| 欧美日韩国产高清在线一二三区 | 国产精品天干天干综合网麻豆 | 免费看毛片操穴| 欧洲乱码一区二区| 老女人碰碰在线碰碰视频| 91久久久久久久| 91欧美综合| 亚洲黄色视频在线观看视频| 艹精品| 99色在线| 淫色网综合| 91精品国久久久久久无码| 亚洲天堂久| 欧美色吧综合| 外国免费性情大片| 999久久久免费精品国产牛牛| 国产欧美日韩一区二区三区| 日韩婷婷|