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

測試用例難寫?來試試 Sharness

開發(fā) 開發(fā)工具
Sharness 是一個用 Shell 腳本來編寫測試用例的測試框架。本文將詳細(xì)介紹 Sharness 的結(jié)構(gòu)及測試用例的編寫格式,以及語法規(guī)范和技巧,教大家如何使用 Sharness 編寫測試用例,同時參與過 Git 項(xiàng)目的測試用例開發(fā),為其測試框架的簡潔、高效而折服。

Sharness 是一個用 Shell 腳本來編寫測試用例的測試框架。本文將詳細(xì)介紹 Sharness 的結(jié)構(gòu)及測試用例的編寫格式,以及語法規(guī)范和技巧,教大家如何使用 Sharness 編寫測試用例,同時參與過 Git 項(xiàng)目的測試用例開發(fā),為其測試框架的簡潔、高效而折服。曾經(jīng)嘗試將 Git 測試用例用于其他項(xiàng)目:《復(fù)用 git.git 測試框架》[1]。不過從 Git 項(xiàng)目中剝離測試用例框架還是挺費(fèi)事的。

一次偶然的機(jī)會發(fā)現(xiàn)已經(jīng)有人(Christian Couder:Gitlab 工程師,Git項(xiàng)目的領(lǐng)導(dǎo)委員會成員之一)已經(jīng)將 Git 的測試用例框架剝離出來, 成為獨(dú)立的開源項(xiàng)目 Sharness。

有了 Sharness,寫測試用例不再是苦差事。

一 Sharness 是什么?

  • Sharness 是一個用 Shell 腳本來編寫測試用例的測試框架。
  • 可以在 Linux、macOS 平臺運(yùn)行測試用例。
  • 測試輸出符合 TAP(test anything protocol),因此可以用 sharness 自身工具或 prove 等 TAP 兼容測試夾具(harness)運(yùn)行。
  • 是由Junio在2005年為Git項(xiàng)目開發(fā)的測試框架,由 Christian Couder (chriscool) 從 Git 中剝離為獨(dú)立測試框架。
  • 地址:https://github.com/chriscool/sharness

二 Sharness 測試框架的優(yōu)點(diǎn)

簡潔

如果要在測試用例中創(chuàng)建/初始化一個文件(內(nèi)容為 “Hello, world.”), 看看 sharness 實(shí)現(xiàn)起來有多么簡單:

cat >expect <<-EOF 
Hello, world.
EOF

如果要對某應(yīng)用(hello-world)的輸出和預(yù)期的 expect 文件進(jìn)行比較, 相同則測試用例通過,不同則展示差異。測試用例編寫如下:

test_expect_success “app output test” ‘ 
cat >expect <<-EOF &&
Hello, world.
EOF
hello-world >actual &&
test_cmp expect actual

調(diào)試方便

每個測試用例腳本可以單獨(dú)執(zhí)行。使用 -v 參數(shù),可以顯示詳細(xì)輸出。使用 -d 參數(shù),運(yùn)行結(jié)束后保留用例的臨時目錄。

可以在要調(diào)試的test case后面增加 test_pause 語句,例如:

test_expect_success “name” ‘ 
<Script…>


test_pause
test_done

然后使用 -v 參數(shù)運(yùn)行該腳本,會在 test_pause 語句處中斷,進(jìn)入一個包含 sharness 環(huán)境變量的子 Shell 中,目錄會切換到測試用例單獨(dú)的工作區(qū)。調(diào)試完畢退出 Shell 即返回。

三 Git 項(xiàng)目的測試框架結(jié)構(gòu)

Sharness 源自于 Git 項(xiàng)目的測試用例框架。我們先來看看 Git 項(xiàng)目測試框架的結(jié)構(gòu)。

Git 項(xiàng)目測試相關(guān)文件

  • 待測應(yīng)用放在項(xiàng)目的根目錄。例如 Git 項(xiàng)目的待測應(yīng)用: git 和 git-receive-pack 等。
  • 測試框架修改 PATH 環(huán)境變量,使得測試用例在調(diào)用待測應(yīng)用(如 git 命令)的時候,優(yōu)先使用項(xiàng)目根目錄下的待測應(yīng)用。
  • 測試腳本命名為 tNNNN-.sh,即以字母 t 和四位數(shù)字開頭的腳本文件。
  • 每一個測試用例在執(zhí)行時會創(chuàng)建一個獨(dú)立的臨時目錄,例如 trash directory.t5323-pack-redundant。測試用例執(zhí)行成功,則該目錄會被刪除。

相關(guān)代碼參見[2]。

四 Git 測試腳本的格式

以如下測試腳本為例[3]:

(1)在文件頭,定義 test_description 變量,提供測試用例的簡單說明,通常使用一行文本。本測試用例較為復(fù)雜,使用了多行文本進(jìn)行描述。

#!/bin/sh 
#
# Copyright (c) 2018 Jiang Xin
#

test_description='Test git pack-redundant

In order to test git-pack-redundant, we will create a number of objects and
packs in the repository `master.git`. The relationship between packs (P1-P8)
and objects (T, A-R) is showed in the following chart. Objects of a pack will
be marked with letter x, while objects of redundant packs will be marked with
exclamation point, and redundant pack itself will be marked with asterisk.

| T A B C D E F G H I J K L M N O P Q R
----+--------------------------------------
P1 | x x x x x x x x
P2* | ! ! ! ! ! ! !
P3 | x x x x x x
P4* | ! ! ! ! !
P5 | x x x x
P6* | ! ! !
P7 | x x
P8* | !
----+--------------------------------------
ALL | x x x x x x x x x x x x x x x x x x x

Another repository `shared.git` has unique objects (X-Z), while other objects
(marked with letter s) are shared through alt-odb (of `master.git`). The
relationship between packs and objects is as follows:

| T A B C D E F G H I J K L M N O P Q R X Y Z
----+----------------------------------------------
Px1 | s s s x x x
Px2 | s s s x x x
'

(2)包含測試框架代碼。

. ./test-lib.sh

(3)定義全局變量,以及定義要在測試用例中用到的函數(shù)封裝。

master_repo=master.git 
shared_repo=shared.git

# Create commits in <repo> and assign each commit's oid to shell variables
# given in the arguments (A, B, and C). E.g.:
#
# create_commits_in <repo> A B C
#
# NOTE: Avoid calling this function from a subshell since variable
# assignments will disappear when subshell exits.
create_commits_in () {
repo="$1" &&
if ! parent=$(git -C "$repo" rev-parse HEAD^{} 2>/dev/null)
then
... ...

(4)用 test_expect_success 等方法撰寫測試用例。

test_expect_success 'setup master repo' ' 
git init --bare "$master_repo" &&
create_commits_in "$master_repo" A B C D E F G H I J K L M N O P Q R
'

#############################################################################
# Chart of packs and objects for this test case
#
# | T A B C D E F G H I J K L M N O P Q R
# ----+--------------------------------------
# P1 | x x x x x x x x
# P2 | x x x x x x x
# P3 | x x x x x x
# ----+--------------------------------------
# ALL | x x x x x x x x x x x x x x x
#
#############################################################################
test_expect_success 'master: no redundant for pack 1, 2, 3' '
create_pack_in "$master_repo" P1 <<-EOF &&
$T
$A
$B
$C
$D
$E
$F
$R
EOF
create_pack_in "$master_repo" P2 <<-EOF &&
$B
$C
$D
$E
$G
$H
$I
EOF
create_pack_in "$master_repo" P3 <<-EOF &&
$F
$I
$J
$K
$L
$M
EOF
(
cd "$master_repo" &&
git pack-redundant --all >out &&
test_must_be_empty out
)
'

(5)在腳本的結(jié)尾,用 test_done 方法結(jié)束測試用例。

test_done

五 Sharness 測試框架結(jié)構(gòu)

Sharness 項(xiàng)目由 Git 項(xiàng)目的測試框架抽象而來,項(xiàng)目地址:

??https://github.com/chriscool/sharness??

Sharness 測試框架示例

  • 待測應(yīng)用放在項(xiàng)目的根目錄。
  • 測試腳本命名為 .t,即擴(kuò)展名為 .t 的腳本文件。
  • 每一個測試用例在執(zhí)行時會創(chuàng)建一個獨(dú)立的臨時目錄,例如 trash directory.simple.t。測試用例執(zhí)行成功,則該目錄會被刪除。
  • 在 sharness.d 目錄下添加自定義腳本,可以擴(kuò)展 Sharness 框架。即在框架代碼加載時,自動加載該目錄下文件。

我們對 Sharness 測試框架做了一些小改動:

  • 定制版本對測試框架代碼做了進(jìn)一步封裝,框架代碼放在單獨(dú)的子目錄。
  • 測試腳本的名稱恢復(fù)為和 Git 項(xiàng)目測試腳本類似的名稱(tNNNN-.sh), 即以字母 t 和四位數(shù)字開頭的腳本文件。

定制版 Sharness 測試框架示例

六 Sharness 測試用例格式

以如下測試腳本為例[4]:

(1)在文件頭,定義 test_description 變量,提供測試用例的簡單說明,通常使用一行文本。

#!/bin/sh      
test_description="git-repo init"

(2)包含測試框架代碼。

. ./lib/sharness.sh

(3)定義全局變量,以及定義要在測試用例中用到的函數(shù)封裝。

# Create manifest repositories  
manifest_url="file://${REPO_TEST_REPOSITORIES}/hello/manifests"

(4)用 test_expect_success 等方法撰寫測試用例。

test_expect_success "setup" ' 
# create .repo file as a barrier, not find .repo deeper
touch .repo &&
mkdir work
'

test_expect_success "git-repo init -u" '
(
cd work &&
git-repo init -u $manifest_url
)
'

test_expect_success "manifest points to default.xml" '
(
cd work &&
test -f .repo/manifest.xml &&
echo manifests/default.xml >expect &&
readlink .repo/manifest.xml >actual &&
test_cmp expect actual
)
'

(5)在腳本的結(jié)尾,用 test_done 方法結(jié)束測試用例。

test_done

七 關(guān)于 test_expect_success 方法的參數(shù)

test_expect_success 可以有兩個參數(shù)或者三個參數(shù)。

當(dāng) test_expect_success 方法后面是兩個參數(shù)時,第一個參數(shù)用于描述測試用例, 第二個參數(shù)是測試用例要執(zhí)行的命令。

test_expect_success 'initial checksum' ' 
(
cd bare.git &&
git checksum --init &&
test -f info/checksum &&
test -f info/checksum.log
) &&
cat >expect <<-EOF &&
INFO[<time>]: initialize checksum
EOF
cat bare.git/info/checksum.log |
sed -e "s/\[.*\]/[<time>]/" >actual &&
test_cmp expect actual
'

當(dāng) test_expect_success 方法后面是三個參數(shù)時,第一個參數(shù)是前置條件, 第二個參數(shù)用于描述測試用例, 第三個參數(shù)是測試用例要執(zhí)行的命令。

例如如下有三個參數(shù)的測試,第一個參數(shù)定義了前置條件,在 CYGWIN 等環(huán)境, 不執(zhí)行測試用例。

test_expect_success !MINGW,!CYGWIN \ 
’correct handling of backslashes' '
rm -rf whitespace &&
mkdir whitespace &&
>"whitespace/trailing 1 " &&
>"whitespace/trailing 2 \\\\" &&
>"whitespace/trailing 3 \\\\" &&
>"whitespace/trailing 4 \\ " &&
>"whitespace/trailing 5 \\ \\ " &&
>"whitespace/trailing 6 \\a\\" &&
>whitespace/untracked &&
sed -e "s/Z$//" >ignore <<-\EOF &&
whitespace/trailing 1 \ Z
whitespace/trailing 2 \\\\Z
whitespace/trailing 3 \\\\ Z
whitespace/trailing 4 \\\ Z
whitespace/trailing 5 \\ \\\ Z
whitespace/trailing 6 \\a\\Z
EOF
echo whitespace/untracked >expect &&
git ls-files -o -X ignore whitespace >actual 2>err &&
test_cmp expect actual &&
test_must_be_empty err
'

八 Sharness 語法規(guī)范和技巧

使用 && 級聯(lián)各個命令,確保所有命令都全部執(zhí)行成功

test_expect_success 'shared: create new objects and packs' ' 
create_commits_in "$shared_repo" X Y Z &&
create_pack_in "$shared_repo" Px1 <<-EOF &&
$X
$Y
$Z
$A
$B
$C
EOF
create_pack_in "$shared_repo" Px2 <<-EOF
$X
$Y
$Z
$D
$E
$F
EOF
'

自定義方法,也要使用 && 級聯(lián),確保命令全部執(zhí)行成功

create_pack_in () { 
repo="$1" &&
name="$2" &&
pack=$(git -C "$repo/objects/pack" pack-objects -q pack) &&
eval $name=$pack &&
eval P$pack=$name:$pack
}

涉及到目錄切換,在子 Shell 中進(jìn)行,以免影響后續(xù)測試用例執(zhí)行時的工作目錄

test_expect_success 'master: one of pack-2/pack-3 is redundant' ' 
create_pack_in "$master_repo" P4 <<-EOF &&
$J
$K
$L
$M
$P
EOF
create_pack_in "$master_repo" P5 <<-EOF &&
$G
$H
$N
$O
EOF
(
cd "$master_repo" &&
cat >expect <<-EOF &&
P3:$P3
EOF
git pack-redundant --all >out &&
format_packfiles <out >actual &&
test_cmp expect actual
)
'

函數(shù)命名要有意義

如下內(nèi)容是 Junio 在代碼評審時,對測試用例中定義的 format_git_output 方法的評審意見。Junio 指出要在給函數(shù)命名時,要使用更有意義的名稱。

> +format_git_output () { 

Unless this helper is able to take any git output and massage,
please describe what kind of git output it is meant to handle.

Also, "format" does not tell anything to the readers why it wants to
transform its input or what its output is supposed to look like. It
does not help readers and future developers.

Heredoc 的小技巧

使用 heredoc 創(chuàng)建文本文件,如果其中的腳本要定義和使用變量,要對變量中的 $ 字符進(jìn)行轉(zhuǎn)移。Junio 給出了一個 heredoc 語法的小技巧,可以無需對 $ 字符轉(zhuǎn)義。

> + 
> + # setup pre-receive hook
> + cat >upstream/hooks/pre-receive <<-EOF &&

Wouldn't it make it easier to read the resulting text if you quoted
the end-of-here-text marker here, i.e. "<<\-EOF"? That way, you can
lose backslash before $old, $new and $ref.

> + #!/bin/sh
> +
> + printf >&2 "# pre-receive hook\n"
> +
> + while read old new ref
> + do
> + printf >&2 "pre-receive< \$old \$new \$ref\n"
> + done
> + EOF

Shell 編程語法規(guī)范

Git 項(xiàng)目對于 Shell 編寫的測試用例制定了語法規(guī)范,例如:

  • 使用 tab 縮進(jìn)。
  • 規(guī)定 case 語句、if 語句的縮進(jìn)格式。
  • 輸入輸出重定向字符后面不要有空格。
  • 使用 $(command) 而不是 `command` 。
  • 使用 test 方法,不要使用 [ ... ] 。

完整語法規(guī)范參考[5]。

九 sharness 常見的內(nèi)置函數(shù)

  • test_expect_success

開始一個測試用例。

  • test_expect_failure

標(biāo)記為存在已知問題,執(zhí)行失敗不報錯,執(zhí)行成功則警告該 broken 的用例已經(jīng) fixed。

  • test_must_fail

后面的一條命令必須失敗。如果后面命令成功,測試失敗。

  • test_expect_code

命令以給定返回值結(jié)束。

  • test_cmp

比較兩個文件內(nèi)容,相同成功,不同失敗并顯示差異。

  • test_path_is_file

參數(shù)必須是一個文件,且存在。

  • test_path_is_dir

參數(shù)必須是一個目錄,且存在。

  • test_must_be_empty

參數(shù)指向的文件內(nèi)容必須為空。

  • test_seq

跨平臺的 seq,用戶生成數(shù)字序列。

  • test_pause

測試暫停,進(jìn)入子 Shell。

  • test_done

測試用例結(jié)束。

十 擴(kuò)展 Sharness

Sharness 提供了擴(kuò)展功能。用戶在 sharness.d 目錄中添加以 .sh 結(jié)尾的腳本文件,即可對 Sharness 進(jìn)行擴(kuò)展。例如:

  • 在 trash directory.* 目錄下執(zhí)行 git init 命令。目的是避免目錄逃逸時誤執(zhí)行 git 命令影響項(xiàng)目本身代碼。

例如:測試腳本在工作區(qū)下創(chuàng)建了一個倉庫(git init my.repo),想要在該倉庫下執(zhí)行 git clean,卻忘了進(jìn)入到 my.repo 子目錄再執(zhí)行,結(jié)果導(dǎo)致待測試項(xiàng)目中丟失文件。

  • 引入 Git 項(xiàng)目中的一些有用的測試方法。

如:test_tick 方法,可以設(shè)置 GIT_AUTHOR_DATE、GIT_COMMITTER_DATE 等環(huán)境變量,確保測試腳本多次運(yùn)行時提交時間的一致性,進(jìn)而產(chǎn)生一致的提交ID。

  • 引入項(xiàng)目需要的其他自定義方法。

例如 git-repo 項(xiàng)目為了避免工作區(qū)逃逸,在 trash directory.* 目錄下創(chuàng)建 .repo 文件。

十一 Sharness 在項(xiàng)目中的實(shí)戰(zhàn)

git-repo 是一個命令行工具,非常適合使用 sharness 測試框架編寫測試用例。參見[6]。

對于非命令行工具,或者為了測試內(nèi)置函數(shù),需要先封裝一個或多個 fake app,再調(diào)用封裝的命令行工具進(jìn)行測試。例如在為 Git 項(xiàng)目開發(fā) proc-receive 鉤子擴(kuò)展時,先開發(fā)一個 fake app[7]。

之后再編寫測試,調(diào)用 fake app(test-tool proc-receive),幫助完成測試用例的開發(fā)。參見下列提交中的測試用例[8]。

還可以使用一些 Shell 編程技巧,在多個測試文件中復(fù)用測試用例。例如如下測試用例在測試 HTTP 協(xié)議和本地協(xié)議時,復(fù)用了同一套測試用例(t5411目錄下的測試腳本)[9]。

相關(guān)鏈接

[1]https://www.worldhello.net/2013/10/26/test-gistore-using-git-test-framework.html

[2]https://sourcegraph.com/github.com/git/git@master/-/tree/t

[3]https://github.com/git/git/blob/master/t/t5323-pack-redundant.sh

[4]https://github.com/alibaba/git-repo-go/blob/master/test/t0100-init.sh

[5]https://github.com/git/git/blob/master/Documentation/CodingGuidelines

[6]https://github.com/alibaba/git-repo-go

[7]https://github.com/jiangxin/git/blob/jx/proc-receive-hook/t/helper/test-proc-receive.c

[8]https://github.com/jiangxin/git/commit/9654f5eda1153634ab09ca5c6e490bcabdd57e61

[9]https://github.com/jiangxin/git/blob/jx/proc-receive-hook/t/t5411-proc-receive-hook.sh還分享了 Sharness 的擴(kuò)展功能和項(xiàng)目實(shí)戰(zhàn)。

【本文為51CTO專欄作者“阿里巴巴官方技術(shù)”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

??戳這里,看該作者更多好文??

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2020-11-04 16:34:45

單元測試技術(shù)

2021-03-04 15:43:29

前端測試工具開發(fā)

2011-05-16 15:18:18

測試用例

2011-06-08 17:23:12

測試用例

2021-12-22 10:19:47

鴻蒙HarmonyOS應(yīng)用

2022-05-10 14:54:13

驗(yàn)收標(biāo)準(zhǔn)測試用例

2011-05-16 15:09:20

測試用例

2011-04-18 10:46:39

接口測試

2020-07-10 12:06:28

WebpackBundleless瀏覽器

2011-05-16 14:54:12

測試用例

2022-01-19 17:48:57

測試用例開發(fā)

2011-07-04 18:06:52

測試用例

2023-06-09 15:24:50

UiTest接口鴻蒙

2011-12-23 17:03:29

性能測試用例設(shè)計

2022-06-13 09:00:00

Selenium測試Web

2011-09-01 10:05:24

PhoneGap應(yīng)用程序測試

2020-12-02 08:31:47

Elasticsear

2022-06-17 11:10:43

PandasPolarsPython

2025-05-27 01:45:00

DeepSeekPython測試

2024-09-29 15:26:53

MySQLPython
點(diǎn)贊
收藏

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

国产精品不卡视频| 日韩精品一卡二卡三卡四卡无卡| 日韩精品在线一区二区| 国产玉足脚交久久欧美| 日韩电影免费| 久久精品国产亚洲aⅴ| 欧美夫妻性生活xx| 久久丫精品忘忧草西安产品| 亚洲成人1区| 亚洲欧洲国产精品一区| 国产清纯白嫩初高生在线观看91| 成人国产精品色哟哟| xxxx 国产| 日韩欧美网站| 亚洲精品美女久久久久| 成人日韩在线视频| 日韩伦理在线| 1024亚洲合集| 欧美日韩一区二区三区在线观看免 | 欧美一级网址| 激情久久av一区av二区av三区| 性刺激综合网| 五月天婷婷视频| 韩国av一区二区| 欧洲日本亚洲国产区| 国产精品视频一区二区三 | 精品成人私密视频| 欧美日韩中文不卡| 亚洲黄色中文字幕| 亚洲午夜私人影院| 国产精品亚洲天堂| 99reav在线| 久久一区二区三区四区| 国产精品初高中精品久久| 亚洲自拍第二页| 狂野欧美一区| 欧美性视频精品| 国产一级做a爱免费视频| 天天精品视频| 最新国产精品亚洲| 亚洲精品91在线| 先锋影音国产精品| 亚洲国产精品人人爽夜夜爽| wwwxxxx在线观看| 日韩综合久久| 欧美日韩在线精品一区二区三区激情| 青青草原av在线播放| 成人三级高清视频在线看| 一区二区免费视频| www.99riav| www红色一片_亚洲成a人片在线观看_| 国产精品免费久久| 香蕉久久夜色| 三区四区电影在线观看| 亚洲国产高清aⅴ视频| 欧美第一黄网| 久久电影中文字幕| 久久久久国产成人精品亚洲午夜| 麻豆av一区| 人成免费电影一二三区在线观看| 99精品视频在线观看| 精品国产乱码久久久久久郑州公司| 亚洲国产精品二区| 成人h精品动漫一区二区三区| 国产成人亚洲欧美| 天堂在线资源网| 91在线精品一区二区| 久久综合婷婷综合| 国产在线网站| 中文字幕一区在线观看| 五月天在线免费视频| av网站大全在线| 亚洲午夜久久久| 18岁网站在线观看| 香蕉视频亚洲一级| 欧美日韩不卡视频| 日本成人在线免费| 99ri日韩精品视频| 日韩电影网在线| 少妇真人直播免费视频| 精品视频免费| 欧美另类交人妖| 亚洲一区 视频| 亚洲专区一区二区三区| 国产精品色婷婷视频| 国产在成人精品线拍偷自揄拍| 国产一区二区电影| 精品乱码一区二区三区| 国产1区2区3区在线| 中文字幕一区二| 国产真实老熟女无套内射| 小h片在线观看| 色婷婷久久综合| 青青草精品在线| 亚洲精品白浆高清| 日韩亚洲欧美成人| 黄页网站免费观看| 水蜜桃久久夜色精品一区的特点| 国产免费久久av| 黄色福利在线观看| 国产精品女人毛片| 你真棒插曲来救救我在线观看| 日韩成人高清| 日韩欧美中文字幕公布| 欧美老熟妇乱大交xxxxx| 亚洲欧美网站在线观看| 7777免费精品视频| 91尤物国产福利在线观看| 成人免费视频caoporn| 欧美另类网站| 狂野欧美性猛交xxxxx视频| 色婷婷久久久久swag精品| www日本在线观看| 欧美一区二区三区高清视频| 韩日欧美一区二区| 国产女18毛片多18精品| 久久久精品国产99久久精品芒果| 成人午夜免费剧场| 国产精品第一国产精品| 日韩成人中文字幕在线观看| 三级影片在线看| 日韩精品三区四区| 韩国一区二区三区美女美女秀| 麻豆最新免费在线视频| 在线观看日韩高清av| 中文字幕精品视频在线| 欧美日韩调教| 91久久久久久久一区二区| 国产高清视频在线| 精品人伦一区二区三区蜜桃免费| 国产又粗又猛又爽又黄| 日韩在线中文| 国产成人一区二区三区| 同心难改在线观看| 亚洲一区二区三区美女| 成人免费播放视频| 中文字幕一区二区三区乱码图片| 国产精品三级网站| 超碰免费在线| 欧美性极品少妇| av黄色免费网站| 国产毛片一区| 久久99精品国产99久久| 丁香花电影在线观看完整版| 日韩欧美国产一区二区在线播放| 日韩一区二区不卡视频| 国产一区二区三区日韩| 中文字幕成人一区| 99热这里有精品| 日韩在线观看精品| 国产美女明星三级做爰| 国产精品高潮久久久久无| 色天使在线观看| 久久在线视频免费观看| 成人a视频在线观看| 欧美激情二区| 在线不卡一区二区| 91高清免费看| 懂色av一区二区夜夜嗨| 欧美大黑帍在线播放| 日韩精品成人在线观看| 欧美国产日韩在线| 亚洲精品一级片| 天天免费综合色| 无码人妻精品一区二区三应用大全| 国产欧美不卡| 欧日韩一区二区三区| 性欧美freehd18| 中文字幕久久亚洲| 97超碰人人草| 亚洲成人福利片| 日本黄色片在线播放| 丝袜美腿亚洲一区二区图片| 亚洲日本精品国产第一区| 亚洲一区导航| 国模吧一区二区三区| 你懂的在线看| 欧美日韩国产另类一区| 成年人av电影| 91网址在线看| 日本黄大片一区二区三区| 欧美久久一级| 欧美日韩综合另类| 成人豆花视频| 国内免费精品永久在线视频| 毛片网站在线观看| 欧美精品日韩精品| 国产无遮挡免费视频| 久久久美女毛片| а 天堂 在线| 国产亚洲综合精品| 国产日韩视频在线播放| 国产精品久久久网站| 国产精品亚洲欧美导航| 色操视频在线| 尤物九九久久国产精品的分类| 国产亲伦免费视频播放| 欧美日韩在线免费观看| 午夜三级在线观看| 2017欧美狠狠色| 一级黄色在线播放| 亚洲免费影院| 777久久精品一区二区三区无码 | 九九视频免费在线观看| 2021国产精品久久精品| 婷婷激情综合五月天| 99热精品在线观看| 成人在线观看www| 国产一区二区三区四区| 国产精品久久久久久久免费大片 | 羞羞的视频在线观看| 亚洲免费电影一区| www.成人免费视频| 欧美三区在线观看| 亚洲第一精品在线观看 | 波多野结衣三级在线| 五月综合久久| 91传媒在线免费观看| 国产极品久久久久久久久波多结野| 欧美国产日韩视频| 国产三区视频在线观看| 国产小视频国产精品| 手机av免费在线观看| 欧美一区二区三级| 伊人影院中文字幕| 色综合欧美在线视频区| 日本五十路女优| 一区二区三区免费在线观看| 懂色av粉嫩av蜜臀av一区二区三区| 91亚洲精品久久久蜜桃| 97中文字幕在线观看| 寂寞少妇一区二区三区| 黄色手机在线视频| 日本在线播放一区二区三区| 可以在线看的av网站| 欧美午夜电影在线观看| 2021狠狠干| 中文字幕乱码亚洲无线精品一区| 亚洲激情图片| 日韩在线不卡| 亚洲欧洲一二三| 日本道不卡免费一区| 色视频一区二区三区| 欧美精品一二| 日本一区二区视频| 欧美日韩第一| 午夜老司机精品| 日韩精品久久久久久久电影99爱| 日韩欧美第二区在线观看| 国产欧美日韩精品高清二区综合区| 久久精品国产综合精品| 亚州综合一区| 欧美一区二区三区四区夜夜大片 | 日韩美女在线看免费观看| 欧洲s码亚洲m码精品一区| 亚洲免费福利| 国产精品电影观看| 精品九九久久| 91视频-88av| 一区二区三区亚洲变态调教大结局 | 成人免费高清在线| 精品人妻伦一二三区久| 91在线视频18| 中文字幕第24页| 中文字幕在线观看不卡视频| 欧美日韩在线观看免费| 亚洲无人区一区| 天天综合网入口| 色香蕉久久蜜桃| 糖心vlog精品一区二区| 欧美日韩高清影院| 国产三级自拍视频| 亚洲第一中文字幕| 国内三级在线观看| 日韩在线视频中文字幕| 天堂av资源在线观看| 久久免费视频网站| 性高爱久久久久久久久| 成人在线视频福利| 大陆精大陆国产国语精品| 久久综合毛片| 天天射—综合中文网| www.国产在线视频| 天堂一区二区在线| 99999精品| 99re热这里只有精品视频| 亚洲ⅴ国产v天堂a无码二区| 亚洲蜜臀av乱码久久精品| 黄色一级片免费看| 欧美视频在线一区| 亚洲国产成人一区二区| 亚洲人免费视频| 91三级在线| 日韩av片电影专区| 日韩精品一区二区三区中文在线 | 一区二区三区欧美日韩| 国产成人精品一区二三区| 欧美日韩视频专区在线播放| 老熟妇高潮一区二区高清视频| 亚洲一区www| av小说在线播放| 成人精品aaaa网站| 性欧美lx╳lx╳| 99久久99久久精品| 日本午夜一区二区| 奇米777第四色| 国产精品灌醉下药二区| 麻豆久久久久久久久久| 欧美一级黄色片| 香蕉视频免费在线播放| 91精品国产成人www| 国产精品美女久久久久人| 青青草成人网| 制服诱惑一区二区| wwwxxxx在线观看| 国产精品白丝在线| 国产女主播喷水视频在线观看 | 97免费公开视频| 中文一区二区在线观看| 国产精品黄色大片| 精品国产一区二区在线观看| 日本在线免费中文字幕| 日本中文字幕久久看| 国产欧美三级电影| 九九久久九九久久| 久久99精品视频| 性欧美精品男男| 色偷偷久久一区二区三区| 深夜福利视频网站| 午夜精品久久17c| 97一区二区国产好的精华液| 综合久久国产| 精品一区二区综合| 国产精品久久久视频| 色综合天天性综合| 欧美女优在线观看| 欧美洲成人男女午夜视频| 福利片一区二区| 欧美中文字幕在线观看视频| 国产尤物一区二区在线| 5566中文字幕| 欧美一区二区三区啪啪| 成人无遮挡免费网站视频在线观看| 国产精品网址在线| 成人激情免费视频| 激情综合网俺也去| 国产日产欧美一区二区三区| 亚洲av无码不卡| 亚洲网站在线观看| 成人国产一区| 在线观看国产一区| 久久99精品久久久久| 91免费公开视频| 91精品国产福利| 日本在线视频网址| 国产二区一区| 一区二区三区国产盗摄| 变态另类丨国产精品| 色综合色综合色综合色综合色综合 | 国产精品白丝jk黑袜喷水| 欧美精品入口蜜桃| 精品成人一区二区三区四区| 欧美aa在线观看| 奇米视频888战线精品播放| 男女男精品视频| 国产视频精品免费| 日韩欧美亚洲国产精品字幕久久久| 久久久123| 久久av免费观看| 日韩福利视频网| 97精品在线播放| 精品国产123| 超级碰碰久久| 亚洲一区bb| 成人免费视频免费观看| 波多野结衣啪啪| 精品国内自产拍在线观看| 中文字幕视频精品一区二区三区| 无码人妻精品一区二区蜜桃网站| 不卡的看片网站| 日本中文字幕在线观看视频| 久久综合电影一区| 久久亚洲道色| 亚洲一区二区三区四区五区xx| 亚洲免费在线看| 少妇人妻偷人精品一区二区| 国产精品高潮呻吟视频| 中文字幕一区二区精品区| 色呦呦一区二区| 欧美日韩一区视频| 91超碰在线免费| 亚洲国产激情一区二区三区| 国产成人鲁色资源国产91色综| 中文字幕亚洲精品一区| 伦理中文字幕亚洲| 亚洲色图丝袜| 日韩av加勒比| 色综合久久中文字幕综合网| 99视频免费在线观看| 欧美日韩精品免费观看视一区二区|