精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

5 分鐘快速上手 Pytest 測試框架

開發(fā) 架構(gòu)
本次內(nèi)容主要簡單介紹了一下 pytest 概念及其核心特性,我們可以看到 pytest 在測試部分是多么易用。pytest 特性和使用示例遠遠不止于此,官方文檔已經(jīng)足夠全面,感興趣的朋友可以進一步深入了解。

[[393259]]

 本文將會把關(guān)于 Pytest 的內(nèi)容分上下兩篇,上篇主要涉及關(guān)于 pytest 概念以及功能組件知識的介紹,下篇主要以一個 Web 項目來將 Pytest 運用實踐中。

為什么要做單元測試

相信很多 Python 使用者都會有這么一個經(jīng)歷,為了測試某個模塊或者某個函數(shù)是否輸出自己預(yù)期的結(jié)果,往往會對產(chǎn)出結(jié)果的部分使用 print() 函數(shù)將其打印輸出到控制臺上。

  1. def myfunc(*args, **kwargs): 
  2.     do_something() 
  3.     data = ... 
  4.     print(data) 

在一次次改進過程中會不得不經(jīng)常性地使用 print() 函數(shù)來確保結(jié)果的準確性,但同時,也由于要測試的模塊或者函數(shù)變多,代碼中也會逐漸遺留著各種未被去掉或注釋的 print() 調(diào)用,讓整個代碼變得不是那么簡潔得體。

在編程中往往會存在「單元測試」這么一個概念,即指對軟件中的最小可測試單元進行檢查和驗證。這個最小可測單元可以是我們的表達式、函數(shù)、類、模塊、包中的任意一種或組合,因此我們可以將使用 print() 進行測試的步驟統(tǒng)一地放到單元測試中來進行。

在 Python 中官方早已經(jīng)為我們內(nèi)置好了用以進行單元測試的模塊 unittest。但對于新手來說,unittest 在學習曲線上是稍微有點難度的,因為是需要通過繼承測試用例類(TestCase)來進行封裝,所以需要對面向?qū)ο蟮闹R有足夠多的了解;而和類綁定在一起就意味著如果想要實現(xiàn)定制化或者模塊解耦,可能就需要多花一些時間在設(shè)計劃分上。

所以,為了能讓測試變得簡單且具備可擴展性,一個名為 pytest 的測試框架在 Python 社區(qū)中誕生了,使用 pytest 我們可以不用考慮如何基于 TestCase 來實現(xiàn)我們的測試,我們只需要簡單到保持我們原有的代碼邏輯不變,外加一個 assert 關(guān)鍵字來斷言結(jié)果,剩下的部分 pytest 會幫我們處理。

  1. # main.py 
  2.  
  3. import pytest 
  4.  
  5. raw_data = read_data(...) 
  6.  
  7. def test_myfunc(*args, **kwargs): 
  8.     do_something() 
  9.     data = ... 
  10.     assert data == raw_data 
  11.  
  12. if __name__ == '__main__'
  13.     pytest.main() 

之后我們只需要運行包含上述代碼的 main.py 文件,就能在終端控制臺上看到 pytest 為我們測試得到的結(jié)果。如果結(jié)果通過,則不會有過多的信息顯示,如果測試失敗,則會拋出錯誤信息并告知運行時 data 里的內(nèi)容是什么。

盡管說 pytest 已經(jīng)足夠簡單,但它也提供了許多實用的功能(如:依賴注入),這些功能本身是存在著一些概念層面的知識;但這并不意味著勸退想要使用 pytest 來測試自己代碼的人,而是讓我們擁有更多的選擇,因此只有對 pytest 的這些功能及其概念有了更好地了解,我們才能夠充分發(fā)揮 pytest 的威力。

快速實現(xiàn)你的第一個 Pytest 測試

通過 pip install pytest 安裝 pytest 之后,我們就可以快速實現(xiàn)我們的第一個測試。

首先我們可以任意新建一個 Python 文件,這里我直接以 test_main.py 命名,然后當中留存如下內(nèi)容:

  1. from typing import Union 
  2.  
  3. import pytest 
  4.  
  5. def add
  6.     x: Union[intfloat],  
  7.     y: Union[intfloat], 
  8. ) -> Union[intfloat]: 
  9.     return x + y 
  10.  
  11. @pytest.mark.parametrize( 
  12.     argnames="x,y,result",  
  13.     argvalues=[ 
  14.         (1,1,2), 
  15.         (2,4,6), 
  16.         (3.3,3,6.3), 
  17.     ] 
  18. def test_add( 
  19.     x: Union[intfloat],  
  20.     y: Union[intfloat], 
  21.     result: Union[intfloat], 
  22. ): 
  23.     assert add(x, y) == result 

之后將終端切換到該文件所處路徑下,然后運行 pytest -v,就會看到 pytest 已經(jīng)幫我們將待測試的參數(shù)傳入到測試函數(shù)中,并實現(xiàn)對應(yīng)的結(jié)果:

可以看到我們無需重復(fù)地用 for 循環(huán)傳參,并且還能直觀地從結(jié)果中看到每次測試中傳入?yún)?shù)的具體數(shù)值是怎樣。這里我們只通過 pytest 提供的 mark.parametrize 裝飾器就搞定了。也說明 pytest 的上手程度是比較容易的,只不過我們需要稍微了解一下這個框架中的一些概念。

Pytest 概念與用法

命名

如果需要 pytest 對你的代碼進行測試,首先我們需要將待測試的函數(shù)、類、方法、模塊甚至是代碼文件,默認都是以 test_* 開頭或是以 *_test 結(jié)尾,這是為了遵守標準的測試約定。如果我們將前面快速上手的例子文件名中的 test_ 去掉,就會發(fā)現(xiàn) pytest 沒有收集到對應(yīng)的測試用例。

當然我們也可以在 pytest 的配置文件中修改不同的前綴或后綴名,就像官方給出的示例這樣:

  1. # content of pytest.ini 
  2. # Example 1: have pytest look for "check" instead of "test" 
  3. [pytest] 
  4. python_files = check_*.py 
  5. python_classes = Check 
  6. python_functions = *_check 

但通常情況下我們使用默認的 test 前后綴即可。如果我們只想挑選特定的測試用例或者只對特定模塊下的模塊進測試,那么我們可以在命令行中通過雙冒號的形式進行指定,就像這樣:

  1. pytest test.py::test_demo 
  2. pytest test.py::TestDemo::test_demo 

標記(mark)

在 pytest 中,mark 標記是一個十分好用的功能,通過標記的裝飾器來裝飾我們的待測試對象,讓 pytest 在測試時會根據(jù) mark 的功能對我們的函數(shù)進行相應(yīng)的操作。

官方本身提供了一些預(yù)置的 mark 功能,我們只挑常用的說。

參數(shù)測試:pytest.parametrize

正如前面的示例以及它的命名意思一樣,mark.parametrize 主要就是用于我們想傳遞不同參數(shù)或不同組合的參數(shù)到一個待測試對象上的這種場景。

正如我們前面的 test_add() 示例一樣,分別測試了:

  • 當 x=1 且 y=1 時,結(jié)果是否為 result=2 的情況
  • 當 x=2 且 y=4 時,結(jié)果是否為 result=6 的情況
  • 當 x=3.3 且 y=3 時,結(jié)果是否為 result=6.3 的情況
  • ……

我們也可以將參數(shù)堆疊起來進行組合,但效果也是類似:

  1. import pytest 
  2.  
  3. @pytest.mark.parametrize("x", [0, 1]) 
  4. @pytest.mark.parametrize("y", [2, 3]) 
  5. @pytest.mark.parametrize("result", [2, 4]) 
  6. def test_add(x, y, result): 
  7.     assert add(x,y) == result 

當然如果我們有足夠多的參數(shù),只要寫進了 parametrize 中,pytest 依舊能幫我們把所有情況都給測試一遍。這樣我們就再也不用寫多余的代碼。

但需要注意的是,parametrize 和我們后面將要講到的一個重要的概念 fixture 會有一些差異:前者主要是模擬不同參數(shù)下時待測對象會輸出怎樣的結(jié)果,而后者是在固定參數(shù)或數(shù)據(jù)的情況下,去測試會得到怎樣的結(jié)果。

跳過測試

有些情況下我們的代碼包含了針對不同情況、版本或兼容性的部分,那么這些代碼通常只有在符合了特定條件下可能才適用,否則執(zhí)行就會有問題,但產(chǎn)生的這個問題的原因不在于代碼邏輯,而是因為系統(tǒng)或版本信息所導(dǎo)致,那如果此時作為用例測試或測試失敗顯然不合理。比如我針對 Python 3.3 版本寫了一個兼容性的函數(shù),add(),但當版本大于 Python 3.3 時使用必然會出現(xiàn)問題。

因此為了適應(yīng)這種情況 pytest 就提供了 mark.skip 和 mark.skipif 兩個標記,當然后者用的更多一些。

  1. import pytest 
  2. import sys 
  3.  
  4. @pytest.mark.skipif(sys.version_info >= (3,3)) 
  5. def test_add(x, y, result): 
  6.     assert add(x,y) == result 

所以當我們加上這一標記之后,每次在測試用例之前使用 sys 模塊判斷 Python 解釋器的版本是否大于 3.3,大于則會自動跳過。

預(yù)期異常

代碼只要是人寫的必然會存在不可避免的 BUG,當然有一些 BUG 我們作為寫代碼的人是可以預(yù)期得到的,這類特殊的 BUG 通常也叫異常(Exception)。比如我們有一個除法函數(shù):

  1. def div(x, y): 
  2.     return x / y 

但根據(jù)我們的運算法則可以知道,除數(shù)不能為 0;因此如果我們傳遞 y=0 時,必然會引發(fā) ZeroDivisionError 異常。所以通常的做法要么就用 try...exception 來捕獲異常,并且拋出對應(yīng)的報錯信息(我們也可以使用 if 語句進行條件判斷,最后也同樣是拋出報錯):

  1. def div(x, y): 
  2.     try: 
  3.         return x/y 
  4.     except ZeroDivisionError: 
  5.         raise ValueError("y 不能為 0"

因此,此時在測試過程中,如果我們想測試異常斷言是否能被正確拋出,此時就可以使用 pytest 提供的 raises() 方法:

  1. import pytest 
  2.  
  3. @pytest.mark.parametrize("x", [1]) 
  4. @pytest.mark.parametrize("y", [0]) 
  5. def test_div(x, y): 
  6.     with pytest.raises(ValueError): 
  7.         div(x, y) 

這里需要注意,我們需要斷言捕獲的是引發(fā) ZeroDivisionError 后我們自己指定拋出的 ValueError,而非前者。當然我們可以使用另外一個標記化的方法(pytest.mark.xfail)來和 pytest.mark.parametrize 相結(jié)合:

  1. @pytest.mark.parametrize( 
  2.     "x,y,result",  
  3.     [ 
  4.         pytest.param(1,0, None, marks=pytest.mark.xfail(raises=(ValueError))), 
  5.     ] 
  6. def test_div_with_xfail(x, y, result): 
  7.     assert div(x,y) == result 

這樣測試過程中會直接標記出失敗的部分。

Fixture

在 pytest 的眾多特性中,最令人感到驚艷的就是 fixture。關(guān)于 fixture 的翻譯大部分人都直接將其直譯為了「夾具」一詞,但如果你有了解過 Java Spring 框架的 那么你在實際使用中你就會更容易將其理解為 IoC 容器類似的東西,但我自己認為它叫「載具」或許更合適。

因為通常情況下都是 fixture 的作用往往就是為我們的測試用例提供一個固定的、可被自由拆裝的通用對象,本身就像容器一樣承載了一些東西在里面;讓我們使用它進行我們的單元測試時,pytest 會自動向載具中注入對應(yīng)的對象。

這里我稍微模擬了一下我們在使用使用數(shù)據(jù)庫時的情況。通常我們會通過一個數(shù)據(jù)庫類創(chuàng)建一下數(shù)據(jù)庫對象,然后使用前先進行連接 connect(),接著進行操作,最后使用完之后斷開連接 close() 以釋放資源。

  1. # test_fixture.py 
  2.  
  3. import pytest 
  4.  
  5. class Database(object): 
  6.  
  7.     def __init__(self, database): 
  8.         self.database = database 
  9.      
  10.     def connect(self): 
  11.         print(f"\n{self.database} database has been connected\n"
  12.  
  13.     def close(self): 
  14.         print(f"\n{self.database} database has been closed\n"
  15.  
  16.     def add(self, data): 
  17.         print(f"`{data}` has been add to database."
  18.         return True 
  19.  
  20. @pytest.fixture 
  21. def myclient(): 
  22.     db = Database("mysql"
  23.     db.connect() 
  24.     yield db 
  25.     db.close() 
  26.  
  27. def test_foo(myclient): 
  28.     assert myclient.add(1) == True 

在這段代碼中,實現(xiàn)載具的關(guān)鍵是 @pytest.fixture 這一行裝飾器代碼,通過該裝飾器我們可以直接使用一個帶有資源的函數(shù)將其作為我們的載具,在使用時將函數(shù)的簽名(即命名)作為參數(shù)傳入到我們的測試用例中,在運行測試時 pytest 則會自動幫助我們進行注入。

在注入的過程中 pytest 會幫我們執(zhí)行 myclient() 中 db 對象的 connect() 方法調(diào)用模擬數(shù)據(jù)庫連接的方法,在測試完成之后會再次幫我們調(diào)用 close() 方法釋放資源。

pytest 的 fixture 機制是一個讓我們能實現(xiàn)復(fù)雜測試的關(guān)鍵,試想我們以后只需要寫好一個帶有測試數(shù)據(jù)的 fixture,就可以在不同的模塊、函數(shù)或者方法中多次使用,真正做到「一次生成,處處使用」。

當然 pytest 給我們提供了可調(diào)節(jié)載具作用域(scope)的情況,從小到大依次是:

  • function:函數(shù)作用域(默認)
  • class:類作用域
  • module:模塊作用域
  • package:包作用域
  • session:會話作用域

載具會隨著作用域的生命周期而誕生、銷毀。所以如果我們希望創(chuàng)建的載具作用域范圍增加,就可以在 @pytest.fixture() 中多增加一個 scope 參數(shù),從而提升載具作用的范圍。

雖然 pytest 官方為我們提供了一些內(nèi)置的通用載具,但通常情況下我們自己自定義的載具會更多一些。所以我們都可以將其放到一個名為 conftest.py 文件中進行統(tǒng)一管理:

  1. # conftest.py 
  2.  
  3. import pytest 
  4.  
  5. class Database
  6.     def __init__(self, database): 
  7.         self.database:str = database 
  8.      
  9.     def connect(self): 
  10.         print(f"\n{self.database} database has been connected\n"
  11.  
  12.     def close(self): 
  13.         print(f"\n{self.database} database has been closed\n"
  14.  
  15.     def add(self, data): 
  16.         print(f"\n`{data}` has been add to database."
  17.         return True 
  18.  
  19. @pytest.fixture(scope="package"
  20. def myclient(): 
  21.     db = Database("mysql"
  22.     db.connect() 
  23.     yield db 
  24.     db.close() 

因為我們聲明了作用域為同一個包,那么在同一個包下我們再將前面的 test_add() 測試部分稍微修改一下,無需顯式導(dǎo)入 myclient 載具就可以直接注入并使用:

  1. from typing import Union 
  2.  
  3. import pytest 
  4.  
  5. def add
  6.     x: Union[intfloat],  
  7.     y: Union[intfloat], 
  8. ) -> Union[intfloat]: 
  9.     return x + y 
  10.  
  11. @pytest.mark.parametrize( 
  12.     argnames="x,y,result",  
  13.     argvalues=[ 
  14.         (1,1,2), 
  15.         (2,4,6), 
  16.     ] 
  17. def test_add( 
  18.     x: Union[intfloat],  
  19.     y: Union[intfloat], 
  20.     result: Union[intfloat], 
  21.     myclient 
  22. ): 
  23.     assert myclient.add(x) == True 
  24.     assert add(x, y) == result 

之后運行 pytest -vs 即可看到輸出的結(jié)果:

Pytest 擴展

對于每個使用框架的人都知道,框架生態(tài)的好壞會間接影響框架的發(fā)展(比如 Django 和 Flask)。而 pytest 預(yù)留了足夠多的擴展空間,加之許多易用的特性,也讓使用 pytest 存在了眾多插件或第三方擴展的可能。

根據(jù)官方插件列表所統(tǒng)計,目前 pytest 有多大 850 個左右的插件或第三方擴展,我們可以在 pytest 官方的 Reference 中找到 Plugin List 這一頁面查看,這里我主要只挑兩個和我們下一章實踐相關(guān)的插件:

相關(guān)插件我們可以根據(jù)需要然后通過 pip 命令安裝即可,最后使用只需要簡單的參照插件的使用文檔編寫相應(yīng)的部分,最后啟動 pytest 測試即可。

pytest-xdist

pytest-xdist 是一個由 pytest 團隊維護,并能讓我們進行并行測試以提高我們測試效率的 pytest 插件,因為如果我們的項目是有一定規(guī)模,那么測試的部分必然會很多。而由于 pytest 收集測試用例時是以一種同步的方式進行,因此無法充分利用到多核。

因此通過 pytest-xdist 我們就能大大加快每輪測試的速度。當然我們只需要在啟動 pytest 測試時加上 -n 參數(shù)即可,其中的 CPU 數(shù)量可以直接用 auto 代替,它會自動幫你調(diào)整 pytest 測試所使用的 CPU 核心數(shù):

pytest-asyncio

pytest-asycnio 是一個讓 pytest 能夠測試異步函數(shù)或方法的擴展插件,同樣是由 pytest 官方維護。由于目前大部分的異步框架或庫往往都是會基于 Python 官方的 asyncio 來實現(xiàn),因此 pytest-asyncio 可以進一步在測試用例中集成異步測試和異步載具。

我們直接在測試的函數(shù)或方法中直接使用 @pytest.mark.asyncio 標記裝飾異步函數(shù)或方法,然后進行測試即可:

  1. import asyncio 
  2.  
  3. import pytest 
  4.  
  5.  
  6. async def foo(): 
  7.      await asyncio.sleep(1) 
  8.      return 1 
  9.  
  10. @pytest.mark.asyncio 
  11. async def test_foo(): 
  12.     r = await foo() 
  13.     assert r == 1 

結(jié)語

本次內(nèi)容主要簡單介紹了一下 pytest 概念及其核心特性,我們可以看到 pytest 在測試部分是多么易用。pytest 特性和使用示例遠遠不止于此,官方文檔已經(jīng)足夠全面,感興趣的朋友可以進一步深入了解。

下一部分內(nèi)容我們將會以 Web 項目為例進一步集成 pytest 進行實踐。

 

責任編輯:武曉燕 來源: Python中文社區(qū)
相關(guān)推薦

2024-05-14 08:49:35

PytestPython測試框架

2020-12-07 11:23:32

Scrapy爬蟲Python

2023-02-16 08:26:41

2025-05-22 10:00:00

DockerRedis容器

2022-02-23 20:38:32

云原生集群Postgres

2020-11-06 08:54:43

Vue 3.0函數(shù)代碼

2022-07-04 09:00:36

Playwright自動化測試工具

2011-07-26 13:58:17

LINQ

2021-07-07 13:52:31

Python JWT接口認證

2022-03-04 16:06:33

數(shù)據(jù)庫HarmonyOS鴻蒙

2022-08-19 07:13:45

SQL方法編程

2021-12-10 08:13:02

MatplotlibpythonAPI

2013-11-19 12:53:33

OA信息化

2022-08-21 07:17:16

LinkerdKubernetes服務(wù)網(wǎng)格

2021-03-23 15:35:36

Adam優(yōu)化語言

2010-05-18 10:17:11

2017-07-05 17:50:52

KotlinJava程序員

2011-07-25 15:42:58

XML

2023-06-13 08:00:57

ChatGPT語言模型

2024-01-29 00:36:50

Backstage設(shè)施工具
點贊
收藏

51CTO技術(shù)棧公眾號

欧美理论片在线播放| 五月天婷婷导航| 国产电影一区二区| 亚洲国产精品欧美一二99| 精品国产福利| 亚洲在线视频播放| 国产精品久久| 日韩国产欧美精品一区二区三区| 色悠悠久久综合网| 性xxxxfjsxxxxx欧美| 久久视频一区二区| 成人信息集中地欧美| 91午夜视频在线观看| 欧美激情777| 日韩电影中文字幕av| 午夜免费看视频| 欧美aaaaa性bbbbb小妇| 亚洲视频免费在线| 欧美视频观看一区| 丁香六月天婷婷| 久久99精品久久久久久国产越南| 91国内产香蕉| 三级全黄做爰视频| 精品国产午夜| 日韩av最新在线观看| 波多野结衣中文字幕在线播放| 欧美xo影院| 午夜精品影院在线观看| 久久国产精品免费观看| 岛国视频免费在线观看| 成人av电影在线观看| 国产精品色婷婷视频| 麻豆成人免费视频| 亚洲黄色三级| 欧美国产精品日韩| 天天看片中文字幕| 亚洲成人最新网站| 色偷偷av亚洲男人的天堂| 精品久久久久久中文字幕人妻最新| 亚洲成人五区| 日韩美一区二区三区| 在线黄色免费看| 国产精品久久久久久久久久齐齐 | 久草视频中文在线| 一区二区三区在线观看免费| 中文在线资源观看视频网站免费不卡 | 欧美一区二区福利| 三级理论午夜在线观看| av中文字幕不卡| 精品处破学生在线二十三| av中文字幕网址| 欧美一级做a| 欧美午夜精品一区二区蜜桃| 少妇高潮喷水久久久久久久久久| av电影院在线看| 亚洲影院在线观看| 污污污污污污www网站免费| av网站在线看| 亚洲一区二区精品视频| 日本香蕉视频在线观看| 国产丝袜在线观看视频| 亚洲国产欧美在线| 国产美女主播在线播放| 国产在线观看www| 日韩欧美精品网站| 成人一级片网站| 久久久一本精品| 欧美性色综合网| 爱爱爱爱免费视频| 中文字幕日韩高清在线| 精品少妇一区二区三区视频免付费| 欧美69精品久久久久久不卡| 99这里只有精品视频| 日韩精品中文字幕一区二区三区| 亚洲精品无码一区二区| 蜜桃久久久久| 国产亚洲日本欧美韩国| 国产人与禽zoz0性伦| 中文字幕日韩欧美精品高清在线| 欧美激情a∨在线视频播放| 中文字幕在线字幕中文| 日韩精品亚洲专区| 91精品久久久久| 亚洲精品久久久久久久久久 | 欧美日免费三级在线| www.成年人| 国产精品视屏| 亚洲性猛交xxxxwww| 一起操在线播放| 99精品免费| 国产精品中文在线| 亚洲乱色熟女一区二区三区| 久久亚洲一区二区三区四区| 一区二区三区欧美在线| 91桃色在线| 亚洲av成人片色在线观看高潮 | 91精品免费观看| 国产女同一区二区| 精品人妻少妇AV无码专区| bt7086福利一区国产| 日韩欧美手机在线| 污网站在线免费看| 91福利在线看| 国产乱国产乱老熟300部视频| 亚洲婷婷丁香| 美女精品视频一区| 无码人妻精品一区二| 国产成人福利片| 日韩一区二区三区资源| 91桃色在线观看| 欧美一区二区三区精品| 伊人网在线视频观看| 欧美性久久久| 成人黄色短视频在线观看| 婷婷久久久久久| 亚洲精品国产精品乱码不99| 宅男噜噜噜66国产免费观看| 久久综合社区| 欧美大肥婆大肥bbbbb| 这里只有精品免费视频| 9色porny自拍视频一区二区| 免费观看国产视频在线| 欧美xxxx网站| 国产亚洲激情视频在线| 日韩欧美视频在线免费观看| 国产麻豆精品一区二区| 一区二区日本| 韩日精品一区| 亚洲欧美国产日韩中文字幕| 日韩成人一区二区三区| 国产裸体歌舞团一区二区| 亚洲精品不卡| 亚洲第一影院| 亚洲伦理中文字幕| 日韩精品视频播放| 成人小视频在线| 国产一区二区三区在线免费| 成人黄色91| 久久精品91久久久久久再现| 这里只有久久精品视频| 国产色综合久久| 国产免费黄色av| 日本午夜精品久久久| 欧美黄色成人网| 成 人 免费 黄 色| 综合亚洲深深色噜噜狠狠网站| 色七七在线观看| 日韩精品欧美激情一区二区| 欧美一级bbbbb性bbbb喷潮片| 少妇av在线播放| 一区二区三区日韩精品| 久草福利在线观看| 国内精品久久久久久久影视蜜臀| 亚洲自拍偷拍色片视频| 中文字幕伦理免费在线视频 | 黄网动漫久久久| 伊人网综合视频| 亚洲一区日韩| 欧美国产视频在线观看| 日本欧美日韩| 色婷婷综合成人av| 国产jzjzjz丝袜老师水多| 一区二区三区在线免费播放| 深夜视频在线观看| 国产日韩欧美一区在线| 欧美一级日本a级v片| 日本中文字幕视频一区| 久久精品久久久久久| 国内老熟妇对白xxxxhd| 亚洲成人午夜影院| 国产精品揄拍100视频| 日本不卡视频在线观看| 中文字幕一区二区三区最新 | 久久国产波多野结衣| 国产成人精品三级麻豆| 国产精品久久中文字幕| 国产欧美日韩免费观看| 成人xvideos免费视频| 在线观看午夜av| 亚洲娇小xxxx欧美娇小| 国产又黄又爽又色| 国产精品乱码妇女bbbb| 性猛交╳xxx乱大交| 麻豆精品网站| 偷拍盗摄高潮叫床对白清晰| 另类春色校园亚洲| 国产精品久久久久久久久久三级 | 日本a级片电影一区二区| 天堂а√在线资源在线| 欧美精品一区二区三区高清aⅴ | av资源在线播放| 奇米一区二区三区| 欧美影院一区| 免费在线欧美黄色| 精品一区二区久久久| 成人av一区二区三区| 欧美国产日韩一二三区| 午夜一区二区三区在线观看| 亚洲成人国产精品| 日韩一区二区三区在线| 日韩av在线导航| 日本猛少妇色xxxxx免费网站| 激情六月婷婷久久| 国产中文字幕免费观看| 一本一道久久a久久精品蜜桃| 久久久久久艹| 久久久久九九精品影院| 国产999视频| 日本小视频在线免费观看| 亚洲片av在线| 秋霞欧美在线观看| 制服丝袜亚洲色图| 国产一级片免费在线观看| 亚洲综合视频在线| 中文字幕求饶的少妇| 国产亚洲精品中文字幕| 91成人在线观看喷潮蘑菇| 毛片av中文字幕一区二区| 欧美色图色综合| 伊人久久大香线蕉av超碰演员| 一区二区三区四区视频在线| 自拍偷拍一区| 精品乱子伦一区二区三区| 试看120秒一区二区三区| 国产日韩欧美电影在线观看| 欧美aaa视频| 欧洲永久精品大片ww免费漫画| 麻豆av在线播放| 久热精品在线视频| 欧美69xxxx| 最近2019年日本中文免费字幕| 人成在线免费视频| 日韩电影中文字幕一区| 少妇人妻一区二区| 亚洲成人精品av| 国产1区在线观看| 欧美成人精精品一区二区频| av男人天堂网| 欧美一区二区久久| 99久久精品无免国产免费| 欧美精品欧美精品系列| 在线视频播放大全| 欧美色综合网站| 中文字幕免费播放| 欧美视频在线观看一区二区| 凹凸精品一区二区三区| 在线免费亚洲电影| 国内av在线播放| 欧美日韩成人激情| 91尤物国产福利在线观看| 欧美狂野另类xxxxoooo| 国产精品毛片久久久久久久av| 欧美日产在线观看| 国产孕妇孕交大片孕| 欧美一区二区精美| 可以免费观看的毛片| 亚洲国产另类 国产精品国产免费| 人妻少妇精品无码专区久久| 日韩av在线网页| 成人午夜影视| 久久精品国产一区| 欧美亚洲系列| 51精品在线观看| 国产一区二区精品调教| 国产日韩精品入口| 亚洲一区二区电影| 久久99精品久久久久久久久久| 竹菊久久久久久久| 亚洲一区在线免费| 欧美日韩网址| 动漫av网站免费观看| 日产国产高清一区二区三区| 99精品视频国产| 成人精品免费看| 国产亚洲精品熟女国产成人| 中文字幕在线不卡| 久久精品性爱视频| 色婷婷激情综合| 国产精品无码免费播放| 精品成人一区二区三区| 久草在线网址| 欧美成人午夜免费视在线看片| a级大胆欧美人体大胆666| 国产精品第七影院| 亚洲精品a区| 欧美日韩电影一区二区三区| 欧美肥老太太性生活| 久久综合久久网| 日本中文一区二区三区| 国产成人av免费观看| 久久综合av免费| 亚洲色图27p| 午夜精品影院在线观看| 国产影视一区二区| 亚洲国产精品视频在线观看| 欧美69xxx| 日产日韩在线亚洲欧美| 久久免费福利| 午夜免费电影一区在线观看| 激情综合亚洲| 2025韩国理伦片在线观看| 成人午夜碰碰视频| 波兰性xxxxx极品hd| 福利视频一区二区| 国产福利第一视频| 中国china体内裑精亚洲片| 91在线超碰| 91中文字幕一区| 欧美亚洲精品在线| 人妻熟妇乱又伦精品视频| 国产在线精品一区二区| 国产一区二区三区精品在线| 亚洲第一久久影院| 国产精品一区二区三区在线免费观看| 国产视频自拍一区| 波多野结衣中文在线| 成人激情在线播放| 欧美少妇xxxx| 久久精品香蕉视频| 波多野结衣精品在线| 欧美 日韩 国产 一区二区三区| 在线这里只有精品| 日韩亚洲视频在线观看| 久久久久国产精品免费| 国产一区二区三区| 中文字幕人成一区| 青娱乐精品在线视频| 成人精品在线观看视频| 午夜亚洲国产au精品一区二区| 91精品国产乱码久久久| 中文字幕日韩av电影| 午夜av成人| 日韩精品大片| 老司机精品视频网站| 黄色国产在线观看| 欧美视频国产精品| 亚洲 欧美 激情 小说 另类| 久久久久久久影院| а√中文在线天堂精品| 男人天堂网站在线| 国产福利电影一区二区三区| 精品国产精品国产精品| 这里只有精品99re| 91精品久久久| av激情久久| 国内精品久久久久久久影视蜜臀| 中文字幕乱妇无码av在线| 亚洲精品国产第一综合99久久| 99国产精品久久久久99打野战| 久久久国产精品免费| 久久影院一区二区三区| 麻豆视频传媒入口| 国产91色综合久久免费分享| 国产在线综合网| 亚洲激情 国产| 免费成人直播| 四虎永久国产精品| 久久99久久精品| 一起操在线播放| 亚洲国产日韩精品在线| 欧美aaaaa性bbbbb小妇| 天堂资源在线亚洲资源| 麻豆国产精品视频| 欧美日韩精品一区二区三区视频播放| 日韩欧美亚洲另类制服综合在线| 精品日韩av| 欧美人xxxxx| 狠狠色狠狠色综合系列| 久久国产在线视频| 亚洲欧美日韩精品| 性欧美video另类hd尤物| 日本aa在线观看| 久久综合久久综合久久综合| 中文字幕+乱码+中文字幕明步| 色阁综合伊人av| 91在线一区| 日本一本二本在线观看| 国产精品久久久久桃色tv| www.xxx国产| 26uuu亚洲国产精品| 久久激情电影| 国内自拍偷拍视频| 色综合 综合色| a天堂中文在线官网在线| 精品国产乱码久久久久久久软件| 久久中文精品| 午夜免费激情视频| 亚洲热线99精品视频| 日日夜夜亚洲| 天天夜碰日日摸日日澡性色av| 中文字幕免费在线观看视频一区| 国产强被迫伦姧在线观看无码| 欧美在线播放视频| 91成人精品视频| 精品少妇一区二区三区免费观| 欧美精品乱码久久久久久按摩| 中文字幕在线官网| 黄色影视在线观看| 国产日产欧美一区| 天天综合天天综合|