《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > 應用設計模式編寫易于單元測試的代碼

應用設計模式編寫易于單元測試的代碼

2008-07-24
作者:熊 偉
單元測試是軟件開發" title="軟件開發">軟件開發的一個重要組成部分,通過在軟件設計、開發的過程中合理地運用設計模式" title="設計模式">設計模式,不但為系統重構、功能擴展" title="功能擴展">功能擴展及代碼維護提供了方便,同時也為單元測試的實施提供了極大的靈活性,可以有效降低單元測試編碼的難度,更好地保證軟件開發的質量。

引言

設計模式是對被用來在特定場景下解決一般設計問題的類和相互通信的對象的描述,通過在系統設計中引入合適的設計模式可以為系統實現提供更大的靈活性,從而有效地控制變化,更好地應對需求變更或者按需變更系統運行路徑等問題。

請訪問 Java 設計模式專題,查看更多關于 Java 設計模式的文章和教程。

單元測試是軟件開發的一個重要組成部分,是與編碼實現同步進行的開發活動,這一點已成為軟件開發者的共識。適度的單元測試不但不會影響開發進度,反而可以為開發過程提供很好的控制,為軟件質量、系統重構等提供有力的保障,并且,當后續系統需求發生變更、Bug Fix 或功能擴展時,能很好地保證已有實現不會遭到破壞,從而使得程序更易于維護和修改。 Martin Fowler、Kent Beck、Robert Martin 等軟件設計領域泰斗更是極力倡導測試先行的測試驅動開發(Test Driven Development,TDD)的開發方式。

單元測試主要用于測試細粒度的程序單元,如類的某個復雜方法的正確性,也可以根據需要綜合測試某個操作所涉及的多個相互聯系的類的正確性。在很多情況下,相互聯系的多個類中有些類比較簡單,為這些簡單類單獨編寫單元測試用例往往不如將它們與使用它們的類一起進行測試有意義。

模擬對象(Mock Objects)是為模擬被測試單元所使用的外圍對象、設備(后文統一簡稱為外部對象)而設計的一種特殊對象,它們具有與外部對象相同的接口,但實現往往比較簡單,可以根據測試的場景進行定制。由于單元測試不是系統測試,方便、快速地被執行是單元測試的一個基本要求,直接使用外部對象往往需要經過復雜的系統配置,并且容易出現與欲測試功能無關的問題;對于一些異常的場景,直接使用外部對象可能難以構造,而通過設計合適的 Mock Objects,則可以方便地模擬需要的場景,從而為單元測試的順利執行提供有效的支持。

本文根據筆者經驗,介紹了幾種典型的設計模式在系統設計中的應用,及由此為編寫單元測試帶來的方便。

從對象創建開始

由于需要使用 Mock Objects 來模擬外部對象的功能,因此必須修改正常的程序流程,使得被測試功能模塊與 Mock Objects,而不是外部對象進行交互。要做到這一點,首先要解決的問題就是對象創建,即在原本創建外部對象的地方創建 Mock Objects,因此在設計、實現業務邏輯時需要注意從業務邏輯中分離出對象創建邏輯。

關于 setUp

setUp 是 JUnit 基礎類 TestCase 的一個重要方法,每個單元測試在被執行前會調用 setUp 方法做一些必要的預處理,如準備好一些公共的基本輸入或創建所需的外部對象。

Factory Method 是一種被普遍運用的創建型模式,用于將對象創建的職責分離到獨立的方法中,并通過子類" title="子類">子類化來實現創建不同對象的目的。如果被測試單元所使用的外部對象是通過 Factory Method 創建的,則可以通過從已有被測試的 Factory 類派生出一個新的 MockFactory,以創建 Mock Objects,并在 setUp 測試中創建 MockFactory,從而間接達到對被測試類進行測試的目的。

面的" title="面的">面的代碼片段展示了具體的做法:

// BaseObjects.java
package com.factorymethod.demo;
public interface BaseObjects {
    voidfunc(); 
} 

// OuterObjects.java
package com.factorymethod.demo;
public class OuterObjects implements BaseObjects {
    public void func() { 
        System.out.println('OuterObjects.func'); 
    } 
} 

// LogicToBeTested.java, code to be tested
package com.factorymethod.demo;
public class LogicToBeTested {
    public void doSomething() { 
        BaseObjects b = createBase(); 
        b.func(); 
    }
    
    public BaseObjects createBase() {
        return newOuterObjects(); 
    } 
}

以下則是對應的 MockOuterObjects、MockFactory 以及單元測試的實現:

// MockOuterObjects.java
package com.factorymethod.demo;
public class MockOuterObjects implements BaseObjects {
    public void func() { 
        System.out.println('MockOuterObjects.func'); 
    } 
} 

// MockLogicToBeTested.java
package com.factorymethod.demo;
public class MockLogicToBeTested extends LogicToBeTested {
    public BaseObjects createBase() {
        return new MockOutterObjects(); 
    } 
} 

// LogicTest.java
package com.factorymethod.demo;
import junit.framework.TestCase;
 
public class  LogicTest extends TestCase { 
    LogicToBeTested c;
    protected void setUp() { 
        c =new MockLogicToBeTested(); 
    }
    public void testDoSomething() { 
        c.doSomething(); 
    } 
}
			

Abstract Factory 是另一種被普遍運用的創建型模式,Abstract Factory 通過專門的 Factory Class 來封裝對象創建的職責,并通過實現 Abstract Factory 來完成不同的創建邏輯。如果被測試單元所使用的外部對象是通過 Abstract Factory 創建的,則實現一個新的 Concrete Factory,并在此 Factory 中創建 Mock Objects 是一個比較好的解決辦法。對于 Factory 本身,則可以在 setUp 測試的時候指定新的 Concrete Factory ;此外,借助依賴注入框架(如 Spring 的 BeanFactory),通過依賴注入的方式將 Factory 注入也是一種不錯的解決方案。對于簡單的依賴注入需求,可以考慮實現一個應用專有的依賴注入模塊,或者實現一個簡單的實現加載器,即根據配置文件載入相應的實現,從而無需修改應用代碼,僅通過修改配置文件即可載入不同的實現,進而方便地修改程序的運行路徑,執行單元測試。

下面的代碼實現了一個簡單的 InstanceFactory:

// refer to http://www.opensc-project.org/opensc-java/export/100/trunk/
// pkcs15/src/main/java/org/opensc/pkcs15/asn1/InstanceFactory.java
packagecom.instancefactory.demo;

importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.lang.reflect.Modifier;

public class InstanceFactory {
    private final Method getInstanceMethod;
    
    public InstanceFactory(String type) { 
        Class clazz =null;
        try { 
            clazz = Class.forName(type);
            this.getInstanceMethod = clazz.getMethod('getInstance');
            if(!Modifier.isStatic(this.getInstanceMethod.getModifiers()) 
            || !Modifier.isPublic(this.getInstanceMethod.getModifiers()))
                throw new IllegalArgumentException(
                    'Method [' + clazz.getName() 
                    + '.getInstance(Object)] is not static public.'); 
        } catch (NoSuchMethodException e) {
            throw new IllegalArgumentException(
                'Class [' + clazz.getName() 
                + '] has no static getInstance(Object) method.', e); 
        } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException('Class [' + type + '] is not found'); 
        } 
    }

    public Object getInstance() {
        try{
            return this.getInstanceMethod.invoke(null); 
        } catch (InvocationTargetException e) {
            if( e.getCause() instanceof RuntimeException )
                throw (RuntimeException)e.getCause();
            throw new IllegalArgumentException(
                    'Method [' +this.getInstanceMethod 
                    + '] has thrown an checked exception.', e); 
        } catch( IllegalAccessException e) {
            throw new IllegalArgumentException(
                    'Illegal access to method [' 
                    +this.getInstanceMethod + '].', e); 
        } 
    }
    
    public Method getGetInstanceMethod() {
        return this.getInstanceMethod; 
    } 
}

以下代碼演示了 InstanceFactory 的簡單使用:

// BaseObjects.java
package com.instancefactory.demo;

public interface BaseObjects {
    voidfunc(); 
} 

 // OuterObjects.java

package com.instancefactory.demo;

public class OuterObjects implements BaseObjects {
    public static BaseObjects getInstance() {
        return new OuterObjects(); 
    }
    
    public void func() { 
        System.out.println('OuterObjects.func'); 
    } 
} 

// MockOuterObjects.java
package com.instancefactory.demo;
public class MockOuterObjects implements BaseObjects {
    public static BaseObjects getInstance() {
        return new MockOuterObjects(); 
    }
    
    public void func() { 
        System.out.println('MockOuterObjects.func'); 
    } 
 } 

// LogicToBeTested.java
packagecom.instancefactory.demo;
public class LogicToBeTested {
    public static final String PROPERTY_KEY= 'BaseObjects';
    public void doSomething() { 
        // load configuration file and read the implementation class name of BaseObjects 
        // read it from properties to simplify the demo 
        // actually, the property file reader can be implemented by InstanceFactory 
        String impl = System.getProperty(PROPERTY_KEY); 
        InstanceFactory factory = new InstanceFactory(impl); 
        BaseObjects b = (BaseObjects)factory.getInstance(); 
        b.doSomething(); 
    } 
 } 

// LogicTest.java
packagecom.instancefactory.demo;
importjunit.framework.TestCase;
public class LogicTest extends TestCase { 
    LogicToBeTested c;
    protected void setUp() { 
        // set the property file of class map to a file for MockObjects, omitted 
        // use System.setProperty to simplify the demo 
        System.setProperty(LogicToBeTested.PROPERTY_KEY, 
                'com.instancefactory.demo.MockOuterObjects'); 
        c = new LogicToBeTested(); 
    }
    
    public void testDoSomething() { 
        c.doSomething(); 
    } 
 }

替換實現

通過 Factory Method 替換被創建對象可以滿足一些修改程序運行路徑的需求,但是,這種方法以子類化為前提,具有很強的侵入性,并且在編寫單元測試時,開發人員需要同時負責 Mock Objects 的開發,供 Factory Method 調用,因此,編碼量往往會比較大,單元測試開發人員也需對所使用的公共模塊的內部結構有十分清楚的認識。即使可以使用公共的 Mock Objects 實現避免代碼重復,往往也需要修改業務邏輯中公共服務相關對象的創建代碼,這一點對于應用公共模塊的業務邏輯的單元測試可能不太適合。

在筆者曾參與設計、開發的某應用系統中,有一個專門的數據庫緩沖(Cache)公共服務,該 Cache 負責完成與數據庫交互,實現數據的存取,并緩存數據以提高后續訪問的效率。對于涉及數據庫緩沖的業務邏輯的單元測試,需要一個替代方案來替代已有的數據庫緩沖,以避免直接訪問實際數據庫,但又要保證這個替換不會影響到被測試單元的實現。

為了解決這個問題,我們并沒有直接替換 Cache 創建處的代碼,因為這些代碼遍布在業務代碼中,直接替換 Cache 創建代碼無疑會侵入業務邏輯,并需要大量使用子類化。為了盡可能降低對業務邏輯的影響,我們維持了原有 CacheFactory 的接口,但是將 CacheFactory 的實現委托(Delegate)給另一個實現類完成,以下是 CacheFactory 實現的偽代碼:

package com.cachefactory.demo;
public abstract class CacheFactory {
    private static CacheFactoryinstance = new DelegateCacheFactory();
    private static CacheFactorydelegate;
    protected CacheFactory() { 
    } 
  
    // CacheFactory is a singletonpublic
    static CacheFactory getInstance() {
        return instance; 
    } 
  
    // the implementation can be changedprotected
    static void setDelegate(CacheFactory instance) {
        delegate= instance; 
    }
        
    public abstract Cache getCache(Object... args); 
 
    // redirect all request to delegateeprivate
    static class DelegateCacheFactoryextendsCacheFactory {
        private DelegateCacheFactory() { 
        }
            
        public Cache getCache(Object... args) {
            return delegate.getCache(args); 
        } 
    } 
 }

與 CacheFactoryImpl 類似地,我們實現了一個 MockCacheFactory,但與 CacheFactoryImpl 不同的是,這個 MockCacheFactory 所創建的 MockCache 對象雖然與真正的 Cache 實現了相同的接口,但是,它的內部實現卻是基于 HashMap 的,因此,可以很好地滿足單元測試快速、方便地運行的需要。

單元測試時,只需要在 setUp 時調用執行如下操作:

setDelegate(new MockCacheFactory());

將 CacheFactory 的實現委托給 MockCacheFactory 即可,所有業務邏輯都無需作任何修改,因此,這種替換實現的方式幾乎是沒有侵入性的。

這種通過將實現分離到專門的實現類中的做法其實是 Bridge 模式的一個應用,通過使用 Bridge 模式,為替換實現保留了接口,從而使得在不對業務邏輯作任何修改的情況下可以輕松替換公共服務的實現。

除此之外,Strategy 模式也是一種替換實現的有效途徑,這種方式與 Factory Method 類似,通過子類化實現新的 Strategy 以替換業務邏輯使用的舊的 Strategy,通過與 Factory Method 或 Bridge 等模式聯合使用,在編寫應用公共服務的業務邏輯的單元測試時也十分有用。

繞過部分實現

繞過部分實現進行單元測試在大多數情況下是不可取的,因為這種做法極有可能會影響單元測試的質量。但是對于一些特殊的情況,我們可以“冒險”使用這種方式,比如有這樣的一個場景:所有請求需經過多級認證,且部分認證處理需要訪問數據庫,認證結束后為請求分配相應的 sessionId,請求在獲得 sessionId 后繼續進行進一步的業務邏輯處理。

在保證多級認證模塊已被專門的單元測試覆蓋的情況下,我們在為業務邏輯編寫單元測試的過程中可以考慮跳過多級認證授權模塊(對于部分特權用戶,也應跳過部分檢查),直接為其分配一個 Mock 的 sessionId,以進行后續處理。

對于多級認證問題本身,我們可以考慮采用 Chain of Responsibility 模式將不同的認證邏輯封裝到不同的 RequestHandler 中,并通過編碼或者根據配置,將所有的 Handler 串聯成 Responsibility Chain ;而在單元測試過程中,可以修改 Handler 的串聯方式,繞過部分不希望在單元測試中經過的 Handler,從而簡化單元測試的運行。

對于這個問題,筆者并不同意為了單元測試的需要去采用 Chain of Responsibility 模式,實際上,上面所闡述的多級認證問題本身比較適合采用這種模式來解決,能夠根據需要繞過部分實現,只是應用這種模式的情況下進行單元測試的一種可以考慮的測試途徑。

總結

單元測試是軟件開發的重要組成部分,而應用 Mock Object 是進行單元測試一種普遍而有效的方式,通過在軟件設計、開發的過程中合理地運用設計模式,不但為系統重構、功能擴展及代碼維護提供了方便,同時也為單元測試的實施提供了極大的靈活性,可以有效降低單元測試編碼的難度,方便地在單元測試中引入 Mock Objects,達到對被測試目標進行單元測試的目的,從而更好地保證軟件開發的質量。



參考資料



關于作者

Photo of 熊偉(Wayne Xiong)

熊偉(Wayne Xiong),華中科技大學碩士,曾用網名 Bill David、大衛、大笨熊等。精于 C++,后轉入 JAVA 陣營,曾就職于 Lucent、BEA(Oracle)等公司,從事電信及 J2EE 應用平臺的設計開發;現為 Adobe 公司高級軟件工程師,主要從事 Flash Media Server 及 RIA 相關應用的設計開發。可以通過 billdavidcn@hotmail.com 或博客 http://blog.csdn.net/billdavid 與他聯系。

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 亚洲视频在线观看网站 | 人妻换人妻a片爽麻豆 | 欧美 日韩 国产 在线 | 亚洲浮力影院久久久久久 | 天天夜夜久久 | ass亚洲曰本人体私拍ass | 亚洲www啪成人一区二区麻豆 | 欧美性受xxxx黑人xyx | 欧美综合视频在线观看 | 亚洲福利 | 亚洲国产精品综合久久20 | 中文字幕亚洲精品无码 | 天天视频天天爽 | 黄色免费版| 免费国精产品自偷自偷免费看 | 九九99精品| 国产精品狼人久久久久影院 | 亚洲中文字幕精品一区二区三区 | 色综合a | 先锋影音一区二区三区 | 一级黄色短片 | 国产免费一区二区三区在线观看 | 亚洲天堂中文 | 神马香蕉久久 | 国产精品久久99综合免费观看尤物 | 欧美成人精品 | 久久久久久国产精品美女 | 国产美女性生活 | 在线观看福利网站 | 黄色aaa视频 | 久久久久久久综合狠狠综合 | 湿女导航福利av导航 | 一区二区三区视频 | 青春草网站 | 日本一区二区三区在线免费观看 | 日韩成人短视频 | 亚洲中文字幕无码一久久区 | 99看片| 亚洲欧美日韩国产成人 | 99国产精品丝袜久久久久久 | dy888夜精品国产专区 | 免费福利av| 国产精品99精品久久免费 | 日本爽快片毛片 | 欧美极品在线视频 | 人妻体内射精一区二区三区 | 成 人 黄 色 片 在线播放 | 一区二区三区在线视频播放 | 性高潮久久久久久久 | 国产特黄一级片 | 国产精品久久久久久久久久iiiii | 国产成人精品亚洲一区 | 中文字幕观看在线 | 欧美日韩123 | 国产伦子伦对白在线播放观看 | 精品无码av一区二区三区 | 午夜福利试看120秒体验区 | 91亚洲精品在线 | www成年人视频 | 久夜精品 | 中文综合在线观 | 亚洲精品一区二区不卡 | 香蕉视频97| 小镇姑娘国语版在线观看免费 | av黄色免费 | 亚洲日本欧美在线 | 中文字幕在线无码一区二区三区 | 国产小呦泬泬99精品 | 日本在线中文 | 国产精品国产精品国产专区不蜜 | 国产乱子伦一区二区三区 | 美女色av| 夜晚福利视频 | 国产调教丨ⅴk | 亚洲一二区视频 | www.香蕉.com | 国产免费一区二区三区四区五区 | 精品视频中文字幕 | 欧美不卡一区二区三区 | 少妇人禽zoz0伦视频 | 九九热爱视频精品 | 91麻豆产精品久久久久久 | av亚洲产国偷v产偷v自拍麻豆 | 五十老熟妇乱子伦免费观看 | 奇米四色777| 中文字幕一区视频 | av涩涩| 精品日韩欧美 | 亚洲色欲色欲www在线观看 | 亚洲作爱网 | 两女女百合互慰av赤裸无遮挡 | 天天干天天玩 | 人人看人人看 | 欧美成人精品一区二区三区在线观看 | 久久精品黄色 | 亚洲国产精品成人天堂 | 亚洲风情亚aⅴ在线发布 | 久久人网| 暴力调教一区二区三区 | 欧美日韩国产在线 | 999久久久国产999久久久 | 六月色婷婷 | 老外和中国女人毛片免费视频 | 精品视频一区二区在线 | 第一福利丝瓜av导航 | 国产天堂网 | 国产精品女同一区二区软件 | 亚洲美女色| 久久精品国产99国产精品亚洲 | 小雪好紧好滑好湿好爽视频 | 中文字幕一区二区三区四区五区 | 国产黄片毛片 | 国产一级aa大片毛片 | 亚洲精品久久久一区二区三区 | 一区二区三区四区在线播放 | 亚洲欧洲免费 | 玖玖玖精品 | 欧美在线免费视频 | 极品美女一线天粉嫩 | 国产a一区二区 | 天天操导航 | 操bbbbb | 欧美激情va永久在线播放 | 国产哺乳奶水91porny | 亚洲色偷偷色噜噜狠狠99网 | 18禁黄网站禁片免费观看女女 | 男女裸体做爰猛烈全过程9制片 | 亚洲人成色777777老人头 | 天堂网www.| 久久久国产乱子伦精品 | 韩国三级hd中文字幕叫床浴室 | 黄色三级毛片视频 | 2021最新国产精品网站 | 免费黄色短片 | 国产91网址| 一区二区三区av | 日韩国产精品免费 | 日本高清免费毛片大全awaaa | 天天激情站 | 国产伦精品一区二区三区免 | 国内露脸8mav | 丰满少妇在线观看网站 | 极品少妇在线 | 最全aⅴ番号库 | 亚洲理论视频 | 成人网站免费看黄a站视频 欧美性猛交xxxx黑人 | 日韩在线观看av | 亚洲成人久久精品 | 亚洲精品sm一区二区 | 在线国产一区 | 精品一区二区三区免费播放 | 丁香花在线观看免费观看图片 | 成人亚洲性情网站www在线观看国产 | 久久久久久久久久久久久久 | 操批网站| 噜噜噜狠狠夜夜躁精品仙踪林 | 婷婷色国产偷v国产偷v小说 | 成人444kkkk在线观看 | 特一级黄色片 | 日本熟女毛茸茸 | 国产亚洲性欧美日韩在线观看软件 | 久久美女视频 | 天干天干天啪啪夜爽爽av小说 | 中文天堂av | 丝袜诱惑一区二区 | 五月天一区二区三区 | 最近中文字幕免费mv视频7 | 女人天堂久久爱av四季av | 日韩视频无码中字免费观 | 性色av极品无码专区亚洲 | 神马午夜激情 | 天天干,夜夜操 | 亚洲第一大综合区 | 色橹橹欧美在线观看视频高清 | 撕开少妇裙子猛然进入 | 免费一区二区三区视频在线 | 激情五月色综合国产精品 | 国产成人精品午夜视频 | 日本欧美大码a在线观看 | 国产婷婷在线观看 | 丰满少妇人妻久久久久久 | 久久精品无码一区二区小草 | 狠狠色综合色综合网站久久 | 相泽南av日韩在线 | 国产成人a∨激情视频厨房 国产精品无码一区二区三级 | 国产精品91久久久 | 高潮喷水的毛片 | 一本大道av伊人久久综合 | 理论片黄色| 一二三四区无产乱码1000集 | 可以看片的网站色 | 中文国产视频 | 奇米777狠狠色噜噜狠狠狠 | 国产三级在线观看免费 | 欧美人与拘性视交免费看 | 国产成人麻豆精品午夜福利在线 | 中文字幕在线视频免费视频 | 激情五月激情综合网 | 国产波霸爆乳一区二区 | 精品国产一区二区三区久久久蜜月 | 免费观看一区二区三区 | 张津瑜警花国产精品一区 | 成人ay| 日本高清一区免费中文视频 | 18禁免费无码无遮挡不卡网站 | 情侣自拍80秒舌吻视频 | 人人看人人草 | 情欲都市成熟美妇大肉臀 | 欧美区视频 | 日本无码人妻精品一区二区蜜桃 | 日99久9在线 | 免费 | 九九影院理论片私人影院 | 国产网红女主播精品视频 | 国产免费高清视频1l.com.com.com少 | 夜夜爽av福利精品导航 | 国产在线不卡一区二区三区 | 成人亚洲精品久久久久软件 | 无码成a毛片免费 | 亚洲国产精久久久久久久 | 亚洲精品一区中文字幕乱码 | 调教在线观看 | 久久精品国产一区 | 色偷偷人人澡人人爽人人模 | 岛国黄色片 | 偷拍女人私密按摩高潮视频 | 日韩午夜一区二区在线精品三级伦理 | 小sao货水好多真紧h无码视频 | av在线中文字幕不卡电影网 | 亚洲国产精品久久人人爱 | 日本一区二区三区日本免费 | 国产经典久久久 | 玖玖爱在线观看 | 男人的天堂免费视频 | 欧美激情在线免费 | 大尺度做爰床戏呻吟2046 | 亚洲免费影院 | 亚洲第一成年人网站 | 亚洲人成影院在线观看 | 亚洲色偷偷色噜噜狠狠99网 | 亚洲一区波多野结衣在线app | 欧美精品一区在线播放 | 国产成人+综合亚洲+天堂 | 日日噜噜噜夜夜爽爽狠狠 | 成人国产欧美 | 亚洲深夜在线 | 秦大爷的性生生活1一7 | 日日操日日| 欧美牲交a欧美牲交aⅴ免费真 | 少妇超碰| 亚洲精品久久久久av无码 | 中文字幕乱偷无码av先锋 | 乱码一区二区三区四区 | 近伦中文字幕 | 荡女精品导航 | 特黄老太婆aa毛毛片 | 亚洲日韩精品欧美一区二区 | 人人超碰人摸人爱 | 亚洲成人一区 | 99久久婷婷国产综合精品免费 | 亚洲国产精品无码一线岛国 | 久久久精品中文字幕麻豆发布 | 久久久精品中文字幕麻豆发布 | 丰满少妇乱子伦精品看片 | 国产精品爽爽久久久久久竹菊 | 韩国无码色视频在线观看 | 最新国产精品精品视频 | 无码色偷偷亚洲国内自拍 | 国模av在线 | 黄色片毛片 | 日本孰妇毛茸茸xxxx | 一级片亚洲 | 日韩精品一区二区三区四区在线观看 | av首页在线| 99视频在线 | 久久99国产精品久久99 | 国产3级在线 | 超碰在线网 | 人与嘼av免费 | 亚洲制服丝袜一区二区三区 | 新呦u视频一区二区 | 亚洲一区二区二区久久成人婷婷 | 亚洲欧美日韩综合久久久 | 国产一大二大不卡专区 | 日韩国产在线播放 | 国产精品―色哟哟 | 成人午夜视频在线播放 | 日本无翼乌邪恶大全彩h | 午夜性刺激在线视频免费 | 人禽l交视频在线播放 视频 | 国产亚洲美女精品久久久2020 | 欧美精品一区在线 | 一女二男3p波多野结衣 | xx在线视频 | 国产在线播放一区二区 | 老湿午夜免费yin22xyz | 精品不卡在线 | 成人试看120秒体验区 | 亚洲黄色小说视频 | 欧美色射| 麻豆回家视频区一区二 | 狠狠色欧美亚洲狠狠色www | 免费xxxxx在线观看网站软件 | 农村乡下女人毛片 | 久热精品视频在线 | 少妇饥渴偷公乱第28章 | 色爱综合区 | 午夜视频在线 | 国精产品一区一区三区视频 | 依人综合 | 在线视频免费观看一区 | 青青草无码精品伊人久久 | 亚洲精品92内射 | 成人免费视频国产免费网站 | 国产人妻黑人一区二区三区 | 精品人伦一区二区三区蜜桃免费 | xxxxx欧美妇科医生检查 | 超碰在线成人 | 男女啪啪猛烈无遮挡猛进猛出 | 古代黄色一级片 | 国产精品一区二区无线 | 51综合区亚洲线观看 | 三级免费观看 | 色a在线观看 | 久久久久久久久淑女av国产精品 | 黄色片网站在线播放 | 国产91综合 | 韩国一级淫片 | 亚洲午夜成人片 | 妲己艳史淫片免费看 | 日韩一级视频在线 | 丰满少妇作爱视频免费观看 | 欧美国产一区二区三区激情 | 熟透的岳跟岳弄了69视频 | 新婚少妇在线观看一区 | 日本xxxxx九色视频在线观看 | 黄色片网站视频 | 老色鬼永久视频网站 | 好吊日精品视频 | 久久国产乱子伦精品免费午夜,浪货好紧 | 亚洲综合性 | 爱爱网站视频 | 福利视频精品 | 2区3区在线涩网涩 | 三级av在线免费观看 | 久久国产精品精品国产 | 激情小说图片视频 | 国产第一页精品 | 精品国精品自拍自在线 | 夜夜涩| 少妇淫片aaaaa毛片叫床爽 | 亚洲性猛交xxxx | 一a本v道久久 | 国产精选91 | 国产男女猛烈无遮挡免费视频网站 | 深夜福利免费视频 | av黄色在线看| 看黄色大片| 91在线中文 | 国产精品一级在线 | 欧洲成人综合网 | 男女啪啪进出阳道猛进 | 久久久免费观看 | 久久99国产亚洲高清观看首页 | 成人h动漫精品一区二区无码 | 黄色免费国产 | 欧美变态另类刺激 | 午夜精品久久久久久久99水蜜桃 | 国产com| 日韩影音 | 九热精品| 九九免费观看视频 | 成人羞羞网站入口免费 | 无码专区男人本色 | 69xx视频在线观看 | www亚洲色图 | 亚洲精品久久久久午夜 | 久久国产伊人 | 香蕉视频在线观看黄 | 免费网站看v片在线观看 | 色一情一乱一伦 | 999久久久| 国产成人精品午夜2022 | 欧美成人aaa片一区国产精品 | 少妇又紧又色又爽又黄又刺激 | 亚洲一区二区免费在线观看 | 色资源av | 一本色道综合久久欧美日韩精品 | 国产一级做a爱片久久毛片a | 高清不卡一区二区三区 | www.超碰在线 | 久久久久99一区二区三区 | 午夜国产福利 | 老太婆av | 国产成人精品无码片区在线观看 | 国产在线拍揄自揄拍无码视频 | 国产精品女同一区二区久久夜 | 国产亲子乱弄免费视频 | 手机看片福利一区二区三区 | 国产精品视频麻豆 | 成人做爰100部片免费下载 | 极品销魂美女少妇尤物优美 | 成人在线午夜视频 | 亚洲成人在线免费 | 国产精品二区在线 | 精品国产伦一区二区三区免费 | 国产毛片网 | 麻豆一区二区三区蜜桃免费 | 在线观看亚洲区 | 国产白丝精品91爽爽久久 | 国产成人综合美国十次 | 天天插天天 | 99热精品在线 | 国产网红主播av国内精品 | 国产乱妇乱子视频在播放 | 女人a级毛片 | 国产怡春院无码一区二区 | 久久久久久久综合色一本 | 怡红院a∨人人爰人人爽 | 国产午夜av秒播在线观看 | 色鬼7777久久 | 日韩中文av | 国产男女猛烈无遮挡a片漫画 | 精品亚洲a∨无码一区二区三区 | 精品无码一区二区三区不卡 | 国产精品综合 | 国产一区黄色 | 97成人在线| 91丨九色丨蝌蚪丨老板 | 奶罩不戴乳罩邻居hd播放 | 少妇的激情| 免费的很黄很污的视频 | 日韩精品一区二区三区四区视频 | 久久午夜无码鲁丝片午夜精品 | 一 级 黄 色蝶 片 | 波多野吉衣中文字幕 | 亚洲6080yy久久无码产自国产 | 早川濑里奈av在线播放 | 欧美爽妇| 自拍视频一区二区三区 | eeuss影院在线奇兵区145 | 欧美jizzhd精品欧美性24 | 免费网站成人 | 精品在线二区 | 乱人伦中文视频在线 | 柳州莫菁菁av一区 | 欧美成人一二三区 | 国语对白少妇×××bbb | 精品国产国产综合精品 | 波多野结衣中文一区 | avtt亚洲| 色噜噜狠狠色综合日日 | 两女女百合互慰av赤裸无遮挡 | 国产女同疯狂作爱系列 | 91国偷自产一区二区三区蜜臀 | 日韩黄色在线 | 床戏做爰无遮挡摸亲胸小说 | 国产免费不卡 | 波多野结衣aⅴ在线 | 欧美偷拍一区二区三区 | k8经典少妇在线观看 | 四虎影视18库在线影院 | 日本久久免费 | 久在线精品视频线观看 | 久久久久色| 日本三级免费 | 青青草日韩 | 岳睡了我中文字幕日本 | 爱情岛亚洲首页论坛小巨 | 亚洲a∨无码一区二区三区 国产乱子伦精品免费女 | 偷拍区另类欧美激情日韩91 | a∨av白浆导航 | av动态| 国产特黄大片aaaa毛片 | 日韩综合中文字幕 | 欧美亚洲天堂 | 意大利少妇愉情理伦片 | 熟妇高潮精品一区二区三区 | 伊人精品无码av一区二区三区 | 日韩欧美视频一区二区三区 | 久久精品麻豆 | 国产乱码久久久久久 | 国产裸体美女永久免费无遮挡 | 青草青草久热精品视频在线观看 | 91国内视频 | 日韩精品乱码av一区二区 | 国产精品无码成人午夜电影 | 91一区二区三区久久久久国产乱 | 91在线观看| 18禁美女裸体网站无遮挡 | 国产免费又色又爽粗视频 | 亚洲中文无码av永久 | 国产精品嫩草久久久久 | 性猛交富婆╳xxx乱大交视频 | 夜夜高潮夜夜爽夜夜爱爱 | 中文字幕丝袜第1页 | 天天摸天天看 | 先锋影音xfyy5566男人资源 | xxx国产精品视频 | 五月天天丁香婷婷在线中 | 亚洲中文字幕无码中文字在线 | 一本之道乱码区 | 大肉大捧一进一出好爽动态图 | 亚洲日韩国产av无码无码精品 | 国产精品系列在线观看 | 国产激情精品一区二区三区 | 国产乱人伦偷精品视频免下载 | 特级a毛片 | 国产动漫av | 久久久网址 | 色婷婷久久一区二区三区麻豆 | 久久精品嫩草影院 | 91高清在线 | 欧美一区二区三区日韩 | 天堂网站 | 18禁超污无遮挡无码免费网站国产 | 国产又粗又猛又爽免费视频 | 天码中文字幕在线播放 | 天天插天天干 | 久久久亚洲欧美 | 国产男女爽爽爽 | www国产精品内射老熟女 | 狂野欧美性猛交xxⅹ李丽珍 | 天天摸天天做天天爽水多 | 在线中文字日产幕 | 伊人蕉影院久亚洲高清 | 国产ts在线视频 | 久久久这里有精品 | 北条麻妃一区二区三区四区五区 | 亚洲第一页综合图片自拍 | 日韩精品二区在线观看 | 高清在线一区 | 99国产精品欲a | 中文字幕综合网 | 狠狠躁天天躁夜夜躁婷婷 | 日韩一卡2卡3卡4卡2021免费观看国色天香 | 中日韩在线观看视频 | av解说在线观看 | 国产激情艳情在线看视频 | 色片在线播放 | 北条麻妃99精品青青久久 | 首页 国产 欧美 日韩 丝袜 | 久久99热这里只有精品 | 欲香欲色天天天综合和网 | 日本一区二区三区在线免费观看 | 激情视频国产 | 91亚瑟视频 | 国产精成人品日日拍夜夜免费 | 色666| 日本乱子伦xxxx | 日韩精品极品视频在线观看免费 | 91精品国产91综合久久蜜臀 | 91片黄在线观看 | 88国产精品 | 国产精品国产a | 精品久久久久久成人av | 亚洲精品视频三区 | av播播| 国产精品伦一区二区在线 | 国产最爽的乱淫视频国语对白 | 色噜噜狠狠色综合中文字幕 | 国产精品三区四区 | 免费体验区试看120秒 | 少妇精品久久久一区二区三区 | 肉丝美足丝袜一区二区三区四 | 欧美一级做a爰片久久高潮 欧美一级做a爰片免费视频 | 68日本xxxxxⅹxxx59| 中文字幕丰满孑伦无码精品 | 久久久久久久久久久免费av | 久热这里只有精品视频6 | 亚洲精品蜜桃 | www.久久av.com | 国产女人在线观看 | 国产性av| 欧美日韩免费一区二区三区 | 亚洲一区色 | 国产精品久久国产精麻豆99网站 | 国产成人无码a区视频在线观看 | 日韩深夜视频 | 欧美日韩在线亚洲综合国产人 | 日本亚洲在线 | 精品国产一区二区三区香蕉 | 成人黄色免费 | 正在播放重口老熟女露脸 | 插b内射18免费视频 亚洲欧美另类激情综合区 很黄很色60分钟在线观看 | 国产精品丝袜久久久久久高清 | 熟女俱乐部五十路六十路 | 精品国产欧美一区二区三区不卡 | 国产精品视频导航 | 国产国拍亚洲精品av在线 | 91大神在线免费观看 | 污污视频免费网站 | 999午夜 | 亚洲第一综合色 | 香蕉视频网页版 | 性户外野战hd | 91看片一区二区三区 | 又大又硬又黄的免费视频 | 四虎永久在线精品免费播放 | 午夜精品久久久久久久四虎美女版 | 中文字幕资源站 | 亚洲国产婷婷香蕉久久久久久 | 欧美综合视频在线观看 | 99热2| 精品无码日韩国产不卡av | 日韩精品视频一二三 | 18禁免费无码无遮挡不卡网站 | 国产69精品久久久久99尤物 | 成人欧美一区二区三区白人 | 亚洲中文字幕无码mv | 国产一级淫片a | 国产精品无码久久久久成人影院 | 亚洲 欧美日韩 综合 国产 | 国产人妻大战黑人第1集 | 911国产在线 | 午夜激情av |