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

ARTICLE DETAIL

資訊詳情

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

SpringBoot測試分層實(shí)戰(zhàn):MockMvc到Testcontainers

SpringBoot測試分層實(shí)戰(zhàn):MockMvc到Testcontainers 要說SpringBoot項(xiàng)目里最容易被敷衍對待的部分測試絕對排得上號。很多人寫測試就是給Service方法加個(gè)Test跑一下發(fā)現(xiàn)綠燈然后就沒有然后了。可等到接口被改、數(shù)據(jù)庫切換、并發(fā)上來之后最先崩潰的往往就是那堆形同虛設(shè)的測試。我早年也吃過這個(gè)虧后來才慢慢把一個(gè)SpringBoot項(xiàng)目的測試體系從“會(huì)跑”折騰到“能救命”。這篇文章就把我在實(shí)戰(zhàn)里沉淀下來的那套打法完整梳理一遍覆蓋從依賴選型、分層策略到MockMvc、Mockito、Testcontainers的落地細(xì)節(jié)以及那些文檔里不會(huì)寫的坑。1. 測試在SpringBoot項(xiàng)目里的定位與分層思路1.1 為什么SpringBoot測試常?!靶瓮撛O(shè)”很多項(xiàng)目的測試代碼看起來不少覆蓋率報(bào)表也好看但一遇到重構(gòu)就稀里嘩啦碎一地。我見過最常見的病根是把測試寫成了“實(shí)現(xiàn)細(xì)節(jié)的復(fù)讀機(jī)”。比如Service層剛調(diào)了userMapper測試?yán)锞蚼ock一堆when(userMapper.selectById()).thenReturn(...)然后斷言返回值。一旦把Mapper換成別的數(shù)據(jù)源測試全部紅掉可業(yè)務(wù)邏輯明明沒變。這種測試的問題在于它驗(yàn)證的是“代碼是怎么寫的”而不是“行為是否正確”。所以我在項(xiàng)目里反復(fù)強(qiáng)調(diào)一個(gè)原則測試要對著契約寫不要對著實(shí)現(xiàn)寫。接口的輸入輸出、異常規(guī)則、狀態(tài)流轉(zhuǎn)才是契約至于底層用的什么框架、什么ORM都不該是單測關(guān)心的重點(diǎn)。這個(gè)認(rèn)知不糾正后面所有工具和技術(shù)都是在錯(cuò)誤的路上加速。1.2 測試金字塔在SpringBoot里的落地方式測試金字塔這個(gè)概念不新鮮但在SpringBoot里落地時(shí)很多人會(huì)跑偏。理論上應(yīng)該是底層單元測試最多、中間集成測試適中、頂層端到端測試最少??蓪?shí)際上因?yàn)镾pringBoot的SpringBootTest太方便了很多團(tuán)隊(duì)直接把所有測試都寫成全量上下文啟動(dòng)一個(gè)項(xiàng)目跑下來測試要十幾分鐘于是大家越來越不想寫測試。我在實(shí)踐中會(huì)把測試分成三類來管控單元測試針對Service、工具類、領(lǐng)域?qū)ο蟛粏?dòng)Spring容器用Mockito隔離依賴。切片測試只加載某一層需要的Bean比如WebMvcTest只加載Controller和MVC相關(guān)配置DataJpaTest只加載Repository和數(shù)據(jù)源相關(guān)配置。集成測試啟動(dòng)完整上下文必要時(shí)用Testcontainers拉起真實(shí)MySQL、Redis等中間件驗(yàn)證跨模塊交互。這三類的比例我會(huì)控制在7:2:1左右。單元測試和切片測試跑得快合并請求時(shí)全量執(zhí)行沒壓力集成測試數(shù)量少、價(jià)值高放在發(fā)版流水線里跑。1.3 一套可持續(xù)的測試策略長什么樣可持續(xù)的關(guān)鍵不是覆蓋率數(shù)字而是反饋速度和穩(wěn)定性的平衡。我見過太多測試綠了但其實(shí)是假綠原因無非是斷言寫得寬松、數(shù)據(jù)沒清理干凈、隨機(jī)端口沖突等等。所以我會(huì)給項(xiàng)目定幾個(gè)硬規(guī)矩所有測試必須能重復(fù)執(zhí)行跑十次結(jié)果一致不允許依賴執(zhí)行順序。測試之間不允許共享可變狀態(tài)數(shù)據(jù)庫、Redis、文件系統(tǒng)必須在每個(gè)用例結(jié)束后恢復(fù)。單元測試和切片測試總耗時(shí)控制在兩分鐘以內(nèi)超過就要拆分。任何測試失敗先解決測試本身不允許用Disabled掩蓋問題。這些規(guī)矩剛定的時(shí)候會(huì)有人覺得麻煩但堅(jiān)持下來之后測試是真的敢在發(fā)版前給人信心的。2. 測試環(huán)境搭建與依賴選型2.1 spring-boot-starter-test里都有什么SpringBoot的測試依賴非常省心起步就在pom.xml里加一個(gè)spring-boot-starter-testdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency這個(gè)starter做了很多底層整合不是簡單地把JUnit扔給你。它默認(rèn)帶了一套組合好的測試工具箱JUnit 5Jupiter現(xiàn)在的基礎(chǔ)測試框架Test、ParameterizedTest、RepeatedTest都靠它。Spring Test Context提供SpringBootTest、Transactional傳播、TestContextManager等能力。MockitoMock、InjectMocks、when/verify的核心來源。AssertJ流式斷言庫assertThat(...).isEqualTo(...)比JUnit原生的assertEquals可讀性好太多。Hamcrest老牌匹配器雖然AssertJ更常用但一些遺留代碼里還會(huì)見到。JSONassert用于對比JSON結(jié)構(gòu)接口測試斷言返回體時(shí)很有用。還有個(gè)容易被忽略的是spring-boot-test-autoconfigure所有WebMvcTest、DataJpaTest這類切片注解都來自它。它保證切片測試自動(dòng)裝配配置時(shí)不會(huì)誤加載其他層的Bean。需要單獨(dú)補(bǔ)依賴的話一般是加mockito-inline用于mock靜態(tài)方法和Testcontainers相關(guān)的模塊這個(gè)后面細(xì)說。2.2 測試目錄與命名規(guī)范目錄結(jié)構(gòu)直接用Maven/Gradle的標(biāo)準(zhǔn)test目錄就行我習(xí)慣把測試類按照被測試類的包結(jié)構(gòu)鏡像并且保持一套統(tǒng)一的命名規(guī)范團(tuán)隊(duì)成員看著不迷路Service層單元測試UserServiceTestController層切片測試UserControllerWebMvcTestRepository層切片測試UserRepositoryDataJpaTest集成測試UserServiceIntegrationTest命名這件事看起來細(xì)枝末節(jié)但作用非常大。跑測試的時(shí)候看到類名就知道它在測哪一層、需不需要容器環(huán)境排錯(cuò)效率直接翻倍。還有個(gè)小技巧把單元測試、切片測試、集成測試通過Maven Surefire的groups或命名后綴區(qū)分開方便在本地只跑某類測試。2.3 測試配置文件的隔離這是非常關(guān)鍵又容易被忽略的一環(huán)。application.yml里往往配置了真實(shí)環(huán)境或開發(fā)環(huán)境的數(shù)據(jù)源、緩存、消息隊(duì)列地址測試如果直接復(fù)用輕則連錯(cuò)庫重則把測試數(shù)據(jù)寫到生產(chǎn)環(huán)境旁邊的關(guān)系庫里去。我一般會(huì)建一個(gè)src/test/resources/application.yml用配置覆蓋的方式只保留測試需要的內(nèi)容spring: datasource: url: jdbc:tc:mysql:8.0.36:///test_db driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver jpa: hibernate: ddl-auto: create-drop redis: host: localhost port: 16379注意這里的數(shù)據(jù)庫地址不是真實(shí)的MySQL地址而是Testcontainers的JDBC驅(qū)動(dòng)地址后面集成測試部分再展開。關(guān)鍵是要理解SpringBoot配置文件加載時(shí)有優(yōu)先級src/test/resources下的文件優(yōu)先級高于主目錄下的application.yml這樣測試項(xiàng)目可以放心覆蓋配置而不用改動(dòng)主代碼的配置。3. 容器測試與切片測試怎么選SpringBootTest用前先想清楚3.1 全量上下文啟動(dòng)的利與弊SpringBootTest是SpringBoot測試?yán)锏摹爸亓考夁x手”它的作用是啟動(dòng)完整的Spring容器把幾乎所有的Bean都裝配起來。好處是貼近真實(shí)運(yùn)行環(huán)境壞處也是顯而易見的啟動(dòng)一次要加載數(shù)據(jù)源、Redis連接、消息隊(duì)列、各種初始化邏輯一個(gè)中型項(xiàng)目跑單個(gè)測試可能就要十幾秒到幾十秒測試一多就完全跑不動(dòng)了。我見過一個(gè)項(xiàng)目光啟動(dòng)容器就要40秒90個(gè)測試類跑完接近一個(gè)小時(shí)。這個(gè)成本導(dǎo)致開發(fā)人員完全不想在本地跑測試最后測試形同虛設(shè)。所以我在新項(xiàng)目里對SpringBootTest的使用非常謹(jǐn)慎只有下面幾種場景才用它跨模塊的端到端業(yè)務(wù)鏈路驗(yàn)證比如從Controller入口一直打到數(shù)據(jù)庫。配置類的加載驗(yàn)證比如自定義的ConfigurationProperties是否綁定正確。需要完整容器環(huán)境的第三方對接聯(lián)調(diào)。其他場景能用切片就用切片。這個(gè)觀念轉(zhuǎn)變之后測試的反饋速度能提升一個(gè)數(shù)量級。3.2 切片測試更快但不是萬能SpringBoot為每個(gè)常見層次都提供了專門用于測試的注解。我這里先列幾個(gè)最常用的切片注解加載范圍典型用途W(wǎng)ebMvcTestController、Filter、ControllerAdvice、MVC配置不加載Service和Repository測試接口參數(shù)校驗(yàn)、路由映射、返回值結(jié)構(gòu)DataJpaTestRepository、Entity、數(shù)據(jù)源配置默認(rèn)使用內(nèi)嵌數(shù)據(jù)庫并開啟事務(wù)回滾測試倉儲(chǔ)層的CRUD、查詢規(guī)則、分頁排序JsonTestJackson/Gson的ObjectMapper相關(guān)配置測試JSON序列化和反序列化規(guī)則RestClientTestRestTemplateBuilder相關(guān)的RestClient配置測試遠(yuǎn)程HTTP客戶端調(diào)用邏輯MybatisTestMyBatis的Mapper和配置需引入第三方starter測試MyBatis的SQL語句映射WebMvcTest是我每天都會(huì)用到的。它只加載Web層Service用MockBean新版本里推薦MockitoBean或MockBean具體看Spring版本打樁。這樣啟動(dòng)速度非??煲粋€(gè)Controller相關(guān)的測試類通常在幾百毫秒內(nèi)就能跑起來。不過切片測試也不是萬能藥。WebMvcTest不會(huì)加載你自定義的攔截器之外的全局配置如果攔截器依賴了Service里的數(shù)據(jù)就需要額外把相關(guān)Bean補(bǔ)進(jìn)測試上下文DataJpaTest默認(rèn)用內(nèi)嵌H2替換真實(shí)數(shù)據(jù)庫如果項(xiàng)目里用了MySQL特有的JSON字段或全文索引H2大概率模擬不出來這時(shí)候就得考慮Testcontainers。3.3 不同場景下的選型對照我在實(shí)際項(xiàng)目中形成了一張很實(shí)用的對照表每個(gè)新開發(fā)者進(jìn)來我都會(huì)先發(fā)這張表防止他們憑感覺選測試方式測試目標(biāo)推薦方式啟動(dòng)速度真實(shí)度是否要mockController參數(shù)校驗(yàn)、路由WebMvcTest快中mock ServiceService業(yè)務(wù)規(guī)則純JUnit Mockito極快低mock Repository/外部ClientRepository查詢邏輯DataJpaTest較快中取決于數(shù)據(jù)庫類型不需要跨層主流程SpringBootTestTransactional慢高看情況外部中間件真實(shí)聯(lián)測SpringBootTest Testcontainers慢極高一般不需要這個(gè)表格背后真正的判斷標(biāo)準(zhǔn)是三個(gè)問題測的是哪一層這層最關(guān)心的風(fēng)險(xiǎn)是什么需要多高的環(huán)境保真度想清楚這三個(gè)問題選型就不會(huì)錯(cuò)。4. Controller層測試實(shí)戰(zhàn)MockMvc的關(guān)鍵細(xì)節(jié)4.1 MockMvc 基本套路Controller層的測試最常用MockMvc配合WebMvcTest使用不需要真正啟動(dòng)Web容器。直接發(fā)起HTTP請求然后對返回的響應(yīng)做斷言。下面這段代碼是典型的用法WebMvcTest(UserController.class) class UserControllerWebMvcTest { Autowired private MockMvc mockMvc; MockBean private UserService userService; Test void shouldReturnUserWhenIdExists() throws Exception { UserVO mockUser new UserVO(1L, 張三, zhangsanexample.com); given(userService.findById(1L)).willReturn(mockUser); mockMvc.perform(get(/api/users/1) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath($.name).value(張三)) .andExpect(jsonPath($.email).value(zhangsanexample.com)); } }given是Mockito BDD風(fēng)格的寫法等價(jià)于when(...).thenReturn(...)只是可讀性更好。很多人寫Controller測試時(shí)習(xí)慣直接調(diào)Controller的方法這樣其實(shí)繞過了路由解析、參數(shù)綁定、序列化這些真正的風(fēng)險(xiǎn)點(diǎn)測試價(jià)值大打折扣。用MockMvc走一趟完整請求鏈路才檔得住真實(shí)的調(diào)用問題。4.2 斷言比調(diào)用更重要測試的核心不是把請求發(fā)出去而是做足夠嚴(yán)謹(jǐn)?shù)臄嘌?。我見過不少同事寫完andExpect(status().isOk())就收工了根本沒驗(yàn)證返回內(nèi)容。這種測試跟沒寫差不多接口里面隨便改點(diǎn)東西都會(huì)照常綠。我給團(tuán)隊(duì)定的標(biāo)準(zhǔn)是至少覆蓋狀態(tài)碼status().isOk()、isCreated()、isBadRequest()等。業(yè)務(wù)字段用jsonPath逐一斷言核心字段不允許只斷一個(gè)$.code。關(guān)鍵時(shí)序涉及異步或重定向時(shí)檢查響應(yīng)頭里的Location或狀態(tài)流轉(zhuǎn)。異常路徑參數(shù)缺失、資源不存在、權(quán)限不足每一種都得有對應(yīng)的用例。JSONPath斷言是接口測試?yán)锏睦?。假設(shè)返回體是{data: {items: [{id: 2}, {id: 5}]}}可以這樣寫.andExpect(jsonPath($.data.items.length()).value(2)) .andExpect(jsonPath($.data.items[1].id).value(5))注意length()這個(gè)函數(shù)式寫法很多人在第一次接觸JSONPath時(shí)會(huì)漏掉導(dǎo)致斷言怎么寫都不對。4.3 常見翻車點(diǎn)我在接口測試?yán)锊冗^不少坑挑幾個(gè)典型分享MockBean的返回值類型不一致如果UserService.findById返回的是OptionalUserVO但代碼里處理的是null判斷mock時(shí)容易返回Optional.empty()而忘掉對應(yīng)邏輯分支然后測試通過的代碼拿真實(shí)數(shù)據(jù)就出問題。建議mock時(shí)先確認(rèn)生產(chǎn)代碼的判空路徑。日期時(shí)間格式LocalDateTime默認(rèn)序列化格式是數(shù)組比如[2025, 5, 1, 10, 30, 0]。如果接口要對前端返回yyyy-MM-dd HH:mm:ssController測試?yán)锉仨汄?yàn)證這個(gè)格式否則到聯(lián)調(diào)時(shí)才暴露就晚了。分頁參數(shù)的默認(rèn)值Spring Data的分頁接口如果沒傳page和size會(huì)走默認(rèn)值。測試?yán)锶绻粶y默認(rèn)值后面前端傳錯(cuò)參數(shù)也沒人發(fā)現(xiàn)。靜態(tài)資源處理WebMvcTest默認(rèn)不會(huì)加載靜態(tài)資源映射如果Controller里有重定向到靜態(tài)頁面的接口測試?yán)锟梢酝ㄟ^手動(dòng)添加資源處理器或者改用SpringBootTest。還有一點(diǎn)很多人不知道MockMvc的perform其實(shí)會(huì)在內(nèi)部走完整的DispatcherServlet所以Valid注解觸發(fā)的參數(shù)校驗(yàn)在WebMvcTest里是真實(shí)生效的。換句話說Controller層的參數(shù)校驗(yàn)測試完全可以在切片環(huán)境里做不需要跑到集成測試?yán)镌傺a(bǔ)。5. Service層單元測試Mockito的正確姿勢5.1 基礎(chǔ)三件套Service層是業(yè)務(wù)邏輯的聚集地測試價(jià)值最大但也是最容易被寫壞的。我常用的基礎(chǔ)模式是MockInjectMocksExtendWith(MockitoExtension.class) class UserServiceTest { Mock private UserRepository userRepository; Mock private PasswordEncoder passwordEncoder; InjectMocks private UserService userService; Test void shouldCreateUserWithEncodedPassword() { String rawPassword abc12345; given(passwordEncoder.encode(rawPassword)).willReturn(encoded-value); User created userService.createUser(zhangsan, rawPassword); assertThat(created.getPassword()).isEqualTo(encoded-value); verify(userRepository).save(any(User.class)); } }ExtendWith(MockitoExtension.class)是JUnit 5與Mockito集成的入口沒有它Mock和InjectMocks不會(huì)生效。InjectMocks會(huì)優(yōu)先按構(gòu)造器注入其次是setter和字段注入這要求被測類的依賴盡量通過構(gòu)造器聲明否則容易注入不進(jìn)去。5.2 別mock一切很多人寫Service測試時(shí)有個(gè)壞毛病把Service內(nèi)部依賴的私有方法也通過mock去繞開。實(shí)際上Mock只能作用于類的公開協(xié)作對象私有邏輯該測還是得測。更糟糕的是有些人會(huì)把UserRepository.save(...)的返回值mock成一個(gè)帶ID的復(fù)雜對象結(jié)果Service里后續(xù)依賴的字段沒設(shè)置測試和真實(shí)行為對不上。我踩過一次最深的坑是某個(gè)下單流程里OrderRepository.save()返回的訂單對象里有個(gè)凍結(jié)金額字段我mock的時(shí)候忘了set值導(dǎo)致后續(xù)計(jì)算一直為0測試卻綠了。上線后真實(shí)數(shù)據(jù)一跑就出狀況。那之后我定了個(gè)規(guī)則能少mock就少mock能走真實(shí)對象就走真實(shí)對象。Repository里的方法如果有清晰的返回規(guī)則我寧愿寫個(gè)真實(shí)的實(shí)體對象傳進(jìn)去也不想mock出個(gè)殘缺對象。另外verify經(jīng)常被用錯(cuò)。verify(userRepository).save(...)驗(yàn)證的是這個(gè)調(diào)用發(fā)生過一次但如果你想要的是“最終調(diào)用了兩次”這種次數(shù)斷言需要配合times(2)。不要濫用verifyNoMoreInteractions()它會(huì)把測試綁死在實(shí)現(xiàn)細(xì)節(jié)上。5.3 靜態(tài)方法與構(gòu)造方法Mockito的老版本不支持mock靜態(tài)方法SpringBoot新版本里如果項(xiàng)目引用了mockito-inline就可以搞定try (MockedStaticIdGenerator mocked mockStatic(IdGenerator.class)) { mocked.when(() - IdGenerator.nextId()).thenReturn(42L); // 執(zhí)行被測代碼 }mockStatic返回的對象要記得關(guān)閉否則會(huì)影響同進(jìn)程里其他測試。一般用try-with-resources包住即可。對new出來的對象可以用mockConstruction但這兩個(gè)功能我建議盡量少用。遇到靜態(tài)方法調(diào)用優(yōu)先考慮通過注入接口來消除靜態(tài)依賴而不是依賴Mockito的擴(kuò)展能力。因?yàn)殪o態(tài)mock一旦用多測試會(huì)變得非常隱晦出問題也難排查。6. 真實(shí)數(shù)據(jù)庫聯(lián)測從H2到Testcontainers6.1 H2的甜蜜與陷阱DataJpaTest默認(rèn)會(huì)用H2代替真實(shí)數(shù)據(jù)庫如果項(xiàng)目用的是Hibernate大部分CRUD能正常跑通??梢坏┥狭薓ySQL的方言特性H2就會(huì)開始背叛你。我在項(xiàng)目里遇到的典型問題包括H2對JSON類型的支持是模擬的序列化/反序列化行為跟MySQL不一致。MySQL的ON DUPLICATE KEY UPDATE在H2里是另一套語法。分頁查詢的LIMIT ? OFFSET ?表現(xiàn)有差異。字段默認(rèn)值、字符集排序規(guī)則不同可能導(dǎo)致測試通過但線上失敗。所以我的經(jīng)驗(yàn)是H2只適合驗(yàn)證查詢邏輯的雛形凡是涉及數(shù)據(jù)庫特性的項(xiàng)目真正該做的是用Testcontainers跑真實(shí)數(shù)據(jù)庫。6.2 Testcontainers 落地方式Testcontainers是一個(gè)極其好用的庫它能在測試時(shí)用Docker臨時(shí)拉起容器測試結(jié)束自動(dòng)銷毀保證環(huán)境干凈。SpringBoot生態(tài)里甚至有專門為它準(zhǔn)備的starterdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-testcontainers/artifactId scopetest/scope /dependency有了這個(gè)依賴測試?yán)锟梢赃@樣用Testcontainers class UserRepositoryDataJpaTest { Container static MySQLContainer? mysql new MySQLContainer(mysql:8.0.36) .withDatabaseName(test_db) .withUsername(test) .withPassword(test); // 通過動(dòng)態(tài)屬性注冊把數(shù)據(jù)源地址指到容器 DynamicPropertySource static void configureDatasource(DynamicPropertyRegistry registry) { registry.add(spring.datasource.url, mysql::getJdbcUrl); registry.add(spring.datasource.username, mysql::getUsername); registry.add(spring.datasource.password, mysql::getPassword); } }Container標(biāo)注的靜態(tài)字段只啟動(dòng)一次所有測試類共享同一套數(shù)據(jù)庫容器速度還能接受。DynamicPropertySource用來動(dòng)態(tài)注入配置比寫死application.yml里的連接地址要靈活得多。更省事的寫法是直接用JDBC URL里的tc:前綴這樣連Container都不用單獨(dú)聲明spring: datasource: url: jdbc:tc:mysql:8.0.36:///test_db driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver這種玩法會(huì)自動(dòng)按URL拉起容器對已有代碼改動(dòng)最小。我最近幾個(gè)新項(xiàng)目都用的這個(gè)方式唯一需要保證的是CI機(jī)器上有可用的Docker環(huán)境。6.3 事務(wù)回滾與數(shù)據(jù)污染數(shù)據(jù)庫測試最大的敵人是數(shù)據(jù)污染。Spring對測試方法上有Transactional的方法是會(huì)默認(rèn)回滾的DataJpaTest本身也自帶這個(gè)行為。但如果測試?yán)镉玫氖荢pringBootTest想回滾就得自己加Transactional或者借助BeforeEach清理數(shù)據(jù)。我得提醒一個(gè)容易踩的坑測試方法里有異步操作或者數(shù)據(jù)庫操作發(fā)生在獨(dú)立線程時(shí)事務(wù)回滾會(huì)失效。比如Service里用了Async測試方法結(jié)束后異步線程還在寫數(shù)據(jù)回滾根本攔不住它。這也是為什么異步邏輯的測試要用真實(shí)數(shù)據(jù)庫加顯式清理或者用Mockito把異步邏輯改成同步執(zhí)行具體要看業(yè)務(wù)場景。另外Testcontainers容器雖然會(huì)銷毀但它拉起容器可能要花十幾秒。如果測試類特別多容器資源會(huì)互相占用。我建議給CI機(jī)器配置足夠的Docker資源或通過compose.yml的方式復(fù)用一套容器不要每個(gè)測試類都另起一個(gè)MySQL實(shí)例。7. 測試執(zhí)行效率與CI集成7.1 上下文緩存Spring的TestContext框架默認(rèn)會(huì)緩存應(yīng)用上下文只要配置相同多個(gè)測試類可以復(fù)用同一個(gè)上下文。這對性能影響巨大因?yàn)橐粋€(gè)全量SpringBootTest上下文可能耗時(shí)幾十秒復(fù)用后多個(gè)測試類共享一次啟動(dòng)成本。但緩存有幾個(gè)失效因素要特別注意MockBean或新版本的MockitoBean改變了上下文的定義用了不同mock的測試類會(huì)各自創(chuàng)建一根上下文。DynamicPropertySource會(huì)作為緩存key的一部分每個(gè)測試類如果注入不同的屬性緩存也失效。ContextConfiguration中的locations或initializers不同同樣會(huì)產(chǎn)生新上下文。所以在寫測試時(shí)我會(huì)盡量讓同一批測試的配置保持一致尤其是切片測試中聲明mock的方式不要一會(huì)兒一變。7.2 隨機(jī)測試帶來的確定性接口測試?yán)镒钆碌氖请S機(jī)性。比如測試依賴某個(gè)ID主鍵自增跑過一次后數(shù)據(jù)變了第二次執(zhí)行就失敗。解決辦法是不要讓測試依賴任何來自外部環(huán)境的可變值??梢杂霉潭〝?shù)據(jù)、顯式清理、或者在斷言前先重置數(shù)據(jù)庫狀態(tài)。DirtiesContext這個(gè)注解我一般很謹(jǐn)慎地用。它會(huì)讓測試結(jié)束之后銷毀上下文下次再創(chuàng)建一個(gè)新的。這個(gè)成本非常高通常只在測試會(huì)修改Bean狀態(tài)、影響后續(xù)測試時(shí)才需要。如果是為了解決數(shù)據(jù)污染就上DirtiesContext那是用大炮打蚊子會(huì)導(dǎo)致整個(gè)測試套件變得奇慢無比。7.3 CI里怎么跑測試在CI里的運(yùn)行策略和本地不完全一樣。我一般把Maven Surefire配置成默認(rèn)跑所有單元測試和切片測試集成測試另用failsafe插件單獨(dú)跑放在發(fā)版管道里plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId version3.2.5/version configuration includes include**/*Test.java/include include**/*WebMvcTest.java/include include**/*DataJpaTest.java/include /includes excludes exclude**/*IntegrationTest.java/exclude /excludes /configuration /plugin對應(yīng)地集成測試類命名為XxxIntegrationTest交給failsafe插件去跑。這樣本地可以快速跑完單元測試CI的合并請求階段也不會(huì)被重量級集成測試拖慢。CI環(huán)境里還常見一個(gè)問題測試偶發(fā)失敗。偶發(fā)失敗比穩(wěn)定失敗更折磨人常見來源是端口沖突、外部服務(wù)超時(shí)、并發(fā)測試爭搶資源。我強(qiáng)烈建議把Surefire配置成parallel時(shí)只對無狀態(tài)的純單元測試開啟并行涉及容器或數(shù)據(jù)庫的測試不要并行否則排查成本比省下來的時(shí)間還高。8. 常見問題排查速查表最后整理一張我這些年攢下來的排查表基本上項(xiàng)目里踩過的測試坑都在這了。遇到問題先對著這張表查一遍很多坑可以直接跳過?,F(xiàn)象常見原因處理方式SpringBootTest啟動(dòng)失敗報(bào)數(shù)據(jù)源URL為空測試配置沒有正確覆蓋主配置確認(rèn)src/test/resources/application.yml存在且數(shù)據(jù)源配置完整測試方法內(nèi)開了事務(wù)但數(shù)據(jù)沒有被回滾方法里啟動(dòng)了新線程或調(diào)用了Async改用真實(shí)數(shù)據(jù)庫顯式清理或mock掉異步邏輯MockMvc測試報(bào)404WebMvcTest沒有包含目標(biāo)Controller在注解里顯式列出WebMvcTest(UserController.class)Mockito報(bào)UnnecessaryStubbingException打樁沒有被用到刪除多余的given(...)或使用lenient()Testcontainers起不來提示連接Docker失敗CI機(jī)器沒有Docker或Docker版本不兼容確保Docker daemon存活檢查測試機(jī)的socket權(quán)限D(zhuǎn)ataJpaTest中SQL語法錯(cuò)誤H2與MySQL方言不一致如果涉及數(shù)據(jù)庫特性切換Testcontainers真實(shí)數(shù)據(jù)庫測試之間數(shù)據(jù)相互污染沒有清理數(shù)據(jù)或事務(wù)回滾失效在每個(gè)用例前清理目標(biāo)數(shù)據(jù)表或使用Transactional保證回滾jsonPath($.data).value(...)一直失敗返回體結(jié)構(gòu)與預(yù)期不一致先用andReturn().getResponse().getContentAsString()打印返回體再比對測試上下文緩存未生效每次都重啟MockBean或DynamicPropertySource使用不一致導(dǎo)致緩存key變化盡量統(tǒng)一同一批測試類的mock聲明和配置注入排查時(shí)有個(gè)非常實(shí)用的招式別急著改代碼先看測試失敗時(shí)的完整日志和返回體。MockMvc測試失敗時(shí)經(jīng)常會(huì)打印完整的響應(yīng)內(nèi)容很多人忽略了這行輸出直接去翻生產(chǎn)代碼浪費(fèi)大量時(shí)間。我個(gè)人在實(shí)際操作中的體會(huì)是SpringBoot測試這事的核心并不在于會(huì)用幾個(gè)注解而在于建立起“分層驗(yàn)證、快慢分離、持續(xù)可跑”的測試?yán)砟睢淖畛醯腟pringBootTest一把梭到現(xiàn)在每層各司其職項(xiàng)目的回歸速度和質(zhì)量穩(wěn)定性都有了根本性的變化。這個(gè)內(nèi)容后續(xù)還可以繼續(xù)擴(kuò)展成一套團(tuán)隊(duì)內(nèi)部的測試規(guī)范文檔把切片選型、命名規(guī)范、容器管理、CI流水線配置都沉淀成模板讓每個(gè)新加入項(xiàng)目的同事都能少踩我踩過的那幾年坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日日夜夜模| 99久久99久久免费精品蜜臀| 国模精品娜娜一二三区| 亚州男人天堂| 日韩美一区| 一级性爱aaaa| 成人一道本免费视频| 精品中文一区二区| 日韩美一区| 久久东京热久久| 亚洲精品国产精品乱码不卡| 色情综合| 日韩精品国产一区二区| 欧美成人精品欧美一级乱黄一区二…| 天天操天天日天天干| 五月天激情小说| 强奸乱伦亚洲第一页| 骚熟女AV网| 亚洲精品 大香蕉| 男女性感激情网站| 乱性AV| 久久久性爱视频| 国语av最新自产拍在线观看| 一区二区三区免费视频入口| 欧美色道啊| 青青草日逼视频| 日韩精品国产一区二区| 欧美性生活男人的天堂| 亚洲高清欧美总合| 亚洲乱熟女一区二区| 五月婷婷hd| 韩国一级婬片A片AAAAA| 国产专区第一页| 日本影视久久免费| 乱伦熟女论坛| 好爽视频在线观看视频 | 日韩精品一二三四| 熟女乱伦二区| av资源在线观看少妇| 草草影院最新网址| 国语精品内射在线观看| 成人97人人超碰人人| 91天美免费| 国产欧美日产一区二区三区 - 国产欧美日| 日韩中文字幕二区| 婷婷丁香六月| 日日夜夜天天| 色一射色一射| 日日干日日操五月天伦理视频| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 亚洲人妖网| 五月天婷婷欧美三区| 中文字幕 国产 精品| 亚洲中文一区二区三区| AV和黑人在线播放| 视频在线观看免费一区二区三区| 伊人精品久久网站| 伊人亚洲国产一成人久久精品,久久| 浪人综合网| 一级黄色视频网| 家庭乱伦网站国产| 亚洲成av人片色午夜乱码| 手机看片1025| 防屏蔽在线视频| 午夜天堂精品久久久久91| 色色色999| 69人妻精品一区二区绯色| 亚洲超碰在线| 免费公开人人操| 国产精品99精品视频网站| 蜜桃视频成a人v在线| 91麻豆va国产精品| a一区二区三区乱码在线| 色欧洲| 国产一区在线看| 欧洲视频在线| 中文字幕二区日韩天堂| 亚欧中文字幕在线视频| 91精品久久久久久77777| 精品999一区二区| 97干色| 一区操逼| 狠狠综合| 加勒比综合a∨| 伊人操| 一本精品日本在线视频精品| 日韩女模中文造逼| 亚洲清纯唯美| 97国产人人| aaaa少妇高潮大片| 中文字幕55555| 黑丝91视频| 超碰97亚洲区| 2018天天干在线视频| 狠狠综合网| 黑人中出21连凳花野真衣| 久久超碰亚洲人| 熟妇一区,二区,三区。| 影音先锋视频在线| 九九视品黄色| 91色插| 亚欧成人综合影院| 骚乳在线| 九九九精品美女| 韩国成人精品久久久免费看| 人妻久热在线| 人人操人人93| 色99视频| 天天拍夜夜| 久久精品国产亚洲AV片多多| 大香蕉宅男伊人| 屁股久久久久久久久久| 桃花色涩综合影院| 亚州色站 日韩电影| 91女色| 日欧操屄视频| 后入 亚洲 美女 射| 久久久成人精品| 欧美gv在线观看| 久操综合在线| 国产久久久久久| www狠狠| 久久日本熟女精品一区| A级毛片在线看免费| 日韩欧美麻豆大片| 精品人妻中文字幕高清| 91久久精品国产| 精品人妻丰满熟妇一区二区三| 天天天天天天天天天天干美女| 午夜福利在线视频1000| 国产精品久久久久久无码红治院| 妇女视频网站| 日本欧美一区二区三区免费| 黄色一区三区| 精品亚洲国产成人精品| 色色色欧美| 伊人aaa| 亚洲激情综合另类男同| 另类专区加勒比| 人人潮人人摸| 久久久免费视频18| 桃花色涩综合影院| 日韩小电影| 97干色天堂| 中国农村熟妇毛片视频| 青青操日韩| 99热99色| 日韩人妻一区二区| 超碰中文字幕人妻草一区| 久久受www免费人成| 欧美亚洲成人在线一区二区三区| 中文字幕视频在线观看一区二区| 天堂综合网| 久久久18| 国产AV精久久| 中韩中文字幕在线观看| 内射白嫩美女| 九九性爱网| 久久三区四区| 中文字幕精品人妻丝袜| 国产一区二区三区白丝| 一本一道久久综合久久| 亚洲欲色9532548967一区| 日韩三级在线观看网站| 亚洲精品97中文字幕| 国产熟女免费观看久久| 青草精品视频一日本久久久久网站| 中文字幕丰满子伦无码专区在线视频最新| 情色大香蕉| aaa一级黄片| 一级性爱啪啪视频| 一区二区三区激情在线观看| 夫妻AV网站| 风月影院男女十八禁| 激情干在线| 97手机日韩| 色婷婷成人综合| 日本一级二级三级网站| 青娱乐91| 蜜桃久久久久久久久久久久| 操碰97| 国产精品久久久久久亚洲色欲| 九九热免费在线国产视频伊人五月| 日本精品网站在线中文| 久久久青青草| 91国产在线精品| 男人的天堂亚洲| α√在线| 欧美少妇性爱网站| 美女裸体无遮挡永久免费观看网站| 九九玖玖精品| 很很热性爱视频| 亚洲人妻在线精品| 天天综合网1| 色婷婷丁香五月| 国模不卡| 婷婷在线视频在线观看| 人人妻人人爱人人玩| 中文字幕一区二区三四五区日日骚| 家庭乱伦网站国产| 综合欧美日本三级| 91在线超高颜值国产| 国产精品午夜福利| 在线情色电影 91大| 国产无套粉嫩白浆在| av在线播放国产一区| 夜夜欢天天干| 快播久久人人aV| 是还免费视频1727我| 91人妻视频| 欧美日韩情色一区二区| 欧美淫穴| 五月婷婷综合在线| 婷婷综合五月| 手机看片1024你懂的国产| 在线欧美69V免费观看视频| 2020久久免费视频| 欧美色亚洲| 中韩中文字幕在线观看| 国产精品伦理| 97干97色| 五码视频在线观看| 香蕉久久AⅤ...| 大香蕉黄色一级片免费看| 熟妇乱伦一区二区| 成人精品在线免费视频| 26uuu最新| 国产 日韩 欧美一区| 一区二区三区视频| 午夜福利国产欧美日韩夜夜| 女人被男人桶爽视频网站| 草莓精品视频在线免费观看| 在线a v| 91色色网站| 亚洲成人贴图| 凹凸视频在线观看伊人| 久久免费精品视频免一| 日本黄 R色 成 人网站| 久久99综合| 欧美美女自慰一区二区三区| 久久亚洲天天做| 欧美 亚洲 另类 综合| 玖玖爱综合网| 一区二区不卡视| 男人天堂网站| 免费精品中文字幕| 婷婷激情啪啪| 97精品综合久久网| 久热精品在线| 97超碰人人操人人操| 不卡中文字幕aⅴ在线| A级国产欧美激情在线| 无遮挡一级毛片视频免费的| 欧美专区日本专区| 久视频在线观看| 日韩在线97| 蜜臀久久在线视频| 精品九区| 亚州免费啪啪视频| 国产精品经典一卡久久久| 欧美伦乱爱| 九九九国产精品| 蜜臀视频网站| 国产三级中文有码在线视频| 99热超碰| 亚洲狠狠入| 91久久免费视频互動交流 | 牛牛AV人人夜夜澡人人爽| 很黄很色的视频在线观看| 亚洲一区中文字幕一区| 殴美牲| 久啪| 国产一进一出视频网站| 99爱久久视频频| 青青草国产一区二区三区| 亚洲天天更新| 欧美视频一区二区在线| 三级片大波波| 亚洲中文字幕在现观看| 99热99色| 精品人妻一区二区三区视频| 丁香九月婷婷| 久久久com| 日本精品九九九| 日本欧美中文字幕| 天天综合色| 俞拍自拍| 啪啪视频亚洲第一| 吉川爱美亚洲二区在线| 手机午夜电影神马久久| 色av中文字| 91男同| 欧美性爱精品七区| 五月天激情综合网| 欧美草草高清日韩视频| 少妇滛荡视频| 玖玖爱伊人玖玖爱| 色色香蕉| 中文字幕一二三av| 色优久久| 97视频免费播放| 六十路日本| 久久9免费视频| 国产 无码 一区二区| 天天干天天日天天射黄色大片| 久久久青青草| 天天干天天爽| 亚洲男人的天堂va亚洲男人社| 操屄不卡视频| 青青草中文字幕| 极品极品色影院| 色色色色色色色色综合| 99re国产精品视频| 少妇久久久免费| 亚洲性爱无码乱伦av| 精品人妻一二三四区视频| 亚洲阿v天堂无码z2018| 亚洲色入欧美| 伊人久久大香大香线蕉中文| 蜜桃久久久久久| A 天堂| 亚洲人在线成线成人| 综合夜夜| 日产狠狠干| 毛片久久| 久久动漫精品视频这里只有精品| 久操com| 色制服丝袜夫妻av一区| wwwcaobibi| 精品一区二区2| 中文字幕成人| 综合夜夜| a片在线播放| 亚91亚洲网| 国产欧美成人第一页在线观看| 亚洲宗合网| 久久av一级av少妇av高潮 | 亚洲精品97p| 又大又白奶子| 国产成人自拍视频视频| 久久久久久综合久久伊人蜜月| 老女人爆菊| 中国人高清www色视频免费| 美女久久久久久久| 一本一道vs波多野结衣| 大香蕉日韩| AV在线资源| 欧美日韩国产色图在线| 天天噜| 亚洲色鬼| 亚州操逼网| 青娱乐啪啪视频| 乱子伦一区二区三区国产精品| 无码少妇精品一区二区60岁老人| 极品人妻少妇综合| 91少妇通奸网站| 亚洲无套久久嗯嗯| 人人天天干干| 国产AV中文| 青青伊人久久| 久久手机视直播| 加勒比在线视频一区二区三区| 人妻娇喘 激情视频| 久久久久久91香蕉国产| 九九精品网| 粉嫩AV一区夜夜嗨| 色综合中文字幕不卡| 日韩激情啪啪| 久久久久九九九| 国产精品国产亚洲区艳妇糸列| 久久9精品网站| 俺去久久| 屌逼麻豆| 亚洲欧美大| 激情五月天色色网| 国产精品久久久久中文字幕| 国产A v无码专区| 人人搞人人插人人操| 9九九国产| 天天色悠悠激情| 久久久久国产无av| 午夜精品五区| 久操网视频| 欧美黄色手机在线观看| yaouchengrenav| 亚洲精品人体| 欧美天堂在线| 国产一线二线三线av| 欧美最大综合网| 国产精品熟女九九九| 欧美78p| 婷婷香蕉欧美在线一区二区三区| www.狠狠| 亚洲有薄码区日本系列中文字幕| 婷婷五月天激情网| 91校园春色长篇| www狠狠| 99性视频| 在线播放成人网站| 久久久久久久性爱| 亚洲黄色AV电影| 熟妇人妻精品一区二区| 国产91丝袜 在线播放| 600国产精品视频| 少妇天堂| 亚洲天天综合| 成人小说另类在线| 国内毛片婷婷六月色| 蜜乳AV一区| 乱伦日本色图AⅤ| 妺妺跟我一起洗澡没忍住| 最好看的中文字幕在线2018| 你想操日本小逼吗| 久久精品99| 95精品在线| 国产久久视频| 成人精品欧洲亚洲| 黑丝制服中文字幕| 九热中文字幕| 精品视频免费在线一区| 久久精品国产96精品亚洲拳交| 日韩一级特黄av毛片| 日韩不卡毛片Av免费高清| 高清不卡视频| 欧美性爱中文字幕无线码| 人妻内射一区二区在线视频| 一区二区三区激情在线观看| 久久久夜夜嗨免费视频| www.yw尤物| 天天操天天射青青草| 国产精品视频在线播放| 色图四区| 在线有码中文字幕| 日本福利二区视频| 超碰性爱97| 在线欧美69V免费观看视频| 国产中文字幕曰本毛片| 蜜桃久久综合视频| 久久久九九| 九九九九9999| 成人av在线播放| 天天色综合天天操| 久久超碰、| 精品女同一区| 日韩无码精品综合久久| 亚洲色五月| 91N综合在线| 亚洲欧美黄| 免费伦费视频在线观看| 久久久久久性爱片| 2017天天插| 亚洲国产精品99久久久| 嗯啊不要啊在线 | 日韩一级久久毛片| 久久精品国产96精品亚洲拳交| 欧美激情五月天| 亚洲熟妇综合久久久久久| 国产v亚洲v日韩v欧美v片另类| 大香网站| 97精品国产精品免费观看| 91精品国产综合久久久蜜臀酒店| JULIA一区二区三区在线播放| 久久综合精品一区二区三区| 2017天天插| 国产伦精品一区二区三区在线观| 嗯啊啊啊轻点视频 | 熟妇的味道HD中文字幕| 中文字幕 一区二区 亚洲无码| 国产a级午夜毛片| 妇女视频网站| 中文字幕丰满人妻日本| 香蕉婷婷| 有码专区最新中文字幕有码| 黑人嘿嘿嘿超爽免费视频| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 国产99热| 亚洲精品一区中文字幕乱码| 欧美色97| 激情五月天色色| 日本道人妻久久久在线不卡色视频| 天天激情干| 麻豆 欧美 日韩| 久久久久久久久久9| av一区二区三区 中文| 成年人免费观看网站| 综合在线导航一区| 日本精品久久久久久久| 老司机深夜影院18未满| 久久一本大香蕉 | 日韩国语字幕| 懂色Av| 熟妇一区二区三区| 日日爱99| 黄色高清久久无码依人| 色就色综合| 国产精品不卡一区二区三区| 国产欧美岛国精品一区| 伊人991| 成人八戒网站| 午夜亚洲| 日韩情色一区二区| 天天干2019| 51国产午夜精品视频| 秋霞午夜视频一区二区| 亚洲一卡2卡3卡4卡乱码网站| 我想要啊 啊 啊| 国产三级电影免费观看| 亚洲第一页色网| 日韩欧美国产高清视频| 久久久无码视频| 91欧美偷拍| 韩国黄片aaaa| 日韩99999| 蜜臀av中字字幕网站| 欧美1区二区三区公司| 大香蕉之青青草原| 骚逼高潮久久精品| 中文精品一区二去| 日韩欧视频| 国产亚洲 中文欧美久久| 黄片qw| 久久精品六区| 国产性感在线观看| 久久性视频| 搡老熟女免费视频 | 欧美天堂日韩三级国产传媒| 国产伦乱91| 久久亚洲AV无码白度| 大乔未久88一区| 色婷婷成人| 人人操 欧美| 亚洲精品熟妇1区2区3区。| 亚洲18禁| 你懂得91| 无码 黑人一区二区三区| 久热精品在线| 久久 亚洲 日韩 人妻| 伊人宅男大香蕉| www.人人摸在线视频| 天天综合91在线| 一级毛片久久久久久久女人18| 尤物视频新赏网鲜网色诱网| 精品人妻一区二区免费蜜桃| 操人91| 人人看欧美性爱| 久久春色| 国产97在线播放| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日韩国产精品人妻无码久久久| 欧美传媒一区| 久久99999| 91视频观看网站| 天天射影院| www.久久最新地址| 豆花视频操逼网址| 亚洲高清视频在线免费观看| 亚洲深夜福利| 久久久999国产精品| 99999精品视频| 日韩av乱伦| 美女极品一区二区三区| 天天懆天天日| AV一区观看| 影音先锋每日最新资源在线观看| 九九九九国产| 精品人妻一区二区免费蜜桃视频| 青青三级视频| 啊嗯嗯啊好大好爽| 蜜桃视频一区二区三区| 欧美人与动性人交a| 超碰免费97| 校园春色美腿丝袜| 999熟女精品| 人妻少妇久久| 91美女视频直播| 日韩精品系列| 伊人欧美大香蕉视频| 亚洲色天堂九9| 亚洲色图8| av影院十区| 97国产精品一区| 91狠狠综合久久| 欧美少妇人妻| 18禁免费视频| 日本一级黄色电影| 嗯阿好爽好紧| 加勒比久久av| 欧美精品三区| 人妻中文字幕日韩电影| 男人的天堂2018东京热啪啪啪| 在线97在线| 人妻少妇无码 | 色色色999| 91人人看| 久久后入制服| 人人操人人插 - 百度 - 百度| 一区二区影院| 日韩99神马视频播放片在线播放| 久久久国产精品亚洲精品| 大逼色网站| 91东京热男人的天堂| 日韩精品中文字幕二区| 天天综合欧美综合| 综合亚洲网| 欧洲亚洲国产综合在线| 五月综合视频| 久久美国毛片| 日韩一级性爱无码| 玖玖在线视频| 青青草久久在线| 在线视频 亚洲精品| 色综合超碰超| 日本黄大片在线观看视频| 无码抄逼网| 2019天天操天天爽天天拍| www欧美91| 丝袜熟女一区二区三区| 欧美亚洲一区二区久久久婷精品大包诱| 骚妻少妇精品性色无码四色A V| 91精品人妻偷情| 调教熟妇 久久久久久| 欧美体内射精| 岛国色情视频在线观看| xxx亚洲午夜天堂| 天天综合色图| 婷婷五月天激情小说| 超碰无码五月97| 国产精品久久久久久久久久梁医生| 九九在线精品| 天天欲望网| 日韩性爱高清免费视频| 色婷婷一区二区三区久久午夜| 日韩 国产 欧美自拍| 激情婷婷五月天| 99色热| 亚洲av乱伦色图网站| 久久久久921| 大黄片做爱的大的| 99RE在线视频精品,这里只有精品| 久久精品国产Aⅴ| 色五91| 亚洲综合第一页| 色老汉玖玖爱| yiqicaoav| 91亚·色| 国产成人91一区二区三区| 亚洲欧美一区二区三区在钱蜜桃| 777超碰| 欧美熟爽综合| 精品人妻一区二区三区四区石在线 | 日本免费不卡二区| 天天干人人看综合| 91视频成人福利网站在线一区 | 色大师网站www永久网站视频| 一区二区免费电影久久| av无线看| 97国产精品久久久久 | 久久久月天| 日韩AV一区二区三区四四| 精品一区二区三区麻豆| 久久色一区| 操婢日韩| 欧美日韩妖精91com| 天天干天天干天天| 日韩成人无码| A男人的天堂| 亚洲AV成人无码一区二区三区在线观看| 青青草原成人| 久久久影院| 国产一进一出视频网站| av日韩中文字幕| 91蜜臀熟女| 人人艹亚洲| 欧美,日韩,中文,另类| 少妇超碰在线| 黄片qw| 国产97综合| 91亚州日韩高清| 中国一级操逼视频| 大香蕉日韩| 午夜欧美神马久久久久| 午夜黄色免费在线观看| 天天噜| 一二三四视频在线社区中文字幕| 婷婷久久综合久| 激情黄色片在线观看| 熟女久久久| www.四虎在线| 亚洲一区二区三区AV无码| 亚洲区 欧美区| 伊人国产视频| 婷婷色综合| 黑人白女精品一区| 国产精品播放| 97丝袜亚洲在线播放| 男人兔费天堂| 思思性爱| 26uuu欧美日韩| 天天综合青苹果| 大乔未久88一区| http://qxhbdz.com| 国产九九九九九九九九| 操b在线观看| 成人三级片一区二区三区视频| 久久透逼视频| 97超碰中文在线| 久男人久久| AV一二区| 天天欧美色| 女人高潮抽搐喷水视频网站| 99精品欧美一区二区三区桃色| 九九九精品美女| 久热99999| 亚洲AV无码久久精品蜜桃小说| 黄污污污污| 亚洲精品日韩国产欧美| 95自拍视频在线观看| 老司机福利青青草| 久久久久久九| 青青草这里只有精品| 狠狠躁天天躁日日躁97| 青青草在线视频欧美| 欧美九九爱| 中文字幕在线播放2中文字幕在线观看2 | 97天天爽| 伊人AAA| 婷婷亚洲天堂| 日本一级一级一级一级| 欧美成人性爱视频大全| 久久高清欧美国产| 思思热在线cao| 国产精品点击进入在线影院| 男女猛烈无遮掩视频免费软件| 屁股久久久久久久久久| 97 色综合| 亚州色综合| 综合欧美亚洲| 激情小说在线视频| 丝袜亚洲综合| 国产 日韩 欧美一区| 另类天堂| 成人无遮挡毛片免费看| 高清无码一区二区三区| 乱伦a片视频| 国产一级不卡在线观看| 操我无码| 曰韩av中文字幕专区| 亚洲AV永久无码一区仙野| www.色婷婷色综合| 国产精品老师| 蜜桃色色网站视频三区| 国产av白丝| 热久久99999| 人妻激情在线视频| 中文字幕国产| 天天日老熟妇| 熟妇亚洲一区二区三区| 爱爱动态试试看6 0秒| 国产乱码精品久久久久久| 加勒比人妻综合| 91蜜桃传媒精品久久久一区二区| 99少妇| 精品人妻一二三| 香伊人在线| 五月婷婷大香蕉| 亚洲和欧美裸体美女双飞视频| 激情综合av| 91九九九吃| 夜夜夜夜久久久久| 曰韩中文人妻视频| 噜噜噜在线视频| 色综合九九| 国产视频一区二区在线| 国产久久一区二区| 综合网亚洲在线| 亚洲āv网址在线观看| 一区操逼日比视频| 夜夜爽33333| 伊人991| 久操免费观看| 九九干| 综合网欧美在线| 亚洲 另类 丝袜 自拍 动漫| 日韩九九九| 亚洲自拍天堂| 女优视频第10页| 330dv亚洲成年视频网| 日韩图色| 日本国产高清色www视频在线| 大香蕉宗合网在线| 超碰97久久国| 久久成年片色大黄全免费网站| 黑人无码一区二区| 伊人大香蕉在线| 亚洲另类色综合网站| 国产丝袜欧美在线视频| 996热| 亚洲综合九| 1769成人国产精品视频| 丁香六月婷婷综合| 欧美综合 站| 性无码专区2020| 天天爽人人综合免费7799| 男插女青青影院| 色臀av| 五月天开心网| 日韩专区久久久| 伊人久久综合影院| 亚洲AV资源| 99av| 黄网在线播放| 肉丝中文无码高清| 探花一区二区三| 大香蕉欧美伊| 国产操逼网站亚洲一级黄色| 97人人干| julia国产在线| 人人插人人搞人人操| 黑人精品久久97| 久久精品国产99精品亚洲蜜...| 97爱爱爱综合| 精品午夜福利| 男人天堂婷婷五月天校园春色| 东京男人天堂| 日本岛国黄色网址| 久热精品在线| 五月丁香啪啪网| 亚洲性刺激| 五月丁香综合| 久草免费在线视频| 九九久久九九久久| 特色a在线上| 91天天日| 超碰在线人妻中文字幕| 91色综合激情| 成人av影院在线观看| 一区二区 电影 亚洲| 天天视频网站黄| 97爱b| 国产极品美女高潮无套在线观看| 亚拍在线| 日韩不卡av一二三| 少妇高潮九九九九九九九| 五月婷丁香| 欧美裸体美女日麻屄| 日本不卡高清免v欧美日韩在线观看| 欧美爱爱97| 高树玛利亚无码流出| 免费1级a做爰片观看| 久久久久密臀视频| 中文字幕在线观看二区三区| 熟妇人妻精品一区二区| 性色一线| 一区二区免费电影久久| 日韩一级二级三级免费看完整版国语版 | AV丝袜东京热| 国产小u女在线观看| 天美麻豆一区二区三区| 97亚洲综合电影| gogogo免费高清看中国国语| 中文字幕AV片| 狠狠色婷婷777| www.av家庭乱伦| 精品久久大胆人体| 超碰碰碰碰| 国产精品久久久久久亚洲色欲| 中文一区在线日| 一级黄色影片| 狠狠久久手机视频精品| 国产一| 欧美日韩超碰在线| 亚洲欧美自拍偷拍| 视频二区美腿制服人妻欧美| 嗯嗯嗯啊啊啊操的我好爽| 国产操逼逼网| 国产精品香蕉| 亚洲综合大片| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 国产精品久久久久久久久久久久久久吹 | 一起草精品人妻| 92一区二区| 97视频在线视频| 精品久久青青草| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 亚洲本色精品一区二区久久| 国产一区二区久久| 67914亚洲精品| 日韩人成网站在线播放| 欧美亚洲中文| 成人资源中文字幕在线观看| 国产夜夜艹| 色婷婷综合网站| 麻花豆传媒剧国产MV出差| 伊人超碰97| 亚洲AV不卡在线观看| 日韩AV一区二区三区三州三州| 日本123区操B视频| 亚洲欧洲综合av在线| 欧美色涩| 婷婷10月天青娱乐| 91在线/欧洲| 欧美一级欧美三级在线观看| www.色婷婷.com| 国产亚州高清国产拍精| 久久久久久99AV无码免费网站| 人人妻人人爽人人精品| 精品久久艹| 在线视频五十市| 精品免费一区二区三区在线亚洲人成| 国产超碰人人操| 美女国产一区二区久久| 伦激情人妻另类人妻| 91人妻少妇| 久久αⅴ| 亚洲天堂资源在线| 欧美色图亚洲色,麻豆| 久久99草| 欧美亚洲美少妇一区二区| 精品少妇后入一区二区三区四区人妻巨乳| 欧亚性爱啪啪| 黄片色区软件| 乱伦图av| 国产一区二区精品久久99| 欧美性爱18观看| 思思热在线视频在线| 色综合加勒比| 69天堂| 97免费视频在线观看| 超碰美国| 屁股久久久久久| 男人天堂网址| 日产操逼| AV乱伦专区| 一级婬片120分钟试看| 88xx成人精品视频| 欧美精品69性爱| 日韩熟女操逼| 少妇无码av专区线| 亚洲 自拍偷拍 欧美| 久久久久亚洲?V片无码V| 岛国激情视频在线观看| 变态乱伦伪娘灌肠一区二区| 免费无码国产精品v片在线观看| 变态乱伦伪娘灌肠一区二区| 日本操大逼| 黄色av一区二区在线| 亚洲成人久久美女| 女优免费一区二区永久| 久久久久久亚洲精品中文字幕人妻| 无码99| 精品人妻视频一区二区三区蜜桃视频| 欧美少妇性乱| 黑人干亚洲| 日日骚一区二区三区| 国产女人视频三四五区| 黄色视频高清无码网站| 国产精品久久久久久久AV大片| 久操网址| 五月婷婷激情网| 国产精品91一样| 西西美女视频网| 少妇激情AV| 97精品免费视频网站| 久久精品午夜国产亚洲AV无码| 国产精品色色| 性爱Av免费| 强奸乱伦中文字幕AV| 国产精品自在自拍视频| 超碰av在线| 高清不卡视频| 久热大香蕉网站| 干B网| 97色伦97色伦国产欧美| 操逼操逼视频操逼| 激情五月激情综合网| 中美日韩毛片| 四虎免费视频| 国产精品不卡高清在线观看| 欧美aaaaaaa| 99爱在线视频| 欧美亚洲se91| 97超碰欧美手机| 欧美一级特黄淫片在线观看| 97干在线| 伦在线97| 亚洲综合九九| 丁香六月东京热| 青青草久久一区网| 78m成人视线| 国产欧美精选自拍一区| 五月丁香综合| 物业黑人 AV一区| 亚洲AV无码秘 蜜桃臀国精产品| 中文字幕黄色一起草| 综合网91| 精品一二三区久久AAA片| 亚洲情色一区综合| 天天干天天操天天操夜夜操天天操| 丁香九月激情啪| 亚洲精品国产熟女久久久| 超碰97护士| 久久亚洲不卡| 四虎AV在线播放| 亚洲综合一区二区| 神马久久69| 无码精品久久久天天影视| 亚洲精品97在线| av网站免费看| 夜夜爽77777| 大香蕉中文201| 噜噜噜久久亚洲精品色情| 亚洲高清无毛一区二区| 精品一区二区三区蜜桃臀赵总| 精品国产乱码久久久久久日本公司| 色欲三区| 日本男人插女人的逼黄色| 麻豆视频国产一区二区| 日韩偷拍色图| 小说区 图片区色 综合区| 精品人妻一区二区视频| 国产一区二区三区精品观看啪| 中文久久96| 久久一级无码精品毛片6| 职场同事知名国产国产精品久久欧美日韩 | 884t在线| 久久受www免费人成| 青青草无码视频| av国产无码| 国产精品精品系列在线观看| 少妇一区二区三区在线观看| 人人贴人人摸| 欧日韩一二三f区| 精品久久久久久亚洲| 国产JDAV无码视频在线观看| 亚洲 欧美 小说| 不卡免费av在线播放 | 97av,com| 精品福利视频| 狼狼色丁香久久婷婷综合五月| 久久久久久99999国产精品| 一区二区偷拍拍视频| 黄色大香焦1级‘′‘| 欧美日韩97| 干少妇视频| 国产精品久久泡妞网站| 欧美色日| 久久久久9999妇女| 色月天AV导航| 婷婷六月天| 欧美性爱另类综合| 成人午夜小视频手机在线看| 欧美不卡在线一区二区| 亚洲av青草久久一区二区| 91美女精品| 超碰在线免费一区二区三区| 韩国毛片一区二区三区| 精品一二三区女同| 日本中文字幕一区| 国产一区二区三区,在线观看观看| 亚洲熟妇乱女区二区三区| 五月综合视频| 亚洲天天艹| 天天综合影院91| 亚洲成人精品久久久| 欧美久久婷婷| 亚洲伊人久久精品影院| 久久99草| 欧美色蜜桃97| 亚洲欧美小说| 午夜超爽| 久久 国产精品 一区| 人人摸人人干| 少妇99成人麻豆| 精品999日本| 欧美后入式| 加勒比综合| 做爱A级亚欧| 99精彩视频| 97爱亚洲综合色| 呻吟 欧美 日本 中出| 精品国产乱码久久久| 精品综合久久久久久五月天| 美女操逼A A| 欧美精品999| 亚洲视频,小说| 日韩欧美女求操每天更新| AV一起草在线| 亚洲精品99| 欧美洲精品一级| 操国产逼| 欧美色婷婷| www.acm成人黄色毛片| 蜜臀va69| 成人av在线播放| 亚洲少妇喷视频看| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 秋霞福利网| 97超碰中文在线| 999岛国大片| 午夜精品久久999热蜜桃介男人用| 精品一区二区三区蜜桃| 久久久久久人妻一区精品色欧美| 国产自偷自拍一区| 日韩97精| 日本操逼视频不卡直接放| 婷婷色播婷婷| 劲爆欧美人妖三区91| 亚洲日韩在线a不卡99精品| 国产亚洲99久久精品| 亚洲骚男同com| aaaa少妇高潮大片| 久久久久久波多野吉衣高潮| 精品人妻一区二区三区在| 色九九综合| 蜜臀久久99精品久久久久久-DVD | 黄色一级视| 久久久96| 日韩无码专区| 九九九久久久W精品| 91 刺激在线| 2024年最新色情网站在线观看 | 欧美国产有色电影| 色欲蜜臀AV| 蜜臀AV一区二区三区| 中文字幕一区二区三区人妻少妇在线| 大JI巴好深好爽又大又粗视频| 97玖玖人妻| 激情网色| 欧美综合网在线| 狠狠躁天天躁日日躁97| 3p国产欧美99热| 一起草三级AV电影在线观看| julia中文字幕在线观看| 自拍鲍鱼一区在线高清观看免费| 91天天综合日韩欧美| 欧美亚洲国产日本在线,久久精品国产| 中文字幕亚韩| 国产精品不卡av免费在线观看| 在线小视频| 欧美最婬乱婬爆婬性视频| 免费黄色A片| 91精品微拍福利| 97视频播放| 国产诱惑| 97色妞| 亚洲最大黄网| 六月婷婷综合| 亚洲人妻AV| 久久直播国产| 国产精品午夜福利亚洲综合网| 熟妇女人妻呻吟久久AV| 日日干日日| 天天操天天舔| 天天躁日日躁xxxxx| 超碰在线欧美性爱激情| 伊人网高清| 欧美在线91| 天天噜| 人人操,人人液| 日日爱99|