午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識(shí)庫 > 一步步教你編寫可測試的Go語言代碼

一步步教你編寫可測試的Go語言代碼

熱門標(biāo)簽:最短的地圖標(biāo)注 浙江人工智能外呼管理系統(tǒng) 電銷機(jī)器人可以補(bǔ)救房產(chǎn)中介嗎 百度地圖標(biāo)注搜索關(guān)鍵詞 成都呼叫中心外呼系統(tǒng)平臺(tái) 谷歌便利店地圖標(biāo)注 電梯外呼訪客系統(tǒng) 騰訊外呼系統(tǒng)價(jià)格 ?兓?

第一個(gè)測試 “Hello Test!”

首先,在我們$GOPATH/src目錄下創(chuàng)建hello目錄,作為本文涉及到的所有示例代碼的根目錄。

然后,新建名為hello.go的文件,定義一個(gè)函數(shù)hello() ,功能是返回一個(gè)由若干單詞拼接成句子:

package hello

func hello() string {
 words := []string{"hello", "func", "in", "package", "hello"}
 wl := len(words)

 sentence := ""
 for key, word := range words {
  sentence += word
  if key  wl-1 {
   sentence += " "
  } else {
   sentence += "."
  }
 }
 return sentence
}

接著,新建名為hello_test.go的文件,填入如下內(nèi)容:

package hello

import (
 "fmt"
 "testing"
)

func TestHello(t *testing.T) {
 got := hello()
 expect := "hello func in package hello."

 if got != expect {
  t.Errorf("got [%s] expected [%s]", got, expect)
 }
}

func BenchmarkHello(b *testing.B) {
 for i := 0; i  b.N; i++ {
  hello()
 }
}

func ExampleHello() {
 hl := hello()
 fmt.Println(hl)
 // Output: hello func in package hello.
}

最后,打開終端,進(jìn)入hello目錄,輸入go test命令并回車,可以看到如下輸出:

PASS
ok  hello 0.007s

編寫測試代碼

Golang的測試代碼位于某個(gè)包的源代碼中名稱以_test.go結(jié)尾的源文件里,測試代碼包含測試函數(shù)、測試輔助代碼和示例函數(shù);測試函數(shù)有以Test開頭的功能測試函數(shù)和以Benchmark開頭的性能測試函數(shù)兩種,測試輔助代碼是為測試函數(shù)服務(wù)的公共函數(shù)、初始化函數(shù)、測試數(shù)據(jù)等,示例函數(shù)則是以Example開頭的說明被測試函數(shù)用法的函數(shù)。

大部分情況下,測試代碼是作為某個(gè)包的一部分,意味著它可以訪問包中不可導(dǎo)出的元素。但在有需要的時(shí)候(如避免循環(huán)依賴)也可以修改測試文件的包名,如package hello的測試文件,包名可以設(shè)為package hello_test。

功能測試函數(shù)

功能測試函數(shù)需要接收*testing.T類型的單一參數(shù)t,testing.T 類型用來管理測試狀態(tài)和支持格式化的測試日志。測試日志在測試執(zhí)行過程中積累起來,完成后輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出。

下面是從Go標(biāo)準(zhǔn)庫摘抄的 testing.T類型的常用方法的用法:

測試函數(shù)中的某條測試用例執(zhí)行結(jié)果與預(yù)期不符時(shí),調(diào)用t.Error()t.Errorf()方法記錄日志并標(biāo)記測試失敗

# /usr/local/go/src/bytes/compare_test.go
func TestCompareIdenticalSlice(t *testing.T) {
 var b = []byte("Hello Gophers!")
 if Compare(b, b) != 0 {
  t.Error("b != b")
 }
 if Compare(b, b[:1]) != 1 {
  t.Error("b > b[:1] failed")
 }
}

使用t.Fatal()t.Fatalf()方法,在某條測試用例失敗后就跳出該測試函數(shù)

# /usr/local/go/src/bytes/reader_test.go
func TestReadAfterBigSeek(t *testing.T) {
 r := NewReader([]byte("0123456789"))
 if _, err := r.Seek(131+5, os.SEEK_SET); err != nil {
  t.Fatal(err)
 }
 if n, err := r.Read(make([]byte, 10)); n != 0 || err != io.EOF {
  t.Errorf("Read = %d, %v; want 0, EOF", n, err)
 }
}

使用t.Skip()t.Skipf()方法,跳過某條測試用例的執(zhí)行

# /usr/local/go/src/archive/zip/zip_test.go
func TestZip64(t *testing.T) {
 if testing.Short() {
  t.Skip("slow test; skipping")
 }
 const size = 1  32 // before the "END\n" part
 buf := testZip64(t, size)
 testZip64DirectoryRecordLength(buf, t)
}

執(zhí)行測試用例的過程中通過t.Log()t.Logf()記錄日志

# /usr/local/go/src/regexp/exec_test.go
func TestFowler(t *testing.T) {
 files, err := filepath.Glob("testdata/*.dat")
 if err != nil {
  t.Fatal(err)
 }
 for _, file := range files {
  t.Log(file)
  testFowler(t, file)
 }
}

使用t.Parallel()標(biāo)記需要并發(fā)執(zhí)行的測試函數(shù)

# /usr/local/go/src/runtime/stack_test.go
func TestStackGrowth(t *testing.T) {
 t.Parallel()
 var wg sync.WaitGroup

 // in a normal goroutine
 wg.Add(1)
 go func() {
  defer wg.Done()
  growStack()
 }()
 wg.Wait()

 // ...
}

性能測試函數(shù)

性能測試函數(shù)需要接收*testing.B類型的單一參數(shù)b,性能測試函數(shù)中需要循環(huán)b.N次調(diào)用被測函數(shù)。testing.B 類型用來管理測試時(shí)間和迭代運(yùn)行次數(shù),也支持和testing.T相同的方式管理測試狀態(tài)和格式化的測試日志,不一樣的是testing.B的日志總是會(huì)輸出。

下面是從Go標(biāo)準(zhǔn)庫摘抄的 testing.B類型的常用方法的用法:

在函數(shù)中調(diào)用t.ReportAllocs() ,啟用內(nèi)存使用分析

# /usr/local/go/src/bufio/bufio_test.go
func BenchmarkWriterFlush(b *testing.B) {
 b.ReportAllocs()
 bw := NewWriter(ioutil.Discard)
 str := strings.Repeat("x", 50)
 for i := 0; i  b.N; i++ {
  bw.WriteString(str)
  bw.Flush()
 }
}

通過 b.StopTimer() b.ResetTimer() b.StartTimer()來停止、重置、啟動(dòng) 時(shí)間經(jīng)過和內(nèi)存分配計(jì)數(shù)

# /usr/local/go/src/fmt/scan_test.go
func BenchmarkScanInts(b *testing.B) {
 b.ResetTimer()
 ints := makeInts(intCount)
 var r RecursiveInt
 for i := b.N - 1; i >= 0; i-- {
  buf := bytes.NewBuffer(ints)
  b.StartTimer()
  scanInts(r, buf)
  b.StopTimer()
 }
}

調(diào)用b.SetBytes()記錄在一個(gè)操作中處理的字節(jié)數(shù)

# /usr/local/go/src/testing/benchmark.go
func BenchmarkFields(b *testing.B) {
 b.SetBytes(int64(len(fieldsInput)))
 for i := 0; i  b.N; i++ {
  Fields(fieldsInput)
 }
}

通過b.RunParallel()方法和 *testing.PB類型的Next()方法來并發(fā)執(zhí)行被測對象

# /usr/local/go/src/sync/atomic/value_test.go
func BenchmarkValueRead(b *testing.B) {
 var v Value
 v.Store(new(int))
 b.RunParallel(func(pb *testing.PB) {
  for pb.Next() {
   x := v.Load().(*int)
   if *x != 0 {
    b.Fatalf("wrong value: got %v, want 0", *x)
   }
  }
 })
}

測試輔助代碼

測試輔助代碼是編寫測試代碼過程中因代碼重用和代碼質(zhì)量考慮而產(chǎn)生的。主要包括如下方面:

引入依賴的外部包,如每個(gè)測試文件都需要的 testing 包等:

# /usr/local/go/src/log/log_test.go:
import (
 "bytes"
 "fmt"
 "os"
 "regexp"
 "strings"
 "testing"
 "time"
)

定義多次用到的常量和變量,測試用例數(shù)據(jù)等:

# /usr/local/go/src/log/log_test.go:
const (
 Rdate   = `[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]`
 Rtime   = `[0-9][0-9]:[0-9][0-9]:[0-9][0-9]`
 Rmicroseconds = `\.[0-9][0-9][0-9][0-9][0-9][0-9]`
 Rline   = `(57|59):` // must update if the calls to l.Printf / l.Print below move
 Rlongfile  = `.*/[A-Za-z0-9_\-]+\.go:` + Rline
 Rshortfile = `[A-Za-z0-9_\-]+\.go:` + Rline
)

// ...

var tests = []tester{
 // individual pieces:
 {0, "", ""},
 {0, "XXX", "XXX"},
 {Ldate, "", Rdate + " "},
 {Ltime, "", Rtime + " "},
 {Ltime | Lmicroseconds, "", Rtime + Rmicroseconds + " "},
 {Lmicroseconds, "", Rtime + Rmicroseconds + " "}, // microsec implies time
 {Llongfile, "", Rlongfile + " "},
 {Lshortfile, "", Rshortfile + " "},
 {Llongfile | Lshortfile, "", Rshortfile + " "}, // shortfile overrides longfile
 // everything at once:
 {Ldate | Ltime | Lmicroseconds | Llongfile, "XXX", "XXX" + Rdate + " " + Rtime + Rmicroseconds + " " + Rlongfile + " "},
 {Ldate | Ltime | Lmicroseconds | Lshortfile, "XXX", "XXX" + Rdate + " " + Rtime + Rmicroseconds + " " + Rshortfile + " "},
}

和普通的Golang源代碼一樣,測試代碼中也能定義init函數(shù),init函數(shù)會(huì)在引入外部包、定義常量、聲明變量之后被自動(dòng)調(diào)用,可以在init函數(shù)里編寫測試相關(guān)的初始化代碼。

# /usr/local/go/src/bytes/buffer_test.go
func init() {
 testBytes = make([]byte, N)
 for i := 0; i  N; i++ {
  testBytes[i] = 'a' + byte(i%26)
 }
 data = string(testBytes)
}

封裝測試專用的公共函數(shù),抽象測試專用的結(jié)構(gòu)體等:

# /usr/local/go/src/log/log_test.go:
type tester struct {
 flag int
 prefix string
 pattern string // regexp that log output must match; we add ^ and expected_text$ always
}

// ...

func testPrint(t *testing.T, flag int, prefix string, pattern string, useFormat bool) {
 // ...
}

示例函數(shù)

示例函數(shù)無需接收參數(shù),但需要使用注釋的 Output: 標(biāo)記說明示例函數(shù)的輸出值,未指定Output:標(biāo)記或輸出值為空的示例函數(shù)不會(huì)被執(zhí)行。

示例函數(shù)需要?dú)w屬于某個(gè) 包/函數(shù)/類型/類型 的方法,具體命名規(guī)則如下:

func Example() { ... }  # 包的示例函數(shù)
func ExampleF() { ... }  # 函數(shù)F的示例函數(shù)
func ExampleT() { ... }  # 類型T的示例函數(shù)
func ExampleT_M() { ... } # 類型T的M方法的示例函數(shù)

# 多示例函數(shù) 需要跟下劃線加小寫字母開頭的后綴
func Example_suffix() { ... }
func ExampleF_suffix() { ... }
func ExampleT_suffix() { ... }
func ExampleT_M_suffix() { ... }

go doc 工具會(huì)解析示例函數(shù)的函數(shù)體作為對應(yīng) 包/函數(shù)/類型/類型的方法 的用法。

測試函數(shù)的相關(guān)說明,可以通過go help testfunc來查看幫助文檔。

使用 go test 工具

Golang中通過命令行工具go test來執(zhí)行測試代碼,打開shell終端,進(jìn)入需要測試的包所在的目錄執(zhí)行 go test,或者直接執(zhí)行go test $pkg_name_in_gopath即可對指定的包執(zhí)行測試。

通過形如go test github.com/tabalt/...的命令可以執(zhí)行$GOPATH/github.com/tabalt/目錄下所有的項(xiàng)目的測試。go test std命令則可以執(zhí)行Golang標(biāo)準(zhǔn)庫的所有測試。

如果想查看執(zhí)行了哪些測試函數(shù)及函數(shù)的執(zhí)行結(jié)果,可以使用-v參數(shù):

[tabalt@localhost hello] go test -v
=== RUN TestHello
--- PASS: TestHello (0.00s)
=== RUN ExampleHello
--- PASS: ExampleHello (0.00s)
PASS
ok  hello 0.006s

假設(shè)我們有很多功能測試函數(shù),但某次測試只想執(zhí)行其中的某一些,可以通過-run參數(shù),使用正則表達(dá)式來匹配要執(zhí)行的功能測試函數(shù)名。如下面指定參數(shù)后,功能測試函數(shù)TestHello不會(huì)執(zhí)行到。

[tabalt@localhost hello] go test -v -run=xxx
PASS
ok  hello 0.006s

性能測試函數(shù)默認(rèn)并不會(huì)執(zhí)行,需要添加-bench參數(shù),并指定匹配性能測試函數(shù)名的正則表達(dá)式;例如,想要執(zhí)行某個(gè)包中所有的性能測試函數(shù)可以添加參數(shù)-bench . 或 -bench=.。

[tabalt@localhost hello] go test -bench=.
PASS
BenchmarkHello-8  2000000   657 ns/op
ok  hello 1.993s

想要查看性能測試時(shí)的內(nèi)存情況,可以再添加參數(shù)-benchmem:

[tabalt@localhost hello] go test -bench=. -benchmem
PASS
BenchmarkHello-8  2000000   666 ns/op   208 B/op   9 allocs/op
ok  hello 2.014s

參數(shù)-cover可以用來查看我們編寫的測試對代碼的覆蓋率:


詳細(xì)的覆蓋率信息,可以通過-coverprofile輸出到文件,并使用go tool cover來查看,用法請參考go tool cover -help

更多go test命令的參數(shù)及用法,可以通過go help testflag來查看幫助文檔。

高級(jí)測試技術(shù)

IO相關(guān)測試

testing/iotest包中實(shí)現(xiàn)了常用的出錯(cuò)的Reader和Writer,可供我們在io相關(guān)的測試中使用。主要有:

觸發(fā)數(shù)據(jù)錯(cuò)誤dataErrReader,通過DataErrReader()函數(shù)創(chuàng)建

讀取一半內(nèi)容的halfReader,通過HalfReader()函數(shù)創(chuàng)建

讀取一個(gè)byte的oneByteReader,通過OneByteReader()函數(shù)創(chuàng)建

觸發(fā)超時(shí)錯(cuò)誤的timeoutReader,通過TimeoutReader()函數(shù)創(chuàng)建

寫入指定位數(shù)內(nèi)容后停止的truncateWriter,通過TruncateWriter()函數(shù)創(chuàng)建

讀取時(shí)記錄日志的readLogger,通過NewReadLogger()函數(shù)創(chuàng)建

寫入時(shí)記錄日志的writeLogger,通過NewWriteLogger()函數(shù)創(chuàng)建

黑盒測試

testing/quick包實(shí)現(xiàn)了幫助黑盒測試的實(shí)用函數(shù) Check和CheckEqual。

Check函數(shù)的第1個(gè)參數(shù)是要測試的只返回bool值的黑盒函數(shù)f,Check會(huì)為f的每個(gè)參數(shù)設(shè)置任意值并多次調(diào)用,如果f返回false,Check函數(shù)會(huì)返回錯(cuò)誤值 *CheckError。Check函數(shù)的第2個(gè)參數(shù) 可以指定一個(gè)quick.Config類型的config,傳nil則會(huì)默認(rèn)使用quick.defaultConfig。quick.Config結(jié)構(gòu)體包含了測試運(yùn)行的選項(xiàng)。

# /usr/local/go/src/math/big/int_test.go
func checkMul(a, b []byte) bool {
 var x, y, z1 Int
 x.SetBytes(a)
 y.SetBytes(b)
 z1.Mul(x, y)

 var z2 Int
 z2.SetBytes(mulBytes(a, b))

 return z1.Cmp(z2) == 0
}

func TestMul(t *testing.T) {
 if err := quick.Check(checkMul, nil); err != nil {
  t.Error(err)
 }
}

CheckEqual函數(shù)是比較給定的兩個(gè)黑盒函數(shù)是否相等,函數(shù)原型如下:

func CheckEqual(f, g interface{}, config *Config) (err error)

HTTP測試

net/http/httptest包提供了HTTP相關(guān)代碼的工具,我們的測試代碼中可以創(chuàng)建一個(gè)臨時(shí)的httptest.Server來測試發(fā)送HTTP請求的代碼:

ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 fmt.Fprintln(w, "Hello, client")
}))
defer ts.Close()

res, err := http.Get(ts.URL)
if err != nil {
 log.Fatal(err)
}

greeting, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
 log.Fatal(err)
}

fmt.Printf("%s", greeting)

還可以創(chuàng)建一個(gè)應(yīng)答的記錄器httptest.ResponseRecorder來檢測應(yīng)答的內(nèi)容:

handler := func(w http.ResponseWriter, r *http.Request) {
 http.Error(w, "something failed", http.StatusInternalServerError)
}

req, err := http.NewRequest("GET", "http://example.com/foo", nil)
if err != nil {
 log.Fatal(err)
}

w := httptest.NewRecorder()
handler(w, req)

fmt.Printf("%d - %s", w.Code, w.Body.String())

測試進(jìn)程操作行為

當(dāng)我們被測函數(shù)有操作進(jìn)程的行為,可以將被測程序作為一個(gè)子進(jìn)程執(zhí)行測試。下面是一個(gè)例子:

//被測試的進(jìn)程退出函數(shù)
func Crasher() {
 fmt.Println("Going down in flames!")
 os.Exit(1)
}

//測試進(jìn)程退出函數(shù)的測試函數(shù)
func TestCrasher(t *testing.T) {
 if os.Getenv("BE_CRASHER") == "1" {
  Crasher()
  return
 }
 cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
 cmd.Env = append(os.Environ(), "BE_CRASHER=1")
 err := cmd.Run()
 if e, ok := err.(*exec.ExitError); ok  !e.Success() {
  return
 }
 t.Fatalf("process ran with err %v, want exit status 1", err)
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用Go語言能有所幫助,如果有疑問大家可以留言交流。

您可能感興趣的文章:
  • 深入理解Golang的單元測試和性能測試

標(biāo)簽:紹興 宜昌 盤錦 邢臺(tái) 上海 雅安 眉山 七臺(tái)河

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《一步步教你編寫可測試的Go語言代碼》,本文關(guān)鍵詞  一,步步,教你,編寫,可,測試,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《一步步教你編寫可測試的Go語言代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于一步步教你編寫可測試的Go語言代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美中日韩在线| 免费看欧美女人艹b| 国产一区二区三区四区hd| 精品av久久707| 成人听书哪个软件好| 夜夜狠狠擅视频| 精品欧美一区二区久久久| 999在线观看视频| 日本免费一区二区三区视频观看| 亚洲国产日韩精品| 韩日av一区二区| 日本视频免费在线| 精品www久久久久奶水| 国产日韩欧美成人| 日韩电影大片中文字幕| 欧美日韩亚洲精品内裤| 国产欧美日韩综合| 另类人妖一区二区av| 开心激情五月网| 性色av蜜臀av浪潮av老女人| 日本熟妇人妻中出| av免费看网址| 国产精品国模大尺度私拍| 日韩中文字幕av| 日本韩国一区二区| 亚洲精品免费在线观看| 精品一区二区国语对白| 空姐吹箫视频大全| 国产精品成人aaaa在线| 国产精品三级在线观看无码| 永久免费看片在线观看| 任你操这里只有精品| 热re99久久精品国产99热| 亚洲va久久久噜噜噜| 欧美日本在线视频中文字字幕| 欧美三级在线播放| 欧美视频不卡中文| 亚洲色图视频网站| youjizz久久| 国产乱码一区二区三区| 美女爽到高潮91| 亚洲欧洲综合在线| 在线观看免费中文字幕| 亚洲精品一区二区二区| 最新国产中文字幕| 国产一级在线观看视频| 91九色蝌蚪porny| 丰满少妇久久久| 青青青青在线视频| 丰满女人性猛交| 婷婷精品国产一区二区三区日韩| 秋霞在线观看一区二区三区| 日韩欧美在线电影| 亚洲国产日韩欧美| 9l视频自拍9l视频自拍| 亚洲欧美久久234| 在线一区高清| 欧美 国产 精品| 免费毛片网站在线观看| 精品视频无码一区二区三区| 天天干在线影院| 中文字幕永久有效| 人妻少妇精品视频一区二区三区| 亚洲综合欧美综合| 男女男精品视频网站| 久草国产在线视频| 无码人妻丰满熟妇区bbbbxxxx| 久久久国产精品成人免费| 伊人网av在线| 黄色三级网站在线观看| 久久狠狠亚洲综合| 久久影院视频免费| 亚洲天堂中文字幕| 一区二区免费看| 欧美日韩国产首页| 国产亚洲人成a一在线v站| 亚洲18私人小影院| 国产成人在线精品| 欧美不卡在线一区二区三区| 超碰10000| 91n.com在线观看| 日韩不卡av在线| 亚洲精品视频在线观看免费视频| 国产第一页在线观看| 337p粉嫩色噜噜噜大肥臀| 成人午夜福利视频| 粉嫩aⅴ一区二区三区四区五区| 成人av在线一区二区三区| 中文字幕乱码久久午夜不卡| 亚洲综合无码一区二区| 欧美日韩一区二区在线观看| 日韩在线视频中文字幕| 成人亚洲激情网| 久久久久资源| 国产高清精品软男同| 国产精品波多野结衣| jizz大全欧美jizzcom| 欧美人与性囗牲恔配| 免费看日批视频| 国产精品18久久久久久vr| 国产精品美女视频| 欧美日韩国产高清一区二区三区| 久久视频免费在线播放| 久久精品99久久| 黄色片子免费看| 精品在线视频免费观看| 久久亚洲不卡| 亚洲尤物在线视频观看| 精品国产三级a在线观看| 国产精品久久视频| www插插插无码视频网站| 中文字幕无码日韩专区免费 | 欧美久久精品午夜青青大伊人| 粉嫩av免费一区二区三区| 亚洲激情在线观看视频| 日韩经典在线观看| 久久99精品久久久久婷婷| 色婷婷精品久久二区二区蜜臂av| 一区二区三区美女xx视频| 欧美在线视频a| 中文字幕日韩精品无码内射| 荫蒂被男人添免费视频| 国产美女www爽爽爽| 国产欧美日韩不卡免费| 国产亚洲视频在线观看| 亚洲精品国产系列| 天天操天天舔天天射| 精品国产九九九| 欧美色另类天堂2015| 欧美高清在线观看| 男插女免费视频| 一区二区国产精品精华液| 免费久久精品视频| 欧美日韩精品一区二区三区| 国模精品一区二区三区色天香| www.99riav| 色在线观看视频| 国产毛片精品一区| 精品国产乱码久久久久久浪潮| 国产精品劲爆视频| 师生出轨h灌满了1v1| 亚洲精品97久久中文字幕无码| 色综合咪咪久久| 91欧美视频网站| 一级淫片在线观看| 激情五月婷婷在线| 国产a精品视频| 在线播放日韩av| 中文字幕一区二区三区最新| 久久久久久久久久久久久久免费看| 免费在线视频一区| 日韩欧美综合一区| 久久久国产精华液999999| 老司机成人免费视频| 亚洲国产经典视频| 国产精品成人一区二区三区吃奶| 中文字幕精品久久久| 成人午夜免费av| 国内揄拍国内精品| 国产又黄又嫩又滑又白| 国产精品综合av一区二区国产馆| 亚洲精品视频二区| 欧美精品久久96人妻无码| 91丨porny丨在线中文 | 欧美性大战久久久久xxx| 午夜福利视频一区二区| 亚洲福利视频久久| 大陆极品少妇内射aaaaa| 污视频网站在线播放| 91精品国产高清一区二区三区| 一区二区三区视频在线播放| 国产视频一二三四区| 亚洲第一视频网站| 亚洲中文字幕无码专区| 国产成人精品av在线观| 亚洲精品久久久久| 91制片厂毛片| 久久免费偷拍视频| 亚洲影院色在线观看免费| 中国1级黄色片| 欧美高清在线一区| 国产欧美日韩免费| 粉嫩精品久久99综合一区| 亚洲精选视频免费看| 免费av在线一区二区| 男人的天堂av网站| 欧美日韩大陆在线| 免费在线激情视频| 国产成人亚洲综合a∨婷婷 | 亚洲高清免费观看 | www.自拍偷拍| 亚洲欧美电影院| 久久久久se| 色婷婷av一区二区三区之红樱桃 | 亚洲一区二区色| 欧美哺乳videos| 黄色永久免费网站| 久久麻豆一区二区| 国产美女精品视频| 国产在线成人精品午夜| 精品久久久久久久久中文字幕 | 亚洲第一精品夜夜躁人人爽| 九一国产精品视频| 成人精品国产免费网站| 99在线视频播放| 好男人www在线视频| 91高清视频在线免费观看| 欧美亚韩一区二区三区| 亚洲人成电影网站色…| 精品国产鲁一鲁一区二区三区| 中文字幕中文乱码欧美一区二区| 天堂va久久久噜噜噜久久va| 久久精品国产免费| 91视频国产精品| 天天操天天干天天| 成人精品网站在线观看| www.精品视频| 久久99精品国产99久久6尤物| a级片在线观看免费| 精品不卡在线视频| 国产1区2区在线观看| 欧美精品99久久久**| 在线观看亚洲免费视频| 欧美日韩在线免费观看| 国产xxxxx视频| 亚洲高清中文字幕| 成人精品视频在线播放| 久久九九影视网| 中文字幕日韩精品一区二区| 91丝袜美腿高跟国产极品老师 | 国产**成人网毛片九色 | 国产精品丝袜久久久久久app| 欧美乱偷一区二区三区在线| 天天色综合久久| av免费精品一区二区三区| 热久久免费视频| 玛丽玛丽电影原版免费观看1977| 日韩电影在线观看电影| 精品乱码一区二区三区| 91日韩一区二区三区| 成人国产在线看| 久久精品一区二区三区不卡| 99999精品视频| 亚洲欧美偷拍三级| 欧美三级理论片| 欧美日免费三级在线| 精品国产成人av在线免| 高清不卡在线观看| 欧美激情视频免费看| 一个色综合av| www.99r| 欧美日本韩国一区| 国产午夜手机精彩视频| 欧美精品手机在线| 亚洲三级中文字幕| 手机成人在线| 久久只精品国产| 日韩av.com| 亚洲第一视频网| 波多野结衣av无码| 国产精品极品美女在线观看免费 | www.激情成人| 人妻av中文系列| 婷婷久久综合九色综合伊人色| 欧美日韩一区二区三区四区五区六区| 欧美剧情片在线观看| www日韩精品| 亚洲一区二区三区毛片 | 国产性生活网站| 日韩美女视频免费看| 国产91露脸合集magnet| 老司机激情视频| 91精品国产全国免费观看| 69夜色精品国产69乱| 国产精品欧美日韩| 26uuu另类欧美亚洲曰本| 一区二区三区免费播放| 亚洲欧美成人在线| 久久国产毛片| 欧美国产亚洲一区| 日韩手机在线导航| 日韩欧美一级视频| 久久狠狠久久综合桃花| **欧美大码日韩| 欧美狂猛xxxxx乱大交3| 欧美一级大片视频| 久久综合成人精品亚洲另类欧美| 熟妇高潮一区二区| 欧美成人精品在线| 日韩高清不卡一区二区| 精品国产一区二区三区无码| 日韩欧美国产一二三区| 4438国产精品一区二区| 九9re精品视频在线观看re6| 亚洲成人福利片| 成年人午夜视频| 国语精品免费视频| 欧美日韩一区二区电影| 999av视频| 久久福利一区二区| 亚洲欧洲美洲在线综合| 精久久久久久久久久久| 精品999在线| 久久久久999| 国产亚洲综合av| 日韩黄色免费观看| 亚洲不卡中文字幕| 亚洲精品在线观看www| 国产在线播放一区| 三叶草欧洲码在线| 精品国产电影| 亚洲一本大道在线| 极品盗摄国产盗摄合集| 日韩国产精品一区二区三区| 欧美日韩一区二区三区四区五区| 国产喷水吹潮视频www| 韩国一区二区av| 久久久精品一区| 国产精品亲子伦对白| 久久免费在线观看视频| 一区二区视频在线播放| 久久国产一区二区三区| 国产精品热久久久久夜色精品三区 | 天天色天天综合| 中文字幕乱码免费| 欧美精品成人在线| 午夜精品爽啪视频| 少妇精品视频一区二区| 黄色正能量网站| 亚洲一区三区| 欧美老女人在线视频| 亚洲综合色噜噜狠狠| 久久久国产亚洲精品| 91麻豆精品久久毛片一级| a级黄色片免费| 97视频在线观看网址| 亚洲一区中文在线| 久热综合在线亚洲精品| 欧美性x x x| www黄色av| 国产精品一区二区电影| 亚洲国产精品电影在线观看| 成人国产电影网| 国产天堂第一区| 久久久久亚洲av无码麻豆| 成人性色av| 久久大大胆人体| 7777女厕盗摄久久久| 成人av在线电影| 你懂的国产在线| 中国极品少妇xxxx| 国产专区在线视频| 热久久免费国产视频| 日韩免费看网站| 亚洲婷婷综合色高清在线| 免费人成在线不卡| 日韩欧美亚洲一区二区三区| 亚洲精品免费一区亚洲精品免费精品一区 | 欧美激情精品久久久久久| 欧美日韩午夜激情| 久久99精品久久久久久| 日本视频免费在线| 丰满少妇xbxb毛片日本| 日韩久久久久久久久久久久| 不卡一区二区三区视频| 中文字幕在线亚洲| 亚洲成av人在线观看| 成人动漫av在线| 日韩精品欧美精品| 日韩精品一区二区不卡| 成人在线视频免费播放| 91精品91久久久中77777老牛| 精品视频一区二区| 国产精品久久久久久av福利软件 | 成人网站免费观看入口| 精品国产二区在线| 日本欧美中文字幕| 另类少妇人与禽zozz0性伦| 色94色欧美sute亚洲线路一ni | 国产精品久久精品国产| 最近中文字幕日韩精品| 日本精品视频一区二区三区| 亚洲日本成人在线观看| 99久久婷婷国产| 韩国毛片一区二区三区| 成人久久精品人妻一区二区三区| 天海翼在线视频| 少妇高潮一69aⅹ| 国产九九九九九| 亚洲精品中文字幕在线| 国产精选在线观看91| 日本成人免费在线| 国产69精品久久久久99| 日韩亚洲精品电影| 中文国产成人精品| 亚洲片在线观看| 亚洲人午夜色婷婷| 亚洲精品视频在线播放| 精品卡一卡二卡三卡四在线| 欧美一区二区视频在线观看2022| 欧美视频中文一区二区三区在线观看| 亚洲福利电影网| 亚洲欧洲精品一区二区三区不卡| 中文字幕精品在线不卡| 不卡的av中国片| 国产成人精品一区二区三区四区| 国产美女在线观看一区| 成人激情综合网站| 国产日韩综合av| 一区二区三区在线视频免费观看 |