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

深入理解單元測試:技巧與優秀實踐

開發 前端
對于一些功能單一、核心邏輯、同時變化不頻繁的公開函數才有必要做單元測試。對于業務復雜、鏈路繁瑣但也是核心流程的功能通常建議做 e2e 測試,這樣可以保證最終測試結果的一致性。


之前分享過如何快速上手開源項目以及如何在開源項目里做集成測試,但還沒有講過具體的實操。

今天來詳細講講如何寫單元測試。

什么情況下需要單元測試

這個大家應該是有共識的,對于一些功能單一、核心邏輯、同時變化不頻繁的公開函數才有必要做單元測試。

對于業務復雜、鏈路繁瑣但也是核心流程的功能通常建議做 e2e 測試,這樣可以保證最終測試結果的一致性。

具體案例

我們都知道單測的主要目的是模擬執行你寫過的每一行代碼,目的就是要覆蓋到主要分支,做到自己的每一行代碼都心中有數。

下面以 Apache HertzBeat 的一些單測為例,講解如何編寫一個單元測試。

先以一個最簡單的 org.apache.hertzbeat.collector.collect.udp.UdpCollectImpl#preCheck 函數測試為例。這里的 preCheck 函數就是簡單的檢測做參數校驗。測試時只要我們手動將 metrics 設置為 null 就可以進入這個 if 條件。

@ExtendWith(MockitoExtension.class)
class UdpCollectImplTest {

    @InjectMocks
    private UdpCollectImpl udpCollect;

    @Test
    void testPreCheck() {
        List<String> aliasField = new ArrayList<>();
        aliasField.add("responseTime");
        Metrics metrics = new Metrics();
        metrics.setAliasFields(aliasField);
        assertThrows(IllegalArgumentException.class, () -> udpCollect.preCheck(metrics));
    }
}

來看具體的單測代碼,我們一行行的來看:

@ExtendWith(MockitoExtension.class) 是 Junit5 提供的一個注解,里面傳入的 MockitoExtension.class 是我們單測 mock 常用的框架。

簡單來說就是告訴 Junit5 ,當前的測試類會使用 mockito 作為擴展運行,從而可以 mock 我們運行時的一些對象。

@InjectMocks  
private UdpCollectImpl udpCollect;

@InjectMocks 也是 mockito 這個庫提供的注解,通常用于聲明需要測試的類。

@InjectMocks  
private AbstractCollect udpCollect;

需要注意的是這個注解必須是一個具體的類,不可以是一個抽象類或者是接口。

其實當我們了解了他的原理就能知道具體的原因:

當我們 debug 運行時會發現 udpCollect 對象是有值的,而如果我們去掉這個注解 @InjectMocks 再運行就會拋空指針異常。

因為并沒有初始化 udpCollect

而使用 @InjectMocks注解后,mockito 框架會自動給 udpCollect 注入一個代理對象;而如果是一個接口或者是抽象類,mockito 框架是無法知道創建具體哪個對象。

當然在這個簡單場景下,我們直接 udpCollect = new UdpCollectImpl() 進行測試也是可以的。

配合 jacoco 輸出單測覆蓋率

在 IDEA 中我們可以以 Coverage 的方式運行,IDEA 就將我們的單測覆蓋情況顯示在源代碼中,綠色的部分就代表在實際在運行時執行到的地方。

我們也可以在 maven 項目中集成 jacoco,只需要添加一個根目錄的 pom.xml 中添加一個 plugin 就可以了。

<plugin>  
    <groupId>org.jacoco</groupId>  
    <artifactId>jacoco-maven-plugin</artifactId>  
    <version>${jacoco-maven-plugin.version}</version>  
    <executions>  
        <execution>  
            <goals>  
                <goal>prepare-agent</goal>  
            </goals>  
        </execution>  
        <execution>  
            <id>report</id>  
            <phase>test</phase>  
            <goals>  
                <goal>report</goal>  
            </goals>  
        </execution>  
    </executions>  
</plugin>

之后運行 mvn test 就會在 target 目錄下生成測試報告了。

我們還可以在 GitHub 的 CI 中集成 Codecov,他會直接讀取 jacoco 的測試數據,并且在 PR 的評論區加上測試報告。

需要從 Codecov 里將你項目的 token 添加到 repo 的 環境變量中即可。

具體可以參考這個 PR:https://github.com/apache/hertzbeat/pull/1985

復雜一點的單測

剛才展示的是一個非常簡單的場景,下面來看看稍微復雜的。

我們以這個單測為例:org.apache.hertzbeat.collector.collect.redis.RedisClusterCollectImplTest

@ExtendWith(MockitoExtension.class)
public class RedisClusterCollectImplTest {
    
    @InjectMocks
    private RedisCommonCollectImpl redisClusterCollect;


    @Mock
    private StatefulRedisClusterConnection<String, String> connection;

    @Mock
    private RedisAdvancedClusterCommands<String, String> cmd;

    @Mock
    private RedisClusterClient client;
}

這個單測在剛才的基礎上多了一個 @Mock 的注解。

這是因為我們需要測試的 RedisCommonCollectImpl 類中需要依賴 StatefulRedisClusterConnection/RedisAdvancedClusterCommands/RedisClusterClient 這幾個類所提供的服務。

單測的時候需要使用 mockito 創建一個他們的對象,并且注入到需要被測試的 RedisCommonCollectImpl類中。

不然我們就需要準備單測所需要的資源,比如可以使用的 Redis、MySQL 等。

模擬行為

只是注入進去還不夠,我們還需要模擬它的行為:

  • 比如調用某個函數可以模擬返回數據
  • 模擬函數調用拋出異常
  • 模擬函數調用耗時

這里以最常見的模擬函數返回為例:

String clusterNodes = connection.sync().clusterInfo();

在源碼里看到會使用 connection 的 clusterInfo() 函數返回集群信息。

String clusterKnownNodes = "2";
        String clusterInfoTemp = """
                cluster_slots_fail:0
                cluster_known_nodes:%s
                """;
        String clusterInfo = String.format(clusterInfoTemp, clusterKnownNodes);
        Mockito.when(cmd.clusterInfo()).thenReturn(clusterInfo);

此時我們就可以使用 Mockito.when().thenReturn() 來模擬這個函數的返回數據。

而其中的 cmd 自然也是需要模擬返回的:

Mockito.mockStatic(RedisClusterClient.class).when(()->RedisClusterClient.create(Mockito.any(ClientResources.class),
                Mockito.any(RedisURI.class))).thenReturn(client);
        Mockito.when(client.connect()).thenReturn(connection);
        
        Mockito.when(connection.sync()).thenReturn(cmd);
        Mockito.when(cmd.info(metrics.getName())).thenReturn(info);
        Mockito.when(cmd.clusterInfo()).thenReturn(clusterInfo);

cmd 是通過 Mockito.when(connection.sync()).thenReturn(cmd);返回的,而 connection 又是從 client.connect() 返回的。

最終就像是套娃一樣,client 在源碼中是通過一個靜態函數創建的。

模擬靜態函數

我依稀記得在我剛接觸 mockito 的 16~17 年那段時間還不支持模擬調用靜態函數,不過如今已經支持了:

@Mock  
private RedisClusterClient client;


Mockito.mockStatic(RedisClusterClient.class).when(()->RedisClusterClient.create(Mockito.any(ClientResources.class),  
        Mockito.any(RedisURI.class))).thenReturn(client);

這樣就可以模擬靜態函數的返回值了,但前提是返回的 client 需要使用 @Mock 注解。

模擬構造函數

有時候我們也需要模擬構造函數,從而可以模擬后續這個對象的行為。

MockedConstruction<FTPClient> mocked = Mockito.mockConstruction(FTPClient.class,
                (ftpClient, context) -> {
                    Mockito.doNothing().when(ftpClient).connect(ftpProtocol.getHost(),
                            Integer.parseInt(ftpProtocol.getPort()));

                    Mockito.doAnswer(invocationOnMock -> true).when(ftpClient)
                            .login(ftpProtocol.getUsername(), ftpProtocol.getPassword());
                    Mockito.when(ftpClient.changeWorkingDirectory(ftpProtocol.getDirection())).thenReturn(isActive);
                    Mockito.doNothing().when(ftpClient).disconnect();
                });

可以使用 Mockito.mockConstruction 來進行模擬,該對象的一些行為就直接寫在這個模擬函數內。

需要注意的是返回的 mocked 對象需要記得關閉。

不需要 Mock

當然也不是所有的場景都需要 mock。

比如剛才第一個場景,沒有依賴任何外部服務時就不需要 mock。

類似于這個 PR 里的測試,只是依賴一個基礎的內存緩存組件,就沒必要 mock,但如果依賴的是 Redis 緩存組件還是需要 mock 的。https://github.com/apache/hertzbeat/pull/2021

修改源碼

如果有些測試場景下需要獲取內部變量方便后續的測試,但是該測試類也沒有提供獲取變量的函數,我們就只有修改源碼來配合測試了。

比如這個 PR:

當然如果只是給測試環境下使用的函數或變量,我們可以加上 @VisibleForTesting注解標明一下,這個注解沒有其他作用,可以讓后續的維護者更清楚的知道這是做什么用的。

集成測試

單元測試只能測試一些功能單一的函數,要保證整個軟件的質量僅依賴單測是不夠的,我們還需要集成測試。

通常是需要對外提供服務的開源項目都需要集成測試:

  • Pulsar
  • Kafka
  • Dubbo 等

以我接觸到的服務型應用主要分為兩類:一個是 Java 應用一個是 Golang 應用。

Golang

Golang 因為工具鏈沒有 Java 那么強大,所以大部分的集成測試的功能都是通過編寫 Makefile 和 shell 腳本實現的。

還是以我熟悉的 Pulsar 的 go-client 為例,它在 GitHub 的集成測試是通過 GitHub action 觸發的,定義如下:

最終調用的是 Makefile 中的 test 命令,并且把需要測試的 Golang 版本傳入進去。

Dockerfile:

這個鏡像簡單來說就是將 Pulsar 的鏡像作為基礎運行鏡像(這里面包含了 Pulsar 的服務端),然后將這個 pulsar-client-go 的代碼復制進去編譯。

接著運行:

cd /pulsar/pulsar-client-go && ./scripts/run-ci.sh

也就是測試腳本。

測試腳本的邏輯也很簡單:

  • 啟動 pulsar 服務端
  • 運行測試代碼 因為所有的測試代碼里連接服務端的地址都是 localhost,所以可以直接連接。

通過這里的 action 日志可以跟蹤所有的運行情況。

Java

Java 因為工具鏈強大,所以集成測試幾乎不需要用 Makefile 和腳本配合執行。

還是以 Pulsar 為例,它的集成測試是需要模擬在本地啟動一個服務端(因為 Pulsar 的服務端源碼和測試代碼都是 Java 寫的,更方便做測試),然后再運行測試代碼。

這個的好處是任何一個單測都可以在本地直接運行,而  Go 的代碼還需要先在本地啟動一個服務端,測試起來比較麻煩。

來看看它是如何實現的,我以其中一個 BrokerClientIntegrationTest為例:

會在單測啟動的時候先啟動服務端。

最終會調用 PulsarTestContext 的 build 函數啟動 broker(服務端),而執行單測也只需要使用 mvn test 就可以自動觸發這些單元測試。

只是每一個單測都需要啟停服務端,所以要把 Pulsar 的所有單測跑完通常需要 1~2 個小時。

以上就是日常編寫單測可能會碰到的場景,希望對大家有所幫助。

責任編輯:姜華 來源: crossoverJie
相關推薦

2011-02-21 09:54:14

PHPPHPUnit

2011-08-22 13:57:55

gtest

2017-02-21 10:30:17

Android單元測試研究與實踐

2017-01-14 23:42:49

單元測試框架軟件測試

2024-12-02 11:39:30

2017-05-04 16:35:45

2022-04-08 09:01:56

腳本Go應用單元

2024-05-23 08:02:23

2017-05-04 15:36:54

Openstack Q實現實踐

2024-01-09 07:25:31

2021-03-11 12:33:50

JavaPowerMock技巧

2012-10-29 09:45:52

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

2011-02-16 09:45:13

PHPPHPUnit

2009-09-01 10:20:06

protected方法單元測試

2021-09-27 13:02:05

Python技巧測試

2024-06-28 10:25:18

2024-10-07 09:12:33

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器
點贊
收藏

51CTO技術棧公眾號

欧美性潮喷xxxxx免费视频看| 国产精品扒开腿做爽爽爽视频| 亚欧精品在线视频| 欧美videos另类精品| 成人深夜福利app| 国产91ⅴ在线精品免费观看| 亚洲一级黄色录像| 99久久香蕉| 狠狠躁夜夜躁人人躁婷婷91| 亚洲精品影院| 天天av综合网| 麻豆一区二区99久久久久| 欧美精品久久一区二区| 亚洲最大成人综合网| 亚洲午夜精品| 欧美视频一区二区三区四区| 国内精品视频一区二区三区| 福利视频在线导航| 成人黄色777网| 国产精品美女久久久免费| 久久久全国免费视频| 精品福利久久久| 精品国产乱码久久久久久蜜臀| 精品久久久久久中文字幕2017| 欧美家庭影院| 成人欧美一区二区三区小说| 制服丝袜日韩国产| 亚洲一区二区三区av无码| 国产鲁鲁视频在线观看免费| 成人一级黄色片| 国产热re99久久6国产精品| 日韩乱码人妻无码中文字幕| 外国成人激情视频| 亚洲区在线播放| 国产精品扒开腿做爽爽爽a片唱戏| 国产私拍福利精品视频二区| 午夜一区二区三区在线观看| 中文字幕在线亚洲三区| av在线免费观看网| 久久久久国产精品麻豆ai换脸| 国产精品视频免费观看| 国产wwwwwww| 美女视频黄免费的久久| 国产成人av在线播放| 在线xxxxx| 国产精品成人3p一区二区三区| 在线一区二区三区做爰视频网站| 九一国产精品视频| 国产极品在线观看| 亚洲成av人片在www色猫咪| 国产成人一二三区| yellow91字幕网在线| 日韩美女啊v在线免费观看| 亚洲精品视频一二三| 在线免费观看黄| 国产精品女同一区二区三区| 亚洲精品不卡| 免费看a在线观看| 综合久久综合久久| 午夜探花在线观看| 色婷婷在线播放| 夜夜亚洲天天久久| 妞干网在线视频观看| 51漫画成人app入口| 亚洲妇熟xx妇色黄| 欧美色图另类小说| 色婷婷综合久久久中字幕精品久久| 欧美日韩视频免费播放| 国产欧美在线一区| 高清成人在线| 欧美日韩国产成人在线免费| 亚洲精品成人在线播放| 精品一区二区三区亚洲| 精品噜噜噜噜久久久久久久久试看| 精品国产aⅴ一区二区三区东京热| 一区二区三区国产好| 亚洲国产高清福利视频| 久久久精品人妻无码专区| 欧美三级情趣内衣| 欧美成人精品在线| 久久亚洲精品国产| 蜜桃视频在线一区| 91精品国产91久久久久青草| 手机看片1024国产| 久久看人人爽人人| 性欧美18一19内谢| 激情aⅴ欧美一区二区欲海潮| 色网站国产精品| 五月激情五月婷婷| 黑人久久a级毛片免费观看| 亚洲欧美综合区自拍另类| 国产wwwwxxxx| 亚洲精品护士| 国产日本欧美在线观看| 亚洲AV无码乱码国产精品牛牛| 北条麻妃国产九九精品视频| 亚洲电影网站| sm在线播放| 在线播放欧美女士性生活| 国产一线在线观看| 99国内精品久久久久久久| 性欧美激情精品| 亚洲无码精品在线观看| 国产ts人妖一区二区| 欧美一区三区二区在线观看| a毛片在线播放| 色噜噜夜夜夜综合网| 三上悠亚 电影| 电影亚洲精品噜噜在线观看| 在线不卡一区二区| 国产精品久久久免费观看| 国产精品传媒精东影业在线| 欧美一区二区三区免费观看| 国产成人精品亚洲精品色欲| 久久九九久精品国产免费直播| 欧美大片免费播放| 成人精品国产亚洲| 日韩精品中文字幕视频在线| 日韩a级片在线观看| 日韩不卡一区二区三区| 国产一区二区免费电影| 菠萝菠萝蜜在线视频免费观看| 欧美午夜视频在线观看| 逼特逼视频在线观看| 无需播放器亚洲| 国产精品久久久久av免费| 神马一区二区三区| 亚洲图片欧美色图| 成人免费黄色av| 999成人精品视频线3| 国产精品久久久久久久久久ktv| 少妇喷水在线观看| 亚洲综合区在线| 亚洲精品乱码久久久久久动漫| 欧美最新另类人妖| 日韩av男人的天堂| 午夜成人鲁丝片午夜精品| 亚洲综合一二三区| 无套白嫩进入乌克兰美女| 天天av综合| 成人免费视频网| 巨大荫蒂视频欧美大片| 欧美日韩不卡视频| 亚洲精品国产精品国自| 日日欢夜夜爽一区| 欧美日韩亚洲一区二区三区在线观看 | 色婷婷久久99综合精品jk白丝| 国产在线不卡av| 在线不卡视频| 久久免费高清视频| 亚洲乱熟女一区二区| 亚洲午夜一区二区三区| 中文字幕视频观看| 亚洲黄色天堂| 久久久久成人精品免费播放动漫| 国产乱码精品一区二三赶尸艳谈| 亚洲成色777777在线观看影院| 久久网一区二区| www.亚洲免费av| 男人和女人啪啪网站| 婷婷成人综合| 国产精品久久久久久久久久三级| 国产小视频免费在线网址| 欧美中文字幕一区二区三区亚洲| 奇米网一区二区| 国产中文字幕精品| 成人午夜免费在线视频| 加勒比色老久久爱综合网| 欧美亚洲国产日本| xxxxx日韩| 日韩一区二区精品在线观看| 日韩熟女精品一区二区三区| 久久久久久久免费视频了| 伊人国产在线视频| 欧美特黄一区| 国产欧美一区二区在线播放| 亚洲精品永久免费视频| 日韩中文字幕不卡视频| 国产福利视频导航| 色综合天天综合网天天狠天天| 久久久久久国产精品无码| 久久精品99国产精品| 久久99久久99精品| 欧美日韩第一| 国产精品视频福利| 欧美黄页免费| 午夜伦理精品一区| 日韩专区在线| 亚洲精品720p| 一级黄色片在线播放| 亚洲成人在线网站| 免费91在线观看| av电影天堂一区二区在线 | 日韩精品久久久久久久| 国产三级一区二区| 中国老熟女重囗味hdxx| 日一区二区三区| 日韩久久久久久久久久久久| 欧美女优在线视频| 国产精品久久久一区二区三区| 韩国精品主播一区二区在线观看| 九九九久久久久久| 成人精品一区| 日韩二区三区在线| 国产情侣在线播放| 色婷婷国产精品| 国产在线拍揄自揄拍| 国产精品日产欧美久久久久| 久久性爱视频网站| 国产在线日韩欧美| 黄色大片在线免费看| 午夜久久一区| 五月婷婷综合色| 五月综合久久| 97久久天天综合色天天综合色hd| 亚洲日本网址| 91精品国产网站| 日韩精品卡一| 久久久国产精品一区| 黄色大片在线看| 日韩av影片在线观看| 国产精品老熟女视频一区二区| 色婷婷综合激情| 日韩精品成人在线| 亚洲成人动漫精品| 欧美做爰爽爽爽爽爽爽| 中国av一区二区三区| 国产男女猛烈无遮挡a片漫画 | 天堂久久精品忘忧草| 成人免费精品视频| 少妇丰满尤物大尺度写真| 久久国产成人午夜av影院| 欧美精品第三页| 性感少妇一区| 97国产在线播放| 日韩视频一区| 欧美视频在线观看视频 | 妞干网在线免费视频| 在线视频免费在线观看一区二区| 波多野结衣与黑人| 欧美 日韩 国产一区二区在线视频 | 日韩国产福利| 日韩电影大片中文字幕| 深夜福利视频网站| 亚洲爱爱爱爱爱| 色噜噜在线播放| 亚洲成人网在线| 色wwwwww| 亚洲欧美日韩在线一区| 免费看男男www网站入口在线| 日韩国产欧美精品一区二区三区| 天天操天天射天天舔| 日韩av在线影院| 免费福利在线视频| 日韩精品免费电影| 免费人成在线观看网站| 亚洲图片欧洲图片av| 91大神xh98hx在线播放| 最新国产精品亚洲| 成人在线观看亚洲| 欧美丰满老妇厨房牲生活| 色呦呦在线免费观看| 久久久亚洲天堂| 免费毛片b在线观看| 青青草国产精品一区二区| 日本在线视频一区二区| 国产日韩欧美夫妻视频在线观看| 亚洲综合资源| 国产v亚洲v天堂无码| 国产精品22p| 欧美午夜精品久久久久久蜜| 日本一本不卡| www.黄色网址.com| 一本色道88久久加勒比精品| 免费大片在线观看| 精品一区二区精品| 四虎成人免费视频| 国产片一区二区三区| 亚洲精品久久久久久国| 亚洲一区影音先锋| 无码人妻精品一区二区三区不卡| 欧美日韩国产免费一区二区| www.av导航| 亚洲美女久久久| www在线观看播放免费视频日本| 久久久这里只有精品视频| 校园春色亚洲色图| 亚洲一区二区少妇| 免费精品国产| 潘金莲一级淫片aaaaa免费看| 亚洲国内自拍| 亚洲另类第一页| 99久久精品国产毛片| 网站永久看片免费| 精品国产91久久久久久| 国产乱淫a∨片免费观看| 亚洲国产一区自拍| 日本在线免费网| 18性欧美xxxⅹ性满足| 91丨精品丨国产| 欧美日韩天天操| 国语对白精品一区二区| 日本三级黄色网址| 99国产一区二区三精品乱码| 少妇高潮在线观看| 欧美性xxxx极品hd欧美风情| 国产成人免费看一级大黄| 亚洲一区二区久久久| 高清电影在线观看免费| 成人在线精品视频| 国产成人av| 成人在线观看你懂的| 国产一区二区三区香蕉| 神马久久久久久久久久久| 日韩欧美aaa| 亚洲欧美另类视频| 久久天天躁狠狠躁老女人| 91欧美精品| 久久一区二区三区av| 欧美三级网页| 国产一级片中文字幕| 中文无字幕一区二区三区 | 亚洲国产精品一区二区久久hs| 精品日本高清在线播放| 亚洲精品.www| 久久成人国产精品| 日本欧美一区| 涩涩涩999| 天堂久久一区二区三区| 欧美成人三级伦在线观看| 亚洲另类在线制服丝袜| 91片黄在线观看喷潮| 中文字幕日本欧美| 久久av影院| 亚洲午夜激情| 青青草成人在线观看| 变态另类ts人妖一区二区| 日韩欧美在线观看| 男人天堂亚洲二区| 国产99视频在线观看| 日韩理论电影中文字幕| 黄色免费福利视频| 99国产精品久久| 久久艹免费视频| 亚洲精品aⅴ中文字幕乱码| 国产h片在线观看| 国产美女在线精品免费观看| 最新亚洲激情| 挪威xxxx性hd极品| 狠狠久久五月精品中文字幕| 天天操天天插天天射| 日本道色综合久久影院| 国产精品一区二区三区av麻| 毛葺葺老太做受视频| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲大尺度在线观看| 在线亚洲国产精品网| 日韩成人综合网| 久久久天堂国产精品| 国产成人av一区二区三区在线观看| 久久国产露脸精品国产| 亚洲精品久久久久中文字幕欢迎你| 看黄在线观看| 日本精品一区二区三区不卡无字幕| 蜜臀99久久精品久久久久久软件| 91大神福利视频| 精品精品欲导航| 国产日韩电影| 正在播放一区| 国产91精品免费| 国产亚洲欧美在线精品| 夜夜躁日日躁狠狠久久88av| 亚洲电影二区| 成人免费观看cn| 国产午夜三级一区二区三| 国产精品毛片一区视频播 | 成人精品在线视频观看| 日本一区二区三区精品| 中文字幕一精品亚洲无线一区| 97久久精品一区二区三区的观看方式| 成人小视频在线观看免费| 91社区在线播放| 亚洲天堂一二三| 午夜精品福利在线观看| 成人在线免费观看视频| 免费欧美一级片| 在线免费不卡视频| 综合图区亚洲| 青青草成人激情在线| 国产精品自产自拍| 欧产日产国产69| 超碰91人人草人人干| 宅男在线一区| 先锋资源在线视频| 色综合色狠狠综合色| av网站在线看| 色大师av一区二区三区| 成人久久18免费网站麻豆| 在线观看国产精品视频| 国外色69视频在线观看|