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

構建一個可測試的 Go Web 應用

開發 前端
這篇文章中,我們將討論如何設計 Sourcegraph的單元測試,使其簡單易寫,容易維護,運行快速并可以被其他人使用。我們希望這里提到的一些模式有助于其他寫Go web app的人,同時歡迎對于我們測試方法的建議。在開始測試之前,先來看看我們的框架概覽。

幾乎每一個程序員都贊同測試是重要的,但測試以多種方式讓寫測試的人員打退堂鼓。它們可能運行慢,可能使用重復的代碼,可能一次測試得太多導致難以定位測試失敗的根源。

這篇文章中,我們將討論如何設計 Sourcegraph的單元測試,使其簡單易寫,容易維護,運行快速并可以被其他人使用。我們希望這里提到的一些模式有助于其他寫Go web app的人,同時歡迎對于我們測試方法的建議。在開始測試之前,先來看看我們的框架概覽。 

框架

和其他web app一樣,我們的網站有三層:

  • web前端用以服務HTML;

  • HTTP API用以返回JSON; 

  • 數據存儲,運行對數據庫的SQL查詢,返回Go結構體或切片。

當一個用戶請求Sourcegraph的頁面,前端收到HTTP頁面請求,并對API服務器發起一系列HTTP請求。 然后API服務器開始查詢數據存儲, 數據存儲將數據返回給API服務器,然后編碼成 JSON格式,返回給web前端服務器,前端使用Go html/template包將數據顯示并格式化成HTML。

框架圖如下:(更多細節,查看 recap of our Google I/O talk about building a large-scale code search engine in Go.)

 

測試 v0

當我們***次開始構建Sourcegraph,我們以最容易跑起來的方式寫了測試。每一個測試都將進入數據庫對測試API端點發起HTTP GET請求。測試會解析HTTP返回內容并和預期數據進行對比。一個典型的v0測試如下:

  1. func TestListRepositories(t *testing.T) {  
  2.   tests := []struct { url string; insert []interface{}; want []*Repo }{  
  3.     {"/repos", []*Repo{{Name: "foo"}}, []*Repo{{Name: "foo"}}},  
  4.     {"/repos?lang=Go", []*Repo{{Lang: "Python"}}, nil},  
  5.     {"/repos?lang=Go", []*Repo{{Lang: "Go"}}, []*Repo{{Lang: "Go"}}},  
  6.   }  
  7.   db.Connect()  
  8.   s := http.NewServeMux()  
  9.   s.Handle("/", router)  
  10.   for _, test := range tests {  
  11.     func() {  
  12.       req, _ := http.NewRequest("GET", test.url, nil)  
  13.       tx, _ := db.DB.DbMap.Begin()  
  14.       defer tx.Rollback()  
  15.       tx.Insert(test.data...)  
  16.       rw := httptest.NewRecorder()  
  17.       rw.Body = new(bytes.Buffer)  
  18.       s.ServeHTTP(rw, req)  
  19.       var got []*Repo  
  20.       json.NewDecoder(rw.Body).Decode(&got)  
  21.       if !reflect.DeepEqual(got, want) {  
  22.         t.Errorf("%s: got %v, want %v", test.url, got, test.want)  
  23.       }  
  24.     }()  
  25.   }  

一開始這么寫測試簡單易行,但隨著app進化會變得痛苦。 隨著時間推移,我們加入了新特性。更多的特性導致更多的測試,更長的運行時間,延長了我們的dev周期。更多的特性也需要改變和添加新的URL路徑(現在大概有75個),大都相當復雜。 Sourcegraph的每一層內部也變得更加復雜,所以我們想獨立于其他層做測試。

我們在測試當中遇到了一些問題:

1.測試慢,因為他們要和實際的數據庫互動——插入測試用例,發起查詢,回滾每一次測試事務。每一次測試大約運行100毫秒,隨著我們添加更多的測試累加。

2.測試難以重構。測試用字符串寫死了HTTP路徑和查詢的參數,這意味著如果我們想改變一個URL路徑或者查詢參數集,不得不手動更新測試中的URL。這種痛會隨著我們的URL路由復雜度和數量的增長而加劇。

3.有大量的散亂脆弱的樣本代碼。安裝每一個測試要求確保數據庫運行正常并擁有正確的數據。這樣的代碼在多個案例中重復使用,但是差異的足以在安裝代碼中引入bug。我們發現自己花大量的時間調試我們的測試而非實際的app代碼。

4.測試失敗難以診斷。隨著app變得更加復雜,因為每一個測試都訪問三個應用層,測試失敗的根源難以診斷。我們的測試比起單元測試更像是整合測試。

***,我們提出了開發一個公開發行的API客戶端的需求。我們想讓API容易被模仿,以便于我們的API用戶也可以寫出好測的代碼。

高級測試目標:

隨著我們的app演進,我們意識到需要能滿足這些高要求的測試:

  • 目標明確:我們需要單獨測試app的每一層。

  • 全面: 我們app的全部三層都要被測試到。

  • 快速: 測試需要運行的非常快,意味著不再進行數據庫互動。

  • DRY: 盡管我們的app每一層都不同,它們共享了許多通用的數據結構。測試需要利用這一點去消除重復的樣本代碼。

  • 易模仿: API外部用戶應當也可以使用我們的內部測試模式。以我們的API為基礎構建的工程,應當可以容易地寫出良好的測試。 畢竟,我們的web前端不是獨特的——它只是另一個API用戶。

我們如何重建測試

寫良好的、可維護的測試和良好的、可維護的應用代碼是密不可分的。重構應用代碼使我們可以極大地改進我們的測試代碼,這是我們改進測試的步驟。

1. 構建一個Go HTTP API 客戶端

簡化測試的***步是用Go為我們的API寫一個高質量的客戶端。之前,我們的網站是AngularJS app,但是因為我們主要服務靜態內容,我們決定將前端HTML生成移動到服務器。這么做以后,我們的新前端就可以使用Go的API客戶端和API服務器通信。我們的客戶端go-sourcegraph是開源的,go-github庫對它的影響巨大。客戶端代碼(特別是獲取倉庫數據(repository data)的端點代碼)如下:

  1. func NewClient() *Client {  
  2.   c := &Client{BaseURL:DefaultBaseURL}  
  3.   c.Repositories = &repoService{c}  
  4.   return c  
  5. }  
  6.    
  7. type repoService struct{ c *Client }  
  8.    
  9. func (c *repoService) Get(name string) (*Repo, error) {  
  10.     resp, err := http.Get(fmt.Sprintf("%s/api/repos/%s", c.BaseURL, name))  
  11.     if err != nil {  
  12.         return nil, err  
  13.     }  
  14.     defer resp.Body.Close()  
  15.     var repo Repo  
  16.     return &repo, json.NewDecoder(resp.Body).Decode(&repo)  

以前,我們的v0 API測試把大量的URL路徑和構建好的HTTP請求用ad-hoc的方式寫死,現在它們可以使用這個API客戶端構建和發起請求了。

2. 統一HTTP API客戶端和數據倉庫的接口

接下來,我們統一HTTP API和數據倉庫的接口。以前我們的API http.Handlers直接發起SQL查詢。現在我們的API http.Handlers只需要解析http.Request再調用我們的數據倉庫,數據倉庫和HTTP API客戶端實現了一樣的接口。

借鑒上面的HTTP API客戶端(*repoService).Get的方法,我們現在也有了(*repoStore).Get:

  1. func NewDatastore(dbh modl.SqlExecutor) *Datastore {  
  2.   s := &Datastore{dbh: dbh}  
  3.   s.Repositories = &repoStore{s}  
  4.   return s  
  5. }  
  6.    
  7. type repoStore struct{ *Datastore }  
  8.    
  9. func (s *repoStore) Get(name string) (*Repo, error) {  
  10.     var repo *Repo  
  11.     return repo, s.db.Select(&repo, "SELECT * FROM repo WHERE name=$1", name)  

統一這些接口把我們的web app的行為描述放在一個地方,使得它更易理解和推理。而且我們可以在API客戶端和數據倉庫中重用相同的數據類型和參數結構。

3. 集中URL路徑定義

之前,我們不得不在應用的多個層重新定義URL路徑。在API客戶端中,我們的代碼是這樣的

  1. resp, err := http.Get(fmt.Sprintf("%s/api/repos/%s", c.BaseURL, name)) 

這種方式很容易引發錯誤,因為我們有超過75個路徑定義,還有很多是復雜的。集中URL路徑定義意味著從API服務器獨立出來在一個新包中重構路徑。路徑包中聲明了路徑的定義。

  1. const RepoGetRoute = "repo" 
  2.    
  3. func NewAPIRouter() *mux.Router {  
  4.     m := mux.NewRouter()  
  5.     // define the routes  
  6.     m.Path("/api/repos/{Name:.*}").Name(RepoGetRoute)  
  7.     return m  
  8. }  
  9.    
  10. while the http.Handlers were actually mounted in the API server package:  
  11.    
  12. func init() {  
  13.     m := NewAPIRouter()  
  14.     // mount handlers  
  15.     m.Get(RepoGetRoute).HandlerFunc(handleRepoGet)  
  16.     http.Handle("/api/", m)  

 而http.Handlers 實際上在API服務器包中掛載:

  1. func init() {  
  2.     m := NewAPIRouter()  
  3.     // mount handlers  
  4.     m.Get(RepoGetRoute).HandlerFunc(handleRepoGet)  
  5.     http.Handle("/api/", m)  

現在我們可以在API客戶端中使用路徑包生成URL,而不是把它們寫死。(*repoService).Get方法現在如下:

  1. var apiRouter = NewAPIRouter()  
  2.    
  3. func (s *repoService) Get(name string) (*Repo, error) {  
  4.     url, _ := apiRouter.Get(RepoGetRoute).URL("name", name)  
  5.     resp, err := http.Get(s.baseURL + url.String())  
  6.     if err != nil {  
  7.         return nil, err  
  8.     }  
  9.     defer resp.Body.Close()  
  10.    
  11.     var repo []Repo  
  12.     return repo, json.NewDecoder(resp.Body).Decode(&repo)  

4. 創建未統一接口的仿制

我們的v0測試同時測試了路徑、HTTP處理、SQL生成和DB查詢。失敗難以診斷,測試也很慢。

現在,我們擁有每一層的獨立測試并且我們模仿了毗鄰層的功能。因為應用的每一層實現了相同的接口,所以我們可以在所有的三層中使用同樣的仿制接口。

仿制的實現是簡單的模擬函數結構,可以在每一個測試中指明:

  1. type MockRepoService struct {  
  2.     Get_ func(name string) (*Repo, error)  
  3. }  
  4.    
  5. var _ RepoInterface = MockRepoService{}  
  6.    
  7. func (s MockRepoService) Get(name string) (*Repo, error) {  
  8.     if s.Get_ == nil {  
  9.         return nil, nil  
  10.     }  
  11.     return s.Get_(name)  
  12. }  
  13.    
  14. func NewMockClient() *Client { return &Client{&MockRepoService{}} } 

下面是測試中的使用。我們模仿了數據倉庫的RepoService,使用HTTP API客戶端測試API http.Handler。(這段代碼使用了上述所有方法。)

  1. func TestRepoGet(t *testing.T) {  
  2.    setup()  
  3.    defer teardown()  
  4.    
  5.    var fetchedRepo bool  
  6.    mockDatastore.Repo.(*MockRepoService).Get_ = func(name string) (*Repo, error) {  
  7.        if name != "foo" {  
  8.            t.Errorf("want Get %q, got %q""foo", repo.URI)  
  9.        }  
  10.        fetchedRepo = true 
  11.        return &Repo{name}, nil  
  12.    }  
  13.    
  14.    repo, err := mockAPIClient.Repositories.Get("foo")  
  15.    if err != nil { t.Fatal(err) }  
  16.    
  17.    if !fetchedRepo { t.Errorf("!fetchedRepo") }  

高級測試目標回顧

使用上述模式,我們實現了測試目標。我們的代碼是:

  • 目標明確: 一次測試一層。

  • 全面: 三個應用層均被測試。

  • 快速: 測試運行得很快。

  • DRY: 我們合并了三個應用層的通用接口, 在應用代碼和測試中進行了重用。

  • 易模仿: 一個仿制實現在三個應用層中都可以使用,想測試以Sourcegraph為基礎構建的庫的外部API用戶也可以使用。

關于如何重新構建并改進Sourcegraph的測試的故事就講完了。這些模式和例子在我們的環境中運行良好,我們希望這些模式和例子也能幫助到Go社區的其他人,顯而易見的是它們并不是在每一個場景下都是正確的,我們確信還有改進的空間。我們在不斷的嘗試改進做事的方法,所以我們樂意聽到你的建議和反饋——說說你用Go寫測試的經歷吧!

本文來自:http://www.oschina.net/translate/building-a-testable-webapp

責任編輯:林師授 來源: 開源中國社區 編譯
相關推薦

2023-09-15 10:10:05

R 語言

2023-05-10 08:05:41

GoWeb應用

2024-01-02 00:18:56

Buffalo項目Go Web框架

2015-12-04 11:36:04

SaaS架構設計可持續

2022-09-20 08:43:37

Go編程語言Web

2023-09-21 08:00:00

ChatGPT編程工具

2022-04-12 14:00:05

元宇宙人工智能安全

2010-07-12 10:11:27

ibmdwWeb

2021-06-18 06:11:26

工具WebpackSnowpack

2014-02-26 10:14:51

OpenStack測試系統

2021-12-21 06:23:43

TIWAP安全工具滲透測試

2019-07-05 08:39:39

GoSQL解析器

2023-12-26 00:58:53

Web應用Go語言

2011-09-16 17:18:43

iPhone應用TimeSpan

2019-09-29 15:25:13

CockroachDBGoJavaScript

2019-05-08 14:37:49

Web服務器HTTP

2022-02-10 07:03:32

流量應用架構數據交換

2024-01-09 18:00:22

Rust后端slvelte

2014-11-25 14:04:59

DockerDocker Nodeweb應用部署

2014-05-26 09:13:46

DockerPython
點贊
收藏

51CTO技術棧公眾號

日韩大片在线永久免费观看网站| 国产成人免费观看视频| 亚洲国产天堂| 亚洲一区中文日韩| 欧美精品尤物在线| 国产精品国产精品国产专区| 国产精品久久| 在线亚洲国产精品网| 日本天堂在线播放| 成人看片网页| 亚洲综合在线视频| 日韩偷拍一区二区| 亚洲男人天堂久久| 日本成人在线电影网| 欧美大片第1页| 国产人妻大战黑人20p| 麻豆精品在线| 欧美视频在线一区二区三区| 99色这里只有精品| 日韩伦理在线电影| 久久这里只有精品视频网| 亚洲精品免费在线视频| 中文字幕高清在线免费播放| 欧美1区3d| 亚洲一区二区久久久| 亚洲免费观看在线| 四虎精品永久免费| 91福利在线导航| 成人午夜免费在线| 国产福利视频在线| 中文字幕av资源一区| 精品欧美国产一区二区三区不卡| 国产精品乱码久久久| 日韩中文字幕1| 91精品国产91久久久久久| 性欧美疯狂猛交69hd| 一本色道久久综合亚洲精品酒店 | 欧美男人操女人视频| 制服丝袜亚洲色图| 天天干在线影院| 二区三区不卡| 日韩欧美在线中文字幕| 国产日韩欧美精品在线观看| 高h视频在线观看| 日本一区二区成人| 欧美一区少妇| 少妇人妻一区二区| 成人永久看片免费视频天堂| 91老司机在线| 国产精品一级视频| 久久av中文字幕片| 国产九九精品视频| 波多野结衣在线观看视频| 亚洲在线一区| 日本精品在线视频| 国产成人一级片| 一区二区日韩免费看| 亚洲 日韩 国产第一| 久久艹精品视频| 国产精品黄色| 97在线精品国自产拍中文| 日本中文字幕免费观看| 亚洲理论在线| 热久久美女精品天天吊色| 亚洲熟女综合色一区二区三区| 亚洲伊人网站| 国产mv久久久| 中文字幕在线日亚洲9| 久久99国内精品| 亚洲自拍偷拍在线| 亚洲av无码国产精品永久一区| 国产成人一级电影| 激情视频一区二区| 日本在线视频1区| 国产亚洲欧洲一区高清在线观看| 水蜜桃一区二区| 久久黄色美女电影| 亚洲国产日韩综合久久精品| 成人综合视频在线| 国产亚洲精品精品国产亚洲综合| 日韩一卡二卡三卡国产欧美| 国产熟女高潮一区二区三区| 自拍视频一区| 日韩性xxxx爱| 精品无码人妻一区二区三区品 | 殴美一级特黄aaaaaa| 2020国产精品自拍| 伊人av成人| www欧美xxxx| 色哟哟欧美精品| 天天综合天天添夜夜添狠狠添| 91国内精品白嫩初高生| 亚洲欧美成人网| 国产人与禽zoz0性伦| 亚洲黄网站黄| 成人国产精品久久久久久亚洲| 性生活三级视频| 国产夜色精品一区二区av| 欧美 日韩 国产 在线观看| 国产福利在线免费观看| 在线欧美日韩精品| 欧美激情 亚洲| 欧美另类69xxxxx| 欧美激情久久久久| 日本视频www色| 国产精品资源在线| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲 国产 日韩 欧美| 免费在线一区观看| 日韩av电影在线网| 中文在线第一页| 国产乱理伦片在线观看夜一区| 国产精品久久久久久久久久久久冷| 国产区高清在线| 樱桃国产成人精品视频| 成年人免费在线播放| **日韩最新| 亚洲美女又黄又爽在线观看| 情侣偷拍对白清晰饥渴难耐| 激情视频一区| 国产精品成人观看视频国产奇米| 亚洲欧美另类一区| 国产精品少妇自拍| 六月婷婷在线视频| 男女啪啪999亚洲精品| 亚洲国产日韩欧美在线动漫| 91香蕉视频在线播放| 久久久久久久高潮| 国产亚洲精品自在久久| 欧美人xxx| 色综合久久88色综合天天6| 杨幂一区二区国产精品| 欧美丝袜激情| 欧美亚洲日本网站| www.国产三级| 中文字幕在线不卡视频| 日韩av在线播放不卡| 1313精品午夜理伦电影| 日韩在线观看你懂的| 在线观看中文字幕视频| 国产高清不卡一区二区| 亚洲一区3d动漫同人无遮挡| 中文字幕在线直播| 精品国产免费一区二区三区香蕉| 男的操女的网站| 久久国产日韩欧美精品| 欧美激情第一页在线观看| 成人影音在线| 欧美大片免费久久精品三p| 久久久久麻豆v国产| 久久看片网站| 奇米影视首页 狠狠色丁香婷婷久久综合 | av不卡中文字幕| 三区四区不卡| 国产精品9999| 国产在线观看高清视频| 欧美日韩在线亚洲一区蜜芽| av网在线播放| 日韩不卡一区二区| 欧美一二三区| 五月激情久久| 亚洲最新中文字幕| 亚洲av无码精品一区二区| 久久先锋资源网| 三上悠亚久久精品| 日韩aaa久久蜜桃av| 国内精品小视频| 五月婷婷六月激情| 亚洲一区二区在线免费观看视频| 超碰超碰在线观看| 日韩精品永久网址| 91精品久久久久久久久久| 五月天婷婷在线视频| 欧美酷刑日本凌虐凌虐| av黄色免费在线观看| 国产成人精品www牛牛影视| 免费观看亚洲视频| 91夜夜蜜桃臀一区二区三区| 97不卡在线视频| 日韩精品视频在线观看一区二区三区| 欧美性猛交丰臀xxxxx网站| 中文字幕丰满孑伦无码专区| 蜜臀精品一区二区三区在线观看 | 亚洲欧美电影院| 999这里有精品| 亚洲免费播放| 欧美一区免费视频| 爱情电影网av一区二区| 久久成人一区二区| 人妻一区二区三区| 在线视频一区二区免费| 麻豆视频在线观看| 久久综合色播五月| 一区二区三区网址| 欧美日韩亚洲一区| 久久久综合香蕉尹人综合网| 欧美日韩尤物久久| 久久99热精品| 免费观看黄色av| 欧美在线免费视屏| 美国黄色小视频| 97久久精品人人做人人爽| av在线无限看| 欧美性久久久| 在线观看日本一区| 欧美福利在线播放网址导航| 国产精品第1页| 青春草免费在线视频| 亚洲精品在线视频| 国产精品欧美亚洲| 日韩欧美精品免费在线| 疯狂试爱三2浴室激情视频| 波多野结衣中文字幕一区| av网站在线不卡| 亚洲高清自拍| 五月天色一区| 日韩极品在线| 91免费版网站入口| free欧美| 国模私拍视频一区| 精品黄色免费中文电影在线播放| 欧美成人精品1314www| 影音先锋黄色网址| 亚洲精品高清在线| 乱老熟女一区二区三区| 91免费国产视频网站| 麻豆短视频在线观看| 久久国产人妖系列| 久久久久久久久久久久久国产精品| 91精品久久久久久久蜜月| 日韩久久久久久久久久久久久| 99re6热只有精品免费观看| 国产精品久久久久久久久久久久| 黄色在线免费观看网站| 久久6免费高清热精品| 91这里只有精品| 亚洲免费精彩视频| 免费观看的毛片| 亚洲国产成人在线播放| 国产免费久久久| 欧美午夜免费电影| 亚洲日本视频在线观看| 亚洲午夜精品久久久久久久久| 538精品视频| 国产日韩精品久久久| 国产成人无码一区二区在线观看| 豆国产96在线|亚洲| 日本少妇一区二区三区| 激情综合五月婷婷| 中文字幕第36页| 蜜桃av一区二区在线观看| 又色又爽又高潮免费视频国产| 一本色道久久综合| 成人免费aaa| 在线播放一区| 97在线播放视频| 亚洲欧美日韩精品一区二区| 成人性生活视频免费看| 亚洲三级免费| 青青青青草视频| 久久香蕉精品| 日韩福利视频在线| 日韩va欧美va亚洲va久久| 欧美激情第3页| 国产在线一区二区综合免费视频| 天天综合网久久| 久久99久久久久久久久久久| 8x8x成人免费视频| 激情综合网最新| 特黄特黄一级片| 丁香婷婷综合激情五月色| japanese在线观看| 99久久免费精品高清特色大片| theav精尽人亡av| 国产色产综合产在线视频| 免费一级黄色录像| 亚洲乱码国产乱码精品精的特点 | 五月开心婷婷久久| 国产香蕉视频在线| 色综合久久久久综合体| 中文在线观看av| 欧美成人女星排行榜| 少妇喷水在线观看| 亚洲欧美日韩另类| 阿v免费在线观看| 欧美大胆在线视频| 男女羞羞在线观看| 成人两性免费视频| 国产精品视屏| 色狠狠久久av五月综合| 亚洲一区 二区 三区| 久久av综合网| 麻豆久久婷婷| 亚洲 国产 图片| 成人av综合一区| 国产jk精品白丝av在线观看| 一区二区在线观看不卡| 国产精品久久久久久久久久久久久久久久久 | 亚洲影院天堂中文av色| 亚洲欧洲精品一区二区三区波多野1战4| 日韩av免费大片| 国产精品国三级国产av| 视频一区中文字幕国产| 麻豆网站免费观看| gogo大胆日本视频一区| 你懂得视频在线观看| 亚洲精品免费在线播放| 亚洲精品1区2区3区| 欧美日韩黄视频| 天堂网在线中文| 九色成人免费视频| 高清不卡av| av免费观看久久| 欧美一站二站| 青青视频免费在线观看| 青青草国产精品亚洲专区无| 久久久久国产免费| 国产精品久久久久影院| 国产成人在线观看网站| 欧美一级爆毛片| 国产资源在线看| 国模私拍一区二区三区| 国产一区二区三区| 亚洲欧美久久久久一区二区三区| 国产精品久久久久毛片大屁完整版 | 不卡一区综合视频| 草b视频在线观看| 精品亚洲国内自在自线福利| 免费在线观看a视频| 欧美日韩国产影院| 亚洲第一大网站| 色爱精品视频一区| 国产精品一区二区av影院萌芽| 波多野结衣成人在线| 98精品久久久久久久| 成人亚洲视频在线观看| 91一区在线观看| 国产无遮挡裸体免费视频| 欧美一区二区三区四区高清| av在线资源站| 国产精品高清在线| 女优一区二区三区| a级黄色一级片| 91亚洲精品久久久蜜桃| 久草成人在线视频| 日韩三级av在线播放| 二区三区四区高清视频在线观看| 日本欧美爱爱爱| 精品国产一区二区三区av片| 自慰无码一区二区三区| 不卡av在线免费观看| 日本少妇性高潮| 精品视频一区在线视频| 涩涩av在线| 欧美日韩亚洲一区二区三区在线观看| 亚洲神马久久| 噜噜噜在线视频| 精品久久久久久中文字幕一区奶水| 亚洲AV无码精品国产| 久久久久久成人精品| 亚洲资源在线| 可以看毛片的网址| 播五月开心婷婷综合| 在线观看亚洲天堂| 日韩av最新在线观看| 亚洲高清黄色| 亚洲国产午夜伦理片大全在线观看网站| 久久久久久9| 成人免费视频入口| 日韩欧美一级精品久久| 欧美寡妇性猛交xxx免费| 国产精品久久久久久久久久久久冷| 亚洲性视频h| 在线不卡av电影| 欧美中文字幕一二三区视频| 亚洲精品承认| 91影视免费在线观看| 亚洲国产激情| 国产肥白大熟妇bbbb视频| 欧洲另类一二三四区| 日韩免费网站| 久久草视频在线看| 狂野欧美一区| 一区二区三区影视| 亚洲成在人线av| 成人国产一区二区三区精品麻豆| 综合网五月天| 懂色av一区二区在线播放| 五月天综合激情| 日韩少妇与小伙激情| 91成人精品在线| 欧美激情成人网| 国产精品你懂的| 手机福利小视频在线播放| 国产精品久久久久久久久影视| 婷婷另类小说| www.17c.com喷水少妇| 欧美久久久久久久久中文字幕| 午夜激情在线| 欧美日韩一区二区三区免费|