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

Go應(yīng)用單元測試實踐

原創(chuàng) 精選
開發(fā) 前端
單元測試由aone實驗室腳本觸發(fā),Java服務(wù)收到單測任務(wù)后調(diào)起單測腳本并執(zhí)行,最后由aone實驗室輪詢運行結(jié)果。

一、背景

高德打車運營的應(yīng)用大多基于go進行開發(fā)的,我們希望在預(yù)集成環(huán)境下,當(dāng)研發(fā)部署完代碼,能自動觸發(fā)單元測試和接口自動化測試,并生成覆蓋率報告。參考了許多篇關(guān)于go單元測試的文章,有的缺少行增量覆蓋率,有的缺少case運行結(jié)果/case運行日志。

本文旨在搭建一個穩(wěn)定運行且維護成本低的單元測試/集成測試環(huán)境。

二、單元測試

1.單測運行概述

圖1 單測運行流程圖

aone作為阿里巴巴集團數(shù)字化研發(fā)協(xié)同平臺,本身提供了各種集成測試實驗室,實驗室中可以運行自定義腳本。如圖1所示,為單元測試運行流程圖。單元測試由aone實驗室腳本觸發(fā),Java服務(wù)收到單測任務(wù)后調(diào)起單測腳本并執(zhí)行,最后由aone實驗室輪詢運行結(jié)果。之所以不在單測實驗室腳本中直接運行單測,主要存在以下兩個原因。一是單測的運行依賴GO環(huán)境,以及一些生成覆蓋率文件所需的三方工具。目前aone實驗室不支持自定義鏡像接入,每次運行都需要安裝環(huán)境,安裝環(huán)境的耗時遠(yuǎn)大于運行單測。二是每個應(yīng)用的單測運行命令可能不太一樣,一旦應(yīng)用數(shù)目較多,如果單測腳本需要調(diào)整,更改的成本比較高。因此啟動一個JAVA服務(wù)(完全可以復(fù)用已有的服務(wù),降低成本),將運行單測所需要的腳本,以及環(huán)境都打包在這個服務(wù)上。aone上的實驗室腳本,只進行單測任務(wù)的下發(fā)、輪詢和運行結(jié)果的展示。具體流程如下:

  • 當(dāng)開發(fā)在預(yù)集成環(huán)境提交代碼、部署完成之后,流程自動運行單測實驗室。單測實驗室里的腳本,先調(diào)用任務(wù)下發(fā)接口/unit/taskReceive,這時Java服務(wù)會調(diào)用對應(yīng)的單測腳本。
  • 由于單測腳本運行時間會比較長,所以/unit/taskReceive接口會超時。在單測腳本正在運行的時候,單測實驗室的腳本會一直調(diào)用/unit/taskQuery接口,查詢此次單測任務(wù)的狀態(tài),直到返回正確結(jié)果為止。
  • 當(dāng)單測腳本完成時,會回調(diào)任務(wù)完成接口/unit/taskSave接口,將結(jié)果存起來。這樣單測實驗室腳本再調(diào)用/unit/taskQuery接口查詢時,就會返回此次單測的結(jié)果。
  • 單測實驗室腳本,根據(jù)任務(wù)返回的結(jié)果,將單測結(jié)果解析、展示。

2.環(huán)境搭建

將所需的環(huán)境,打包到Java服務(wù)的docker中:

  • golang安裝

go單測需要運行g(shù)o test,所以需要在環(huán)境中安裝go。安裝完成后,配置環(huán)境變量和代理。

wget https://golang.google.cn/dl/go1.17.8.linux-amd64.tar.gz
tar -zxvf go1.17.8.linux-amd64.tar.gz -C /usr/local/
mkdir -p /${your go path dir}/gopath
echo -e "export PATH=\"$PATH:/usr/local/go/bin:/${your go path dir}/gopath/bin\"\nexport GOPATH=\"/${your go path dir}/gopath\"\nexport GOPROXY=\"${go代理地址},direct\"" >> /etc/profile
source /etc/profile
  • 代碼覆蓋率插件安裝

運用一些開源工具,將單測生成的覆蓋文件轉(zhuǎn)換成xml/html格式的覆蓋率文件。主要用到gocov-html,gocov,gocov-xml。參考地址[1][2]。

go get github.com/matm/gocov-html
go get github.com/axw/gocov/...
go get github.com/AlekSi/gocov-xml
  • 行增量覆蓋率工具安裝

利用diff-cover[3],生成行增量覆蓋率。diff-cover依賴python3,python3的安裝可能需要先裝好gcc,automake,autoconf,libtool,make,zlib,zlib-devel openssl。

yum -y install gcc automake autoconf libtool make zlib zlib-devel openssl openssl-devel
wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz
tar -zxvf Python-3.8.1.tgz && cd Python-3.8.1 && ./configure && make && make install
pip3 install diff-cover -i https://mirrors.aliyun.com/pypi/simpl
  • git安裝&配置

運行單元測試時,依賴開發(fā)的代碼。需要配置好一個有代碼權(quán)限的git ssh公鑰和私鑰,用來下載代碼。

yum -y git 
name=`git config user.name`
if [ -z "$name" ]
then
git config --global user.name "xxx"
git config --global user.email "xxxx@xxxx.xxxx.com"
mkdir -p ~/.ssh
cp ${your id_rsa} ~/.ssh/
fi

3.Java服務(wù)實現(xiàn)

單測任務(wù)下發(fā)接口

Path:/unit/taskReceive

Method:POST

Params:{
"taskId": "123456", //可以用日期20220221102104,主要用來標(biāo)識此次單測
"appName":"應(yīng)用A", //應(yīng)用名,根據(jù)應(yīng)用名,選擇運行對應(yīng)的單測腳本。比如應(yīng)用A就會運行應(yīng)用A.sh
"branch":"releases/test-branch-code", //需要運行單測的分支名
"repo":"git@xxxxx.git" //應(yīng)用A的代碼地址,下載代碼之后,才能運行單測
}

Result:返回啥都行,反正會超時。

具體實現(xiàn)邏輯:

  • 在redis中記錄此次單測任務(wù),key:"${appName}${taskId}-unit",value:"ongoing"。以便/unit/taskQuery查詢,從而知道單測還在運行中。
  • 根據(jù)appName參數(shù),選擇執(zhí)行${appName}.sh腳本。如果腳本不存在,就去阿里云對象存儲服務(wù)(Object Storage Service,簡稱OSS)下載腳本(所以,如果單測腳本有更新,就更新下OSS上的腳本,然后刪除運行機器上的${appName}.sh即可。這樣可以不重新部署Java服務(wù),即可更改運行腳本)。${appName}.sh腳本大致邏輯如下:
source /etc/profile

APP_NAME=$1
Branch=$2
TaskId=$3
Repo=$4
DIR=`pwd`
PREFIX=$APP_NAME$TaskId

#生成覆蓋率文件的文件夾
mkdir -p $DIR/$APP_NAME/$TaskId/cover
COVER_FILE=$DIR/$APP_NAME/$TaskId/cover/core.cover
LOG_FILE=$DIR/$APP_NAME/$TaskId/cover/log.txt
COVER_DIR=$DIR/$APP_NAME/$TaskId/cover
UNIT_TEST_RESULT_FILE=$DIR/$APP_NAME/$TaskId/cover/unit_pass.txt

#存放覆蓋率詳情html文件的文件夾
mkdir -p /${your path}/res_unit

#下載代碼
cd $DIR/$APP_NAME/$TaskId
git clone -b $Branch $Repo

#運行單元測試
cd ./$APP_NAME
CONF_DIR=$DIR/$APP_NAME/$TaskId/$APP_NAME/conf
go test ./... -timeout 3m -v -gcflags=-l -cover=true -coverprofile=$COVER_FILE -mod=vendor -args --confDir=$CONF_DIR >> $LOG_FILE

#行增量覆蓋率
gocov convert $COVER_FILE | gocov-xml > $COVER_DIR/coverage.xml
diff-cover $COVER_DIR/coverage.xml --compare-branch=origin/master --html-report $COVER_DIR/report.html > $COVER_DIR/diff.out
tmp=`cat $COVER_DIR/diff.out | grep "Total:" | cut -d ':' -f2`
if [ -n "$tmp" ]
then
echo "CODE_COVERAGE_NAME_UPDATELINES : 行增量"
CODE_COVERAGE_UPDATE_LINES_TOTAL=`cat $COVER_DIR/diff.out | grep "Total:" | cut -d':' -f2 | grep -o -E '[0-9]+'`
miss=`cat $COVER_DIR/diff.out | grep "Missing:" | cut -d ':' -f2 | grep -o -E '[0-9]+'`
CODE_COVERAGE_UPDATE_LINES_COVER=$(( CODE_COVERAGE_UPDATE_LINES_TOTAL - miss))
fi
cp $COVER_DIR/report.html /${your path}/res_unit/${PREFIX}update.html

#代碼行覆蓋率
gocov convert $COVER_FILE | gocov-html > $COVER_DIR/line.html
CODE_COVERAGE_LINES_COVER=`head -n 50 $COVER_DIR/coverage.xml | grep "lines-valid" | awk -F 'lines-covered' '{print $2}' | awk -F ' ' '{print $1}' | grep -o -E '[0-9]+'`
CODE_COVERAGE_LINES_TOTAL=`head -n 50 $COVER_DIR/coverage.xml | grep "lines-valid" | awk -F 'lines-valid' '{print $2}' | awk -F ' ' '{print $1}' | grep -o -E '[0-9]+'`
cp $COVER_DIR/line.html /${your path}/res_unit/${PREFIX}line.html

#case 通過情況
pass=`cat $LOG_FILE | grep -o "\--- PASS: " | wc -l`
fail=`cat $LOG_FILE | grep -o "\--- FAIL: " | wc -l`
echo "************************************" >> $UNIT_TEST_RESULT_FILE
cat $LOG_FILE | grep "\--- FAIL: " >> $UNIT_TEST_RESULT_FILE
echo "************************************" >> $UNITTEST_RESULT_FILE
echo "SUCCESS:" >> $UNIT_TEST_RESULT_FILE
cat $LOG_FILE | grep "\--- PASS: " >> $UNIT_TEST_RESULT_FILE
echo "************************************" >> $UNIT_TEST_RESULT_FILE
iconv -f UTF-8 -t gbk $UNIT_TEST_RESULT_FILE > temp.txt
sed -i 's/ //g;s/---//g' temp.txt
cat temp.txt > $UNIT_TEST_RESULT_FILE
cp $UNIT_TEST_RESULT_FILE /${your path}/res_unit/${PREFIX}pass.txt

#結(jié)果收集
curl -i "http://${your server host}/unit/taskSave" -H "Content-Type:application/json" -X POST -d "{\"taskId\":\"$TaskId\", \"appName\":\"$APP_NAME\", \"branch\": \"$Branch\", \"taskRes\": \"{\\\"code_coverage_update_lines_total\\\":$CODE_COVERAGE_UPDATE_LINES_TOTAL, \\\"code_coverage_update_lines_cover\\\":$CODE_COVERAGE_UPDATE_LINES_COVER,\\\"code_coverage_lines_total\\\":$CODE_COVERAGE_LINES_TOTAL, \\\"code_coverage_lines_cover\\\":$CODE_COVERAGE_LINES_COVER, \\\"fail\\\":$fail, \\\"pass\\\":$pass}\"}"

單測任務(wù)查詢接口

PATH:/unit/taskQuery

METHOD:POST

Params:{
"taskId": "123456", //可以用日期20220221102104,主要用來標(biāo)識此次單測
"appName":"xxxx", //應(yīng)用名,根據(jù)應(yīng)用名,選擇運行對應(yīng)的單測腳本
}

Result:如果單測運行完成,返回code="1",data是單測結(jié)果。如果單測沒完成,返回code="2",data="task ongoing",如果單測運行超過10分鐘,返回code="2",data="redis nil or delay"

單測結(jié)果保存接口

PATH:/unit/taskSave

METHOD:POST

Params:{
"taskId": "123456", //可以用日期20220221102104,主要用來標(biāo)識此次單測
"appName":"xxxx", //應(yīng)用名,根據(jù)應(yīng)用名,選擇運行對應(yīng)的單測腳本。
"taskRes":"{\"code_coverage_update_lines_total\":100,\"code_coverage_update_lines_cover\":100,\"code_coverage_lines_cover\":100,\"code_coverage_lines_total\":100,\"fail\":0,\"pass\":100}" //單測運行結(jié)果
}

Result:成功返回code="1"

4.實驗室配置

如1.1所述,aone實驗室只需要分發(fā)任務(wù)、輪詢?nèi)蝿?wù),以及解析結(jié)果。

TASK_ID=$(date "+%Y%m%d%H%M%S")
APP_NAME=`xxxx`
PREFIX=$APP_NAME$TASK_ID

echo $TASK_ID
echo $APP_NAME
echo $PREFIX

failed="true"
# 分發(fā)任務(wù)
curl -i "http://${your server host}/unit/taskReceive" -X POST -H "Content-Type:application/json" -d "{\"taskId\": \"$TASK_ID\",\"appName\": \"$APP_NAME\", \"branch\": \"${branch}\", \"repo\":\"${repo}\"}"
for time in 10s 30s 40s 50s 70s 100s 100s 70s 50s 40s 30s 10s
do
#輪詢?nèi)蝿?wù)
res=$(curl "http://${your server host}/unit/taskQuery" -X POST -H "Content-Type:application/json" -d "{\"taskId\": \"$TASK_ID\",\"appName\": \"$APP_NAME\", \"branch\": \"${branch}\", \"repo\":\"${repo}\"}")
echo $res
code=$(echo $res | grep -o -E 'code":[0-9]' | cut -d ":" -f2)
isOngoing=$(echo $res | grep -o -E 'data":[^}]*' | cut -d ":" -f2)
if [ "$code" = "1" ] && [ $isOngoing != "\"ongoing\"" ] && [ $isOngoing != "null" ]
then
#根據(jù)res解析單元測試運行結(jié)果
#略
break
fi
sleep $time
done

if [ "$failed" == "true" ]
then
echo "Job failed"
fi

5.最終結(jié)果

最終的運行結(jié)果如圖2,單元測試、行增量覆蓋率、行覆蓋率都可以點擊跳轉(zhuǎn)查看詳情。如圖3,4,5。跳轉(zhuǎn)地址的實現(xiàn),是采用nginx提供的訪問靜態(tài)文件功能。只需要在nginx的配置文件中,增加配置。

location ^~ /res_unit {
root /${your path};
}

這樣,如果想訪問a.html文件,只需要將其放在/${your path}/res_unit/a.html。就可以通過鏈接https://${your server host}/res_unit/a.html訪問到。

圖2 aone單測運行示例

圖3 case通過情況

圖4 行增量覆蓋率

圖5 行覆蓋率

三、其他

招聘高德共享出行技術(shù)質(zhì)量團隊求賢若渴(北京崗),誠招Java開發(fā)P6&P7、測試開發(fā)工程師P6&P7。

參考鏈接:

[1]https://github.com/axw/gocov

[2]https://github.com/AlekSi/gocov-xml

[3]https://github.com/Bachmann1234/diff_cover

責(zé)任編輯:武曉燕 來源: 阿里開發(fā)者
相關(guān)推薦

2017-02-21 10:30:17

Android單元測試研究與實踐

2017-01-14 23:42:49

單元測試框架軟件測試

2024-10-07 09:12:33

2024-01-09 08:08:12

Go單元測試系統(tǒng)

2025-08-28 01:00:00

Go單元測試

2011-11-18 15:18:41

Junit單元測試Java

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2020-08-18 08:10:02

單元測試Java

2022-08-05 09:30:57

單元測試C++

2024-08-15 08:11:10

2012-10-29 09:45:52

單元測試軟件測試測試實踐

2017-03-23 16:02:10

Mock技術(shù)單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2010-08-27 09:11:27

Python單元測試

2020-05-07 17:30:49

開發(fā)iOS技術(shù)

2011-07-04 18:16:42

單元測試

2023-07-26 08:58:45

Golang單元測試

2025-06-25 09:51:53

2023-11-25 09:41:34

GogRPCHandler
點贊
收藏

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

亚洲熟女乱综合一区二区| 日韩一区二区电影在线观看| 中文字幕av久久爽av| 亚洲日本va| 亚洲成av人片在线| 欧美日韩在线精品| 国产尤物在线观看| 中文不卡在线| 日韩毛片在线观看| 色一情一区二区| 国模私拍视频在线播放| 国产亚洲精品中文字幕| 成人激情视频在线播放| 日韩特黄一级片| 欧美aaaaaaaaaaaa| 亚洲激情电影中文字幕| 久久久久久久久久一区二区| аⅴ资源天堂资源库在线| 国产精品久久久一本精品| 国产免费高清一区| 一级黄色小视频| 在线亚洲激情| 欧美成人免费播放| jizz中文字幕| 国产欧美一区二区三区米奇| 欧美日韩高清一区二区不卡| 成人性生活视频免费看| 五月天婷婷在线视频| 91尤物视频在线观看| 亚洲va欧美va在线观看| 国产精品无码粉嫩小泬| 99热免费精品| 欧美激情视频给我| 欧美性生交大片| 色综合综合网| 欧美精品一区二区三区很污很色的 | 久热在线视频观看| 东京一区二区| 五月天国产精品| 毛片av在线播放| 麻豆视频在线免费观看| 国产婷婷色一区二区三区在线| 国产三级精品在线不卡| av网站免费播放| 日韩激情av在线| 91av视频在线免费观看| 精品亚洲永久免费| 欧美精品日韩| 美女视频黄免费的亚洲男人天堂| 美国精品一区二区| 欧美日韩黑人| 亚洲天堂第一页| 国产精品无码一区二区三区| 欧美一性一交| 亚洲精品国产福利| 精品视频站长推荐| 久久久久观看| 日韩国产精品一区| 亚洲 欧美 日韩在线| 在这里有精品| 欧美精品一区二区久久久| 91porn在线| 亚洲精品一二三**| 亚洲精品一区二区在线观看| 国产调教打屁股xxxx网站| 香蕉大人久久国产成人av| 欧美一三区三区四区免费在线看| 亚洲制服中文字幕| 久久久久毛片免费观看| 日韩精品中午字幕| 人妻体内射精一区二区三区| 美女一区二区在线观看| 日韩精品在线私人| 国产免费一区二区三区网站免费| 精品国产一区二区三区av片| 在线成人激情视频| 欧美一区免费观看| 激情综合电影网| **欧美日韩vr在线| 瑟瑟视频在线免费观看| 国产一区二三区好的| 成人av免费在线看| 免费黄色片在线观看| 国产精品色在线| 一本色道久久88亚洲精品综合| 手机av免费在线| 岛国av在线不卡| 国产免费又粗又猛又爽| 美女精品视频在线| 日韩av网站在线| youjizz亚洲女人| 欧美 日韩 国产精品免费观看| 九九热99久久久国产盗摄| 日韩乱码人妻无码中文字幕| 日日夜夜精品视频天天综合网| 国产日本欧美一区| 日本xxxxwww| 欧美极品另类videosde| 青青草视频在线视频| 欧美粗大gay| 91精品国产91久久综合桃花| 37p粉嫩大胆色噜噜噜| 国产韩日影视精品| 97国产真实伦对白精彩视频8| 91丨九色丨海角社区| 国产69精品久久99不卡| 日韩av不卡播放| 免费男女羞羞的视频网站在线观看 | 久久成人免费电影| 国产日本一区二区三区| 777电影在线观看| 亚洲在线成人精品| 日日噜噜夜夜狠狠| 欧美黑人做爰爽爽爽| 日韩视频永久免费观看| 国产美女激情视频| 黄一区二区三区| 欧美一区二区三区成人久久片 | 日韩毛片高清在线播放| 日韩免费一级视频| 精品麻豆剧传媒av国产九九九| 亚洲精品国产欧美| 欧美成人片在线观看| 日本特黄久久久高潮| 国产一区二区三区四区五区在线| 视频免费一区| 色哟哟一区二区三区| 欧美丰满熟妇bbb久久久| 四虎成人精品永久免费av九九| 日本久久久久久久久| 亚洲精品视频91| 亚洲欧美二区三区| xx欧美撒尿嘘撒尿xx| 国产精品密蕾丝视频下载| 国内精品视频一区| 亚洲av永久无码国产精品久久| 国产精品久久久久久久久免费相片| 日日橹狠狠爱欧美超碰| 99精品国产一区二区三区2021| 日韩在线欧美在线国产在线| 日本一本在线观看| 久久综合久久鬼色| 国产91xxx| 国产三级精品三级在线观看国产| 久久国产天堂福利天堂| 91国内精品视频| 国产精品乱人伦| 91日韩视频在线观看| 亚洲人成网www| 97精品欧美一区二区三区| 成人av无码一区二区三区| 亚洲精选视频免费看| 国产性生活一级片| 一区二区三区午夜视频| 91老司机在线| 国产成人无吗| 日韩欧美一区二区久久婷婷| 全网免费在线播放视频入口| 国产在线精品免费| 玖玖精品在线视频| 亚洲午夜免费| 久久久久久成人| 天堂av资源在线| 狠狠色香婷婷久久亚洲精品| 能免费看av的网站| 日本视频一区二区三区| 正在播放国产精品| 久久中文字幕一区二区| 欧美日韩aaaa| 天天插天天干天天操| 色综合婷婷久久| 中文字幕欧美激情极品| 国内不卡的二区三区中文字幕| 亚洲成年人专区| 成人av资源网址| 欧美孕妇与黑人孕交| 国产精品秘入口| 欧美精品欧美精品系列| 久草视频在线免费看| www.欧美.com| 激情视频综合网| 国产韩日影视精品| 国产一区二区三区高清视频| av有声小说一区二区三区| 日韩视频第一页| 欧美一级在线免费观看| 91国模大尺度私拍在线视频| 五月天色婷婷丁香| 成人激情视频网站| 日韩福利视频在线| 中文字幕亚洲综合久久五月天色无吗''| 91免费看网站| 欧美三级网址| 久久伊人精品天天| 天堂v视频永久在线播放| 欧美日韩免费看| 日本成人免费在线观看| 成人手机在线视频| 日日噜噜噜噜久久久精品毛片| 综合激情在线| 日本福利一区二区三区| 日韩中文字幕无砖| 国产精品www网站| 深夜国产在线播放| 中文字幕国产精品| 日本激情视频网站| 制服视频三区第一页精品| 天天操天天干视频| 亚洲男人的天堂网| 久久久久无码精品国产sm果冻| 国产成人av福利| 国内自拍视频网| 中文高清一区| 99中文字幕在线观看| av中文一区| 久久精品aaaaaa毛片| 日韩一区二区三区色| 国产精品一区电影| 中文字幕在线高清| 欧美激情久久久| 精品176二区| 亚洲欧洲中文天堂| 无码国产精品一区二区免费16 | 天堂8在线视频| 日韩精品自拍偷拍| 国产精品久久影视| 在线观看av不卡| 800av免费在线观看| 一区二区三区免费看视频| 成人信息集中地| 亚洲国产高清在线| 三上悠亚影音先锋| 91伊人久久大香线蕉| 老司机免费视频| 国产成人超碰人人澡人人澡| √天堂资源在线| 九色|91porny| 色综合色综合色综合色综合| 免费一级欧美片在线观看| 91看片就是不一样| 久久狠狠婷婷| 波多野结衣家庭教师视频| 国产亚洲精品久久久久婷婷瑜伽| 国产精品69久久久| 在线播放精品| 免费一级特黄特色毛片久久看| 欧美三级网页| 性一交一乱一伧国产女士spa| 欧美激情综合| www.国产二区| 好看不卡的中文字幕| 欧美日韩激情四射| 激情偷拍久久| 久久久一本二本三本| 亚洲一区国产一区| 日本www高清视频| 琪琪一区二区三区| 不卡中文字幕在线观看| 国产一区二区三区免费在线观看| 国内精品国产三级国产aⅴ久| 国产精品一区在线| 久久久久99人妻一区二区三区| 国产v综合v亚洲欧| 色综合久久五月| 久久免费午夜影院| 夫妇露脸对白88av| 亚洲乱码中文字幕| 日韩精品一区二区不卡| 色欧美片视频在线观看| 一二三四区视频| 日韩女优制服丝袜电影| 日韩在线视频观看免费| 亚洲裸体xxxx| 1024国产在线| 欧美日韩xxxxx| 都市激情亚洲一区| 成人www视频在线观看| 亚洲天堂av资源在线观看| 久久久一本精品99久久精品| 欧美精选一区二区三区| 亚洲色图都市激情| 在线亚洲欧美| 三级av免费观看| 国产999精品久久| 一卡二卡三卡四卡| 成人欧美一区二区三区黑人麻豆 | 亚洲一区二区日本| 欧美人妖视频| 亚洲一区二区三区欧美| 亚洲一级黄色| 日本免费观看网站| 国产成人一区在线| 亚洲精品成人无码| 亚洲久草在线视频| 午夜一区二区三区四区| 日韩欧美亚洲国产另类| 欧美中文在线| 欧美成人免费全部| 第四色男人最爱上成人网| 亚洲综合一区二区不卡| 精品在线手机视频| 成年人深夜视频| 青青青伊人色综合久久| 国产视频精品视频| 中文字幕日韩欧美一区二区三区| 欧美bbbbbbbbbbbb精品| 91麻豆精品国产91久久久| 免费av在线电影| 欧美黑人xxxx| 人人精品久久| 免费中文日韩| 欧美激情第二页| 天天干天天干天天干天天干天天干| 成人自拍视频在线观看| 国产一二三四视频| 日韩欧美国产激情| 亚洲男人天堂久久| 日韩在线观看你懂的| 中文字幕资源网在线观看免费 | 97高清免费视频| 国产精品高清一区二区| 图片区小说区区亚洲五月| a91a精品视频在线观看| 麻豆免费在线观看视频| 成人欧美一区二区三区小说| 在线视频精品免费| 亚洲欧美激情一区| 超碰在线99| 粉嫩高清一区二区三区精品视频| 亚洲国产一成人久久精品| 亚洲免费看av| 亚洲国产精品99久久久久久久久| 黄色污污网站在线观看| 精品在线小视频| 超级白嫩亚洲国产第一| 国产偷国产偷亚洲高清97cao| 欧美日韩网站| 免费黄色在线播放| 一区二区三区欧美日| 精品人妻aV中文字幕乱码色欲| 久久好看免费视频| 91成人精品观看| 自拍偷拍99| 狠狠色丁香久久婷婷综合_中| 欧美xxxx精品| 欧美四级电影网| 午夜视频在线观看网站| 国产欧美日韩视频| 久久人体视频| 午夜剧场高清版免费观看| 中文字幕日韩一区| 国产99对白在线播放| 久久综合色88| 9l视频自拍蝌蚪9l视频成人 | 任你弄在线视频免费观看| 91视频99| 一区视频在线| 黄色国产在线观看| 一本久久a久久免费精品不卡| 黄色av免费在线看| 国产综合视频在线观看| 亚洲精品一二三区区别| 国产精品偷伦视频免费观看了| 亚洲成人精品影院| 蜜桃免费在线| 国产精品亚洲自拍| 欧美视频在线观看| 青青草成人免费视频| 在线精品视频免费播放| 色大18成网站www在线观看| 亚洲一区二区三区视频| 国内视频精品| 一本加勒比北条麻妃| 欧美日韩在线播放一区| 成人在线网址| 精品久久中出| 日本最新不卡在线| 免费看特级毛片| 精品成人在线观看| av有声小说一区二区三区| 特级西西444| 久久人人97超碰com| 一级黄色片免费看| 韩国三级日本三级少妇99| sdde在线播放一区二区| 免费高清视频在线观看| 精品高清美女精品国产区| 第九色区av在线| av免费观看久久| 久久久久网站| 国产精品成人免费观看| 亚洲精品一区二三区不卡| 国产日韩在线观看视频| 精品一区二区中文字幕| 亚洲色图一区二区| 青青草娱乐在线| 亚洲xxxxx| 欧美亚洲网站| 精品99久久久久成人网站免费 | 国产欧美在线|