精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

日本在线视频播放| 久久精品日产第一区二区三区| 男人天堂资源网| www.国产福利| 日韩大胆人体| 免费成人在线视频观看| 欧美成人三级视频网站| 小毛片在线观看| 日本黄色一区| 亚洲成人免费观看| 性欧美大战久久久久久久免费观看| 97成人免费视频| 宅男噜噜噜66一区二区| 日韩亚洲欧美成人| 特级西西人体wwwww| 涩涩涩久久久成人精品| 大桥未久av一区二区三区| 中文字幕一区二区三区精彩视频| 日韩在线视频观看免费| 蜜桃免费网站一区二区三区| 久久男人av资源网站| 亚洲自拍偷拍图| 成人福利免费在线观看| 欧美在线999| 日本在线xxx| 黄色免费在线观看网站| 91婷婷韩国欧美一区二区| 91性高湖久久久久久久久_久久99| 国产手机在线视频| 一级欧洲+日本+国产| 一本色道久久88亚洲综合88| 99久久久无码国产精品性波多| www.久久| 色哟哟亚洲精品| 成年人午夜免费视频| 免费高清完整在线观看| 国产欧美日韩久久| 久久久久久国产精品免费免费| 国产精品自在线| 国产视频123区| 亚洲图区在线| 日韩成人av在线播放| 国产精品19p| 国产一区二区高清在线| 欧美精品乱人伦久久久久久| 黄色成人免费看| 精品国产免费人成网站| 精品国产乱码久久久久酒店 | 99久久精品无免国产免费| 三级欧美在线一区| 人人做人人澡人人爽欧美| 午夜影院在线看| 99国产精品久久久久久久成人热| 久久69精品久久久久久久电影好 | yjizz视频网站在线播放| 91美女视频网站| 麻豆视频成人| 欧美美乳在线| 久久久久久久久久久久久夜| 欧美国产一二三区| 久久伊伊香蕉| 久久久精品人体av艺术| 欧美日韩在线精品一区二区三区| 你懂的视频在线播放| 久久无码av三级| 日本中文不卡| 国产精品四虎| 国产精品传媒在线| 超碰在线免费观看97| 国产原创精品视频| 一区二区三区国产| 国产欧美日韩小视频| 国产福利电影在线播放| 欧美日韩精品在线| 日本在线观看a| 91精品国产66| 91精品国产色综合久久不卡电影 | 久久成年人视频| 伊人久久青草| 香蕉视频免费在线播放| 综合电影一区二区三区 | 国产精品福利导航| 欧美人妖在线| 日韩一区二区精品视频| 国产在线观看成人| 美女被久久久| 91精品国产综合久久久久久久久 | 成人午夜电影小说| 久久免费99精品久久久久久| 高清在线观看av| 亚洲天堂免费看| 国产精品宾馆在线精品酒店| 最新日韩三级| 日韩一区二区精品| 亚洲熟妇一区二区三区| 亚欧美无遮挡hd高清在线视频| 欧美激情a在线| 人人妻人人爽人人澡人人精品| 韩国欧美一区二区| 久久精品午夜一区二区福利| 日本最新在线视频| 欧美日韩一区二区精品| 午夜不卡福利视频| 在线日韩网站| 欧美另类暴力丝袜| 中文无码av一区二区三区| 国产不卡视频在线观看| 午夜精品美女久久久久av福利| 日韩激情美女| 欧美日韩一区三区四区| 色综合久久五月| 91精品国产乱码久久久久久| 欧美中文字幕第一页| 国产丰满美女做爰| 欧美国产禁国产网站cc| 欧美视频在线观看网站| 国产精品一区免费在线| 亚洲小视频在线观看| 久艹视频在线观看| 久久99国产精品久久99| 欧美激情一区二区三区在线视频| 日韩欧美极品在线观看| 久久久久久亚洲精品不卡| 亚洲va在线观看| 丁香婷婷综合色啪| 一本色道久久99精品综合| 51av在线| 日韩精品一区二区三区swag| 一二三四国产精品| 麻豆九一精品爱看视频在线观看免费| 99热在线国产| 国产写真视频在线观看| 欧美日韩一区二区三区在线| 97人妻精品一区二区免费| 好看不卡的中文字幕| 91网在线免费观看| 欧美激情午夜| 欧美日韩一区二区三区免费看| 欧美多人猛交狂配| 亚洲精品九九| 国产亚洲欧美一区二区三区| 亚洲国产精品精华素| 91精品国产综合久久精品app| 91社区视频在线观看| 亚洲欧美成人综合| 久久久7777| 欧美男男激情videos| 日韩av网站大全| 国产精品成人av久久| 国产.欧美.日韩| 天天操天天干天天玩| 亚洲国产综合在线观看| 日韩网站免费观看高清| 在线不卡免费视频| 中文字幕亚洲欧美在线不卡| www.超碰97.com| 久久精品国内一区二区三区水蜜桃| 国产在线a不卡| av电影免费在线观看| 精品噜噜噜噜久久久久久久久试看| 国产乱国产乱老熟300| 福利视频网站一区二区三区| 一卡二卡三卡视频| 欧美男男freegayvideosroom| 97婷婷大伊香蕉精品视频| 亚洲色图欧美视频| 色诱视频网站一区| 精品在线观看一区| 国产精品888| 免费一级特黄毛片| 久久综合欧美| 日韩欧美电影一区| 欧美国产综合视频| 2022成人影院| 日韩在线免费av| 国产熟女一区二区三区四区| 亚洲午夜在线观看视频在线| 久久午夜夜伦鲁鲁片| 久久中文欧美| 在线免费观看成人| 精品三级在线观看视频| 国产aaa精品| 国产原厂视频在线观看| 亚洲精品美女在线| 97人妻精品一区二区三区动漫| 一区二区三区精品视频| 免费黄色在线视频| 韩国视频一区二区| 国产免费一区二区三区视频| 日韩av有码| 国产传媒一区二区| 成人免费av电影| 欧美区在线播放| 国产九色在线| 亚洲成人黄色在线| 中文字幕在线视频第一页| 亚洲一区在线观看网站| 蜜桃久久精品成人无码av| 国产成人精品三级麻豆| www日韩视频| 狠狠色丁香久久综合频道| 日本一区二区高清视频| 一区二区三区亚洲变态调教大结局 | 欧美一区二区视频97| 日本高清在线观看wwwww色| 欧美精品一区男女天堂| 亚洲在线视频播放| 动漫精品一区二区| 欧美成人一区二区三区高清| 久久精品一区二区三区av| 风韵丰满熟妇啪啪区老熟熟女| 日本大胆欧美人术艺术动态| 五月丁香综合缴情六月小说| 久久国产电影| 日本不卡在线播放| 菁菁伊人国产精品| 91久久伊人青青碰碰婷婷| 成人亚洲综合| 国产v综合ⅴ日韩v欧美大片 | 亚洲国产精品自拍| 久草手机视频在线观看| 国产亚洲综合性久久久影院| 亚洲av成人片无码| 国产东北露脸精品视频| 色先锋aa成人| 粉嫩精品久久99综合一区| 91丨porny丨国产入口| 国产女主播在线播放| 精品一区二区久久久| 激情婷婷综合网| 亚洲午夜av| 9191国产视频| 一本一本久久a久久综合精品| 艳色歌舞团一区二区三区| 欧美人与物videos另类xxxxx| 精品亚洲一区二区三区四区五区高| 精品国产亚洲一区二区三区大结局| 国产精品男人的天堂| 老司机2019福利精品视频导航| 91精品国产电影| 三级在线看中文字幕完整版| 97免费中文视频在线观看| 欧美人与禽猛交乱配| 九色精品美女在线| 日本大片在线播放| 欧美福利小视频| 波多野结衣在线高清| 欧美激情一级精品国产| 中文字幕在线观看播放| 色综合男人天堂| 福利在线导航136| 亚州国产精品久久久| 国产在线观看www| 欧美亚洲国产视频小说| 成人国产二区| 国产精品免费电影| 亚洲人成777| 91福利视频导航| 99久久免费精品国产72精品九九| 国产精品av一区| 麻豆一区二区| 日本午夜精品一区二区三区| 欧美日一区二区| 99热一区二区三区| 亚洲成人中文| 成年人免费大片| 久久se这里有精品| 久久久久99人妻一区二区三区| 成人激情午夜影院| 亚洲午夜久久久久久久久红桃| 国产女人aaa级久久久级| 国产在线观看免费视频软件| 亚洲欧美另类久久久精品| 国产精品999久久久| 色先锋资源久久综合| 国产精品欧美亚洲| 亚洲国产成人91精品| 国产在线观看网站| 久热在线中文字幕色999舞| sm捆绑调教国产免费网站在线观看| 欧美专区日韩视频| 亚洲午夜国产成人| 精品国产中文字幕| 日韩在线观看| 日韩av在线免费观看| 国产精品欧美久久久久天天影视| 精品久久久久香蕉网| 欧美女v视频| 欧美成人精品不卡视频在线观看| www.youjizz.com在线| 国产精品久久9| 午夜电影一区| 日韩av一级大片| 国模一区二区三区| 中文字幕在线观看第三页| 国产成人在线免费| 中国女人特级毛片| 亚洲国产一区二区a毛片| 最近中文字幕在线观看视频| 精品国产亚洲一区二区三区在线观看| 女人偷人在线视频| 国内揄拍国内精品| 亚洲一区有码| 视频一区视频二区视频| 国语自产精品视频在线看8查询8| 三级在线免费看| 成人av在线影院| 欧美爱爱免费视频| 在线视频你懂得一区| 欧美一级在线免费观看 | 一区二区伦理片| 亚洲综合在线免费观看| 亚洲无码久久久久| 亚洲精品一区二区网址| 欧美韩日亚洲| 成人高清视频观看www| 国产精品美女久久久久久不卡| 被灌满精子的波多野结衣| 国内精品久久久久影院一蜜桃| 久久精品国产亚洲av久| 午夜久久久久久久久| 99产精品成人啪免费网站| 在线播放国产一区中文字幕剧情欧美 | 国产成人精品一区二区无码呦 | 欧美精品777| 国产福利小视频在线观看| 国产91精品高潮白浆喷水| 日韩高清在线观看一区二区| 在线精品日韩| 九九在线精品视频| 国产一二三四视频| 在线观看网站黄不卡| 你懂的在线播放| 青青久久aⅴ北条麻妃| 日本天堂一区| 波多野结衣家庭教师在线播放| 从欧美一区二区三区| 九九热这里有精品视频| 日韩亚洲电影在线| av在线导航| 99re在线播放| 午夜精品久久久久99热蜜桃导演 | 真人bbbbbbbbb毛片| 蜜桃传媒麻豆第一区在线观看| 欧美激情aaa| 色婷婷综合久久| 国内在线免费高清视频| 国产91色在线免费| 国产一区二区三区不卡视频网站| 日韩毛片在线免费看| 91老师国产黑色丝袜在线| 超碰超碰超碰超碰| 亚洲欧洲午夜一线一品| 嫩草伊人久久精品少妇av杨幂| 亚洲成人自拍视频| 精品在线你懂的| 久久久久久久9999| 日韩国产高清视频在线| 自拍视频在线看| 先锋在线资源一区二区三区| 精品亚洲国产成人av制服丝袜| 欧美日韩在线观看免费| 精品人在线二区三区| 福利小视频在线| 欧美男人的天堂| 久久精品国产77777蜜臀| 日本妇女毛茸茸| 欧美精品一区二区三区一线天视频| 日韩激情电影免费看| 色视频一区二区三区| 精品一二三四在线| 国产午夜视频在线| 亚洲欧美中文日韩在线v日本| 精品久久毛片| 久艹在线免费观看| 久久久www免费人成精品| 国产乱码久久久| 欧美制服第一页| 一本精品一区二区三区| 欧美熟妇精品黑人巨大一二三区| 在线这里只有精品| a级网站在线播放| 久久久久久久久一区二区| 久久国产夜色精品鲁鲁99| 豆国产97在线 | 亚洲| 亚洲午夜小视频| 日韩在线精品强乱中文字幕| 男人靠女人免费视频网站 | 国产高潮流白浆| 亚洲精品99久久久久| 亚洲人成777| 黄色影院一级片| 亚洲欧美日韩精品久久久久| 亚洲人成色777777精品音频| 成人一区二区电影| 亚洲一区二区三区四区五区午夜| 日本视频在线免费| 日韩精品免费在线播放| 日韩成人精品| 爱爱爱爱免费视频|