日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单元测试之DBUnit的使用以及原理剖析

發布時間:2024/4/11 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单元测试之DBUnit的使用以及原理剖析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面介紹了不少寫單元測試的內容,比方說Mockito和PowerMockito, JUnit 5,經常寫單元測試的想必對這些框架都比較熟悉。

這篇博客主要介紹下數據庫驅動測試框架–DbUnit(http://dbunit.sourceforge.net/), 主要從DbUnit的設計原理和實際使用來展開,這里的使用我又分為三個部分:

  • 基于spring-test-dbunit的使用
  • 基于dbunit本身api的使用
  • 在dbunit的基礎上整合了公司自己的jdbc框架完成的工具類
  • DBUnit 設計原理

    看過我之前關于單元測試的博客和熟悉單元測試的開發人員都知道,在寫單元測試時最重要的一點就是單元測試是要求可以反復執行驗證的。

    那么在我們對數據庫進行單元測試的時候,為了保證每次數據庫的單元測試都可以得到一個相同的結果,我們就不能直接使用數據庫里的數據來進行測試驗證,說不定什么時候數據就被別人修改了,而且我們的單測執行最好也不要對數據庫的數據有什么修改 — 很容易就想到的數據庫的事務特性。

    但是考慮到有的數據庫本身并不支持事務,比如MyISAM引擎,而由dbunit本身實現事務是比較復雜的,所以dbunit框架本身是沒有實現事務的

    dbunit的設計原理就是在執行測試用例之前,先備份數據庫,然后向數據庫中插入我們需要的初始化數據(準備數據),然后,在測試完畢后,清空表數據再將之前的備份的數據還原到數據庫,從而回溯到測試前的狀態。

    乍一看是不是也像是實現了一個"事務" ?但還是有兩個問題:

  • 如果在單測執行過程中遇到問題, 導致執行中斷,那么最后可能沒有正常還原數據,這樣的話就可能導致數據庫的數據丟失(所以無論單測執行成功還是失敗都記得一定要執行還原數據的代碼)
  • 單測執行過程中修改的數據在還原數據庫的時候是會有丟失的,不過因為是測試環境的數據,影響也不是很大
  • DBUnit 基本概念和流程

    基于DBUnit 單元測試的主要接口是IDataSet。IDataSet 數據集代表一個或多個表的數據。
    dbunit可以將數據庫的全部內容表示為IDataSet 實例。數據庫表可以用ITable 實例來表示。

    public interface IDataSet {/*** 從IDataSet獲取表名集合*/public String[] getTableNames() throws DataSetException;/*** 獲取數據庫指定表的元數據*/public ITableMetaData getTableMetaData(String tableName)throws DataSetException;/*** 獲取指定表*/public ITable getTable(String tableName) throws DataSetException;/*** 獲取所有的表集合*/public ITable[] getTables() throws DataSetException; }

    IDataSet 的實現有很多,每一個都對應一個不同的數據源或加載機制。最常用的幾種 IDataSet實現為:
    FlatXmlDataSet:數據的簡單平面文件 XML 表示
    QueryDataSet:用 SQL 查詢獲得的數據
    DatabaseDataSet:數據庫表本身內容的一種表示
    XlsDataSet :數據的excel表示

    我們使用DbUnit進行數據庫單元測試的流程如下:

  • 備份數據庫中的表數據
  • 準備好測試使用的初始化數據和預期的結果數據,一般用xml文件表示
  • 清空數據表并導入初始化數據。
  • 執行對應的測試方法,比較實際執行的返回結果與預期結果是否匹配
  • 使用備份文件還原表數據
  • DBUnit 使用

    spring 結合dbunit完成db測試

    dbunit本身并沒有提供事務支持的功能,但是spring是可以提供事務支持的,包括聲明式事務和程序控制事務。所以dbunit結合spring可以將上述單元測試的執行全都放在一個事務里,這樣就可以解決我上面提到的兩個問題

    如果結合spring使用dbunit進行單元測試,就需要引入dbunit和spring-test-dbunit兩個jar包

    <dependency><groupId>com.github.springtestdbunit</groupId><artifactId>spring-test-dbunit</artifactId><version>1.2.0</version><scope>test</scope></dependency><dependency><groupId>org.dbunit</groupId><artifactId>dbunit</artifactId><version>2.5.0</version><type>jar</type><scope>test</scope></dependency> @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = ServiceInitializer.class) @TestExecutionListeners({DependencyInjectionTestExecutionListener.class,DirtiesContextTestExecutionListener.class,TransactionalTestExecutionListener.class,DbUnitTestExecutionListener.class }) @DbUnitConfiguration(databaseConnection={"dataSource"}) @Transactional public class BaseTest {}

    因為我們使用@DbUnitConfiguration注解傳入了dataSource, 這樣在dbunit里獲取連接的時候得到就是從spring管理的數據源獲取的connection,這樣事務管理也可以由spring的聲明式事務托管。

    public class UserMapperDBUnitTest extends BaseTest {@Autowiredprivate UserMapper userMapper;@Test@DatabaseSetup("/dbunit/sampleData_initdata.xml",type = DatabaseOperation.CLEAN_INSERT)@ExpectedDatabase(value = "/dbunit/sampleData_result_insert.xml", assertionMode = DatabaseAssertionMode.NON_STRICT)public void testInsertSelective(){User user = new User();user.setId("2");user.setUserName("Tom");user.setAge(28);user.setBirthday("1993-03-21");user.setAddress("上海市浦東新區");userMapper.insertSelective(user);}}

    sampleData_initdata.xml :

    <?xml version="1.0" encoding="UTF-8"?> <dataset><user id="1" user_name="Bob" age = "20" birthday = "2000-01-02" address = "北京市大興區" /> </dataset>

    sampleData_result_insert.xml :

    <?xml version="1.0" encoding="UTF-8"?> <dataset><user id="1" user_name="Bob" age = "20" birthday = "2000-01-02" address = "北京市大興區" /><user id="2" user_name="Tom" age = "28" birthday = "1993-03-21" address = "上海市浦東新區" /> </dataset>

    @DatabaseSetup: 用于指定初始化數據庫的xml文件,以及初始化方式。 默認使用的是CLEAN_INSERT方式,也就是先清除數據庫的所有數據再插入準備的數據;如果表中的數據比較多,建議使用REFRESH方式,表示不會將原數據清空,而是直接對數據表中xml中存在的數據進行更新,不存在的就進行插入

    @ExpectedDatabase 執行完測試方法后,將數據庫中的數據查詢出來和xml中的數據進行比較
    注解參數query: 如果沒有則查詢所有的數據,否則按照指定的sql進行查詢
    參數 assertionMode: 支持兩種數據驗證方式:1)DatabaseAssertionMode.DEFAULT 要驗證所有的字段 2)DatabaseAssertionMode.NON_STRICT則支持只驗證部分字段(實際測試中NON_STRICT更為常用)

    使用dbunit原生api完成db測試

    上述spring-test-dbunit使用的前提是需要結合被spring管理的數據源, 因為公司有的舊項目是使用了自己開發的jdbc框架,其數據源無法直接獲取,也沒辦法使用上面簡單的注解方式

    所以自己使用了dbunit的API來編寫數據庫的單元測試,具體代碼如下:

    public class DBUnitConnection {private static IDatabaseConnection CONNECTION_INSTANCE = null;//創建DBUnit Connection,先創建數據源, 再從數據源中獲取到連接, 封裝成MySQLConnectionpublic static IDatabaseConnection getConnection() throws Exception {if (null == CONNECTION_INSTANCE) {//下面三行代碼主要是為了獲取數據庫連接,可以根據你在項目中實際獲取數據源和連接的方式調整XXDataSourceFactory factory = new XXDataSourceFactory();DataSource dataSource = factory.createDataSource();Connection connection = dataSource.getConnection();CONNECTION_INSTANCE = new MySqlConnection(connection,"userdb");}return CONNECTION_INSTANCE;}public void closeConnection() throws Exception {if (null != CONNECTION_INSTANCE) {if (!CONNECTION_INSTANCE.getConnection().isClosed()) {CONNECTION_INSTANCE.close();}CONNECTION_INSTANCE = null;}} } public class DbUnitUtil {//備份表數據public static void backupDatabase(String[] tables,File backupFile) throws Exception{QueryDataSet dataSet= new QueryDataSet(DBUnitConnection.getConnection());for(String _table:tables){dataSet.addTable(_table);}FlatXmlDataSet.write(dataSet, new FileOutputStream(backupFile));}//清空表數據,并導入測試數據public static void importTables(File dataFile) throws Exception{IDataSet dataSet=new FlatXmlDataSetBuilder().build(dataFile);DatabaseOperation.CLEAN_INSERT.execute(DBUnitConnection.getConnection(), dataSet);}//清空表數據,恢復備份數據public static void resumeDatabase(File backupFile) throws Exception{IDataSet dataSet= new FlatXmlDataSetBuilder().build(backupFile);DatabaseOperation.CLEAN_INSERT.execute(DBUnitConnection.getConnection(), dataSet);} } @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {ServiceInitializer.class}) public class UserMapperDBUnitTest {@Autowiredprivate UserMapper userMapper;private static final String TABLE_NAME = "user";private static String path = "";@Beforepublic void init() throws Exception {path = UserMapperDBUnitTest .class.getClassLoader().getResource("").getPath()+"dbunit/backupAllData.xml";//備份數據表到path路徑下的xml文件DbUnitUtil.backupDatabase(new String[]{TABLE_NAME},new File(path));}@Afterpublic void down() throws Exception {//還原表數據DbUnitUtil.resumeDatabase(new File(path));}@Testpublic void testInsertOneRecord() throws Exception {String path = getClass().getClassLoader().getResource("").getPath()+"dbunit/sampleData_initdata.xml";//清空并導入初始化數據DbUnitUtil.importTables(new File(path));User user = new User();user.setId("2");user.setUserName("Tom");user.setAge(28);user.setBirthday("1993-03-21");user.setAddress("上海市浦東新區");userMapper.insertSelective(user);String resultFile = getClass().getClassLoader().getResource("").getPath()+"dbunit/sampleData_result_insert.xml";IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File(resultFile));assertDataSet(TABLE_NAME, "SELECT id, user_name, age, birthday, address FROM user", dataSet);}

    雖然按照上面的方式可以實現數據庫的單元測試,但是會出現最早提到的兩個問題:

  • 執行過程中更新的數據會丟失
  • 執行失敗可能會導致原來測試數據庫的數據丟失
  • 所以還是需要一個"事務"幫助我們來解決上述問題。

    手動實現dbunit與事務的結合

    查看了下我們的jdbc框架,它本身也是有事務支持的,既支持聲明式事務,也支持編程式事務。我試著按照spring-test-dbunit和dbunit的使用方式來編寫測試方法,但是在執行的時候會報錯,提示使用事務注解的bean只能事務管理器來創建,所以最后我選擇了使用編程式事務來解決上述問題

    解決思路 :
    我的目的是將dbunit對數據庫的操作和應用代碼里對數據庫的操作放到一個事務里,那么首先二者需要處于一個連接中,我之前的代碼中直接從數據源創建新連接的方法是需要修改的;其次就是需要將對數據庫操作的代碼都放在編程式事務里

    為了方便使用,我將代碼進一步封裝,這樣在編寫測試用例的時候就可以只使用自定義注解和Rule來完成對數據庫的清除,還原等操作。

    修改后的代碼如下:

    @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DBUnitAnnotation {/*** Provides the locations of the datasets that will be used to reset the database.*/String setupFile() ;/*** Provides the locations of the datasets that will be used to test the database.*/String resultFile() default ""; } public class DBUnitUtils {/*** clean table and input init data to table* */public static void importTables(File dataFile) throws Exception{IDataSet dataSet = new FlatXmlDataSetBuilder().build(dataFile);//通過反射獲取項目中使用的connection實例DatabaseOperation.CLEAN_INSERT.execute(getConnectionInTransaction(), dataSet);}private static IDatabaseConnection CONNECTION_INSTANCE = null;/*** get the connection which is use in application* */public static IDatabaseConnection getConnectionInTransaction() throws Exception {// 這里是我根據公司的代碼寫的,你們可以按照自己項目的實際情況調整// 通過反射獲取事務管理器的transactionHolder靜態變量,從中獲取項目中使用的connection實例(因為公司的框架并沒有提供api讓我們可以在項目中獲取使用的連接實例)Field f = XXTransactionManager.class.getDeclaredField("transactionHolder");f.setAccessible(true);ThreadLocal<XXTransaction> transactionHolder = (ThreadLocal<XXTransaction>) f.get(null);XXTransaction transaction = transactionHolder.get();Connection connection = transaction.getConnection();CONNECTION_INSTANCE = new MySqlConnection(connection, "");return CONNECTION_INSTANCE;}/**** compare the database data with the expectedDatabase* @param expectedDataSet* @throws Exception*/public static void assertDataSet(IDataSet expectedDataSet) throws Exception {String[] tableNames = expectedDataSet.getTableNames();for (String tableName : tableNames) {//獲取dataSet的表元數據,得到對應的Column集合Column[] columns = expectedDataSet.getTable(tableName).getTableMetaData().getColumns();String queryField = "";for (int i = 0 ; i < columns.length ; i++) {queryField += columns[i].getColumnName();if (i != columns.length - 1) {queryField += " , ";}}String sql = "select " + queryField + " from " + tableName;QueryDataSet loadedDataSet = new QueryDataSet(DBUnitUtils.getConnectionInTransaction());loadedDataSet.addTable(tableName, sql);//從當前數據庫中查詢所有數據 并和預期的數據集進行比較ITable table1 = loadedDataSet.getTable(tableName);ITable table2 = expectedDataSet.getTable(tableName);Assert.assertEquals(table2.getRowCount(), table1.getRowCount());DefaultColumnFilter.includedColumnsTable(table1, table2.getTableMetaData().getColumns());Assertion.assertEquals(table2, table1);}} } public class DbUnitTransactionRule implements TestRule {@Overridepublic Statement apply(final Statement base, Description description) {if (description.getAnnotation(DBUnitAnnotation.class) == null) {return new Statement() {@Overridepublic void evaluate() throws Throwable {base.evaluate();}};}final DBUnitAnnotation dbUnitAnnotation = description.getAnnotation(DBUnitAnnotation.class);//如果有DBUnitAnnotation注解return new Statement() {@Overridepublic void evaluate() throws Throwable {try {//開啟事務String path = getClass().getClassLoader().getResource("").getPath() + dbUnitAnnotation.setupFile();DBUnitUtils.importTables(new File(path));base.evaluate();if (StringUtils.isNotEmpty(dbUnitAnnotation.resultFile())) {String resultFile = DBUnitUtils.class.getClassLoader().getResource("").getPath() + dbUnitAnnotation.resultFile();IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(new File(resultFile));DBUnitUtils.assertDataSet(expectedDataSet);}} catch (Throwable e) {e.printStackTrace();//如果原來的單測有異常,則拋出斷言失敗也就是測試用例執行失敗throw new AssertionError();} finally {//TODO 回滾,哪怕單測執行成功也要還原現場}}};} }

    使用的時候只需要加上DbUnitTransactionRule 和 @DBUnitAnnotation 注解就可以了,是不是很方便

    @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {ServiceInitialier.class}) public class TRedPointRecordDaoDBUnitTest2 {@Autowiredprivate UserMapper userMapper;@Rulepublic DbUnitTransactionRule rule = new DbUnitTransactionRule();@Test@DBUnitAnnotation(setupFile = "dbunit/sampleData_initdata.xml", resultFile = "dbunit/sampleData_result_insert.xml")public void testInsertOneRecord() throws Exception {User user = new User();user.setId("2");user.setUserName("Tom");user.setAge(28);user.setBirthday("1993-03-21");user.setAddress("上海市浦東新區");userMapper.insertSelective(user);} }

    封裝的代碼有一些考慮的還不是很完整,比如不支持多個xml文件;在校驗數據的時候也沒有對兩個DataSet里的表做完全的相等判斷

    我本來是想寫成兩個注解,但是在測試的時候發現Rule的Description只能拿到兩個注解,所以我就把兩個注解定義成一個了 – 目前還沒找到原因,如果有讀者知道這個問題的答案歡迎在評論區分享下

    總結

    基本關于DBUnit的介紹就到這里了。

    使用DBUnit進行數據庫的單元測試,最好是可以結合事務來執行,這樣可以避免出現測試數據沒有被正常還原或者丟失執行過程中更新的數據的問題。

    基本思路就是 開啟事務 --> 清空表數據 --> 插入初始化數據 --> 執行測試方法 --> 查詢表數據,比較預期結果和執行結果是否一致 --> 回滾事務(無論測試方法是否正確執行,最后都需要回滾)

    最后的一部分是我基于工作中整合dbunit和內部的jdbc框架的需要,因為不同的jdbc框架獲得connection的方式不一樣(甚至有的框架可能也支持類似spring-test-dbunit的聲明式事務的寫法),所以我只是寫了自己項目中的代碼實現,希望對有同樣需求的開發者可以提供一些思路。

    參考資料:

    JUnit單元測試6—@Rule注解

    總結

    以上是生活随笔為你收集整理的单元测试之DBUnit的使用以及原理剖析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    人人爱人人舔 | 一区三区视频在线观看 | 久草在线免费资源站 | 久久网站免费 | 亚洲美女在线国产 | 欧美大片大全 | 97操操操 | 国产在线高清精品 | 亚洲国产精品一区二区久久hs | 美女中文字幕 | 这里只有精品视频在线观看 | 欧美一区二区三区在线 | 精品亚洲成a人在线观看 | 国产精品99久久久久人中文网介绍 | 91精品视频在线 | 国产白浆视频 | 亚洲小视频在线观看 | 麻豆传媒电影在线观看 | a亚洲视频 | 国产91免费看 | 国产一区二区在线观看视频 | 美女网站视频久久 | 日韩久久久久久久 | 一区二区三区中文字幕在线 | 这里只有精品视频在线 | 热久久最新地址 | 国产在线自 | 奇米影视777影音先锋 | 成人va在线观看 | 日韩av资源在线观看 | 91高清一区 | 婷婷色社区| 狠狠的干狠狠的操 | 91亚洲网 | 五月天电影免费在线观看一区 | 午夜视频在线观看一区二区三区 | 在线中文视频 | 日本中文在线播放 | 午夜电影久久 | 夜夜视频欧洲 | 国产视频一区二区在线 | 国产高清在线观看av | 黄色一级大片在线观看 | 精品国产中文字幕 | 精品1区二区| av高清不卡 | 视频福利在线观看 | 亚洲成人av免费 | 天天天天射 | 欧美一二区视频 | 午夜久久福利视频 | 午夜精品一区二区三区在线播放 | 粉嫩av一区二区三区免费 | 国产尤物在线 | 黄色亚洲片 | 麻豆精品视频 | 人人爽人人爽人人片 | 高清精品在线 | ,午夜性刺激免费看视频 | 米奇狠狠狠888 | 69性欧美| 在线观看免费av网 | 黄色在线观看www | 96亚洲精品久久久蜜桃 | 五月天国产精品 | 国产区精品视频 | 一区二区三区中文字幕在线观看 | 久草在线精品观看 | 中文字幕一区二区三区四区在线视频 | 亚洲小视频在线观看 | 99在线免费观看视频 | 在线视频手机国产 | 69xx视频| 天天做夜夜做 | 日日干日日| 欧美日韩免费在线视频 | 日韩一级成人av | 99se视频在线观看 | 午夜三级福利 | 色综合久 | 国产精品白虎 | 久久综合九色综合网站 | 亚洲一区 影院 | 国产高清精 | 欧美大片在线观看一区 | 国产一区二区在线播放视频 | 日韩一级片大全 | 色综合久久66 | 午夜免费久久看 | 亚洲一区精品二人人爽久久 | 免费一级片久久 | 国产精品扒开做爽爽的视频 | 中文字幕在线观看第一区 | 天天射天天干 | 人人爽久久久噜噜噜电影 | 国产在线观看免费 | 久久久久久国产精品 | 日韩av看片 | 91视频午夜 | 中文字幕永久在线 | 一区二区三区高清在线 | 97视频人人澡人人爽 | 国产一级不卡视频 | 久久观看免费视频 | 成人小视频在线观看免费 | 天天摸天天干天天操天天射 | 国产五码一区 | 亚洲精品国久久99热 | 久久99精品热在线观看 | 91热这里只有精品 | 麻豆成人精品视频 | 久久最新网址 | 久久综合影院 | 国产亲近乱来精品 | 伊人婷婷在线 | 国产理论一区二区三区 | 欧美日韩一区二区视频在线观看 | av成人免费在线观看 | 日本激情视频中文字幕 | 日本黄色免费电影网站 | av.com在线| 天天操福利视频 | 色噜噜色噜噜 | 亚洲精品黄色在线观看 | 91色网址 | www.com.黄| 国产日本亚洲 | 天天色天天草天天射 | 在线免费观看黄色 | 人人爽爽人人 | 久久99精品波多结衣一区 | 婷婷综合国产 | 色偷偷人人澡久久超碰69 | 久久久久免费电影 | 国产高清视频色在线www | 特级西西人体444是什么意思 | 国产高清在线精品 | 国产精品2区 | 久久黄色影视 | 网址你懂的在线观看 | 日韩精品第1页 | 日韩精品一区二区在线观看 | 美女又爽又黄 | 伊人久久影视 | 亚洲黄色网络 | 夜夜躁日日躁狠狠久久88av | 国产精品一区二区久久精品爱涩 | 亚洲麻豆精品 | 91成熟丰满女人少妇 | 亚洲欧洲国产视频 | 美女在线免费视频 | 91麻豆精品国产自产在线 | 精久久久久| 色婷婷欧美 | a在线免费 | 精品在线观看一区二区 | 亚洲国产免费网站 | h久久| 国产69久久精品成人看 | 成人一级黄色片 | 国产精品久久久网站 | 欧美日韩在线观看不卡 | 中文字幕在线播放日韩 | 中文字幕字幕中文 | 久青草视频在线观看 | 在线观看精品国产 | 久久久国产毛片 | 国产精品毛片一区视频播不卡 | 岛国av在线| 欧美精品乱码久久久久 | 国产黄色精品视频 | 国产精品久久久久一区 | 亚洲精品乱码久久久久 | 丁香六月伊人 | 日韩av影片在线观看 | 国产成人综 | 91大神精品视频在线观看 | 国产成人免费av电影 | 国产精品久久久久久麻豆一区 | 日韩免费成人av | 久久久久视 | 激情久久久久久久久久久久久久久久 | 黄色成人在线网站 | 亚州免费视频 | 国产色影院 | 欧美日韩国产一二 | 国产小视频免费观看 | 麻豆传媒视频在线免费观看 | 免费看污网站 | 国产精品美女毛片真酒店 | 黄色不卡av | 日日干精品 | 国产一卡久久电影永久 | 99热这里只有精品免费 | 成人在线播放视频 | 久久人人爽爽人人爽人人片av | 午夜久久久久久久 | 国产精品午夜久久久久久99热 | 天天玩天天干天天操 | 婷婷国产一区二区三区 | 91看片成人 | 国产亚洲精品福利 | 久久久综合色 | 日本久久久久久 | 中文在线免费看视频 | 久久99精品久久久久久秒播蜜臀 | 成人av免费在线播放 | 久久久久久久久久久精 | 97成人在线| 精品国产午夜 | 九九久久久久99精品 | 992tv又爽又黄的免费视频 | 伊人www22综合色 | 伊人网综合在线观看 | 激情久久久久久久久久久久久久久久 | 欧美精品国产综合久久 | 精品久久久久久亚洲综合网站 | 色婷婷色| 国产精品久久久久久a | 黄色毛片电影 | a午夜在线 | 欧美激情精品久久 | 91视频下载 | 亚洲爱爱视频 | 久久久亚洲网站 | 国产视频高清 | 色在线中文字幕 | 狠狠艹夜夜干 | 91超级碰碰 | 久久网址 | 久久综合婷婷国产二区高清 | 亚洲在线成人精品 | 国产一区二区在线免费播放 | 久久久久久久久久久久久国产精品 | 午夜神马福利 | 色狠狠干 | 日p视频在线观看 | 成人国产精品免费观看 | 国内精品久久久 | 欧美激情另类 | 国产尤物在线视频 | 免费国产在线观看 | 天躁狠狠躁 | 精品你懂的 | 中文字幕第一页在线播放 | 超级碰碰碰免费视频 | 美女黄视频免费 | 五月婷婷综合色拍 | 国产成人精品亚洲 | 国产成人综 | 在线黄色国产 | 伊人久操 | a级一a一级在线观看 | 91在线免费观看网站 | 国产自制av | 丁香六月激情婷婷 | av中文字幕亚洲 | 久久精品aaa | 97在线播放视频 | 国产精品久久久久av福利动漫 | 亚洲欧洲精品在线 | 开心激情五月网 | 日韩一区二区三区观看 | 久久免费毛片视频 | 五月开心婷婷网 | 久久97视频| 久草新在线 | 久久爱导航 | 欧美在线不卡一区 | 国产最新福利 | 日本精品在线 | 91一区一区三区 | 人人澡人人爽 | 精品美女久久久久 | 久久免费播放 | 欧美一区二区三区特黄 | 深爱开心激情 | 欧美另类xxx | 国产亚洲精品久久久久久无几年桃 | 国产亚洲在线视频 | 在线观看完整版免费 | 亚洲色图美腿丝袜 | 狠狠色丁香婷婷综合久久片 | 国内99视频 | 激情欧美一区二区三区免费看 | 久av在线 | 这里只有精品视频在线 | 麻豆视频在线免费 | 国产免费午夜 | 97操操操 | 久草在线这里只有精品 | 国内免费的中文字幕 | 人人爽久久久噜噜噜电影 | 久久久久久久久久久影视 | 久久国产精品一区二区三区四区 | 在线日韩一区 | 在线看片a| 日韩二区在线 | 久久dvd| 日韩午夜av | 色综合色综合久久综合频道88 | 国产伦理剧 | 色婷婷啪啪免费在线电影观看 | www五月天com| 欧美伦理一区二区 | 在线播放亚洲 | 亚州精品天堂中文字幕 | 天天色天天射综合网 | 日韩精品影视 | 久久在现视频 | 国产精品久久久久久久久久免费 | 久久99久久99精品免视看婷婷 | 午夜在线资源 | 久久国产香蕉视频 | 九九九在线观看 | 日韩中文字幕视频在线观看 | 嫩草av在线 | 日本一区二区不卡高清 | 国产二区视频在线观看 | 欧美激情视频一二三区 | 国产视频一区二区在线播放 | 久久久久久毛片精品免费不卡 | 91大神一区二区三区 | 黄色免费高清视频 | 永久免费观看视频 | 国产在线一区观看 | 免费视频 你懂的 | 爱射综合 | 99视频在线观看免费 | 在线观看资源 | 91精品夜夜| 在线91精品 | 天天艹日日干 | 亚洲视频免费在线观看 | 九月婷婷色 | 亚洲精品国产精品国自产在线 | 天天色综合1 | 91成人精品| 国产手机在线观看视频 | 中文字幕在线免费观看视频 | 色网站免费在线观看 | 欧美在线视频不卡 | 手机av网站 | 免费黄色激情视频 | 免费a级大片 | 色综合夜色一区 | 久久视频 | 国产中文字幕免费 | 欧洲一区精品 | 亚洲精品在线观看免费 | 精品一区二区亚洲 | 亚洲理论影院 | av免费高清观看 | 色婷婷a | 婷婷色5月 | 五月婷婷丁香网 | 久久伦理电影 | 国产成人一区二区三区影院在线 | 91亚洲精品国偷拍自产在线观看 | 中文字幕一区二区三区四区久久 | 久久视了 | 精品国产乱码久久久久久三级人 | 亚洲国产精品500在线观看 | 在线91色 | 国产精品成人一区二区三区吃奶 | 久久久精品综合 | 中文字幕在线视频国产 | 成人一级在线 | 久久综合久色欧美综合狠狠 | 国产精品18久久久久vr手机版特色 | 黄色av网站在线观看 | 免费看的黄色片 | 久久免费福利 | 欧美小视频在线 | 国产精品剧情在线亚洲 | 中文字幕丰满人伦在线 | 狠狠色噜噜狠狠狠狠2022 | 成人免费av电影 | 国产手机在线观看视频 | 一级一片免费观看 | 五月天婷婷免费视频 | 日韩高清免费在线观看 | 亚洲成人免费在线 | 91av蜜桃 | 中文字幕观看在线 | 久久 在线| 在线免费观看黄色大片 | 国产精品久久久久av | 一级欧美黄 | 国内精品久久久久久久久久 | 亚洲最大免费成人网 | 天天干人人插 | 日韩欧美一区二区在线观看 | 黄色毛片网站在线观看 | 蜜臀91丨九色丨蝌蚪老版 | 色香蕉网| 99久久精品免费 | 91探花系列在线播放 | 欧美精品亚州精品 | 欧美精品久久99 | 天天综合网久久综合网 | 国产香蕉视频在线观看 | av网站在线观看免费 | 91九色视频在线 | 国产视频欧美视频 | 国产精品人成电影在线观看 | 国产精品色在线 | 天天艹天天爽 | 深夜免费小视频 | 国产精品99久久久精品免费观看 | 国产一性一爱一乱一交 | 精品国产免费一区二区三区五区 | 国产人在线成免费视频 | 久久视频 | 色噜噜噜 | 中文字幕国产精品 | 欧美精品在线一区二区 | 国产精品久久久99 | 天天色天天上天天操 | 日韩三级.com| 毛片无卡免费无播放器 | 亚洲第一区在线播放 | 中文字幕区 | 久久狠狠一本精品综合网 | 久草精品视频在线播放 | 中文字幕在线视频国产 | 色综合婷婷 | 日韩91精品 | 亚洲伊人色 | 亚洲天堂网在线播放 | 在线观看视频国产一区 | 97精品电影院 | 开心综合网 | 久久99热这里只有精品 | 91成人短视频在线观看 | 麻豆精品在线 | 欧美日韩一区三区 | 国产美女被啪进深处喷白浆视频 | 99精品视频网 | 手机成人av | 丝袜一区在线 | 韩日在线一区 | 色婷婷激婷婷情综天天 | 久久国产精品99国产精 | 亚洲精品在线免费看 | 成人黄色国产 | 丝袜美腿在线视频 | 一区二区三区在线观看 | 国产成人亚洲在线观看 | 久久综合中文色婷婷 | 国内免费的中文字幕 | 国产成人免费精品 | 免费久久精品视频 | 9999免费视频 | 在线 成人| 国产精品毛片一区 | 国产一区二区精 | 99久久精品久久久久久清纯 | 日韩欧美中文 | 国产又粗又猛又色又黄网站 | 亚洲天天看 | 欧美性色综合网站 | 日韩精品一区二区久久 | 欧美日韩国产高清视频 | 在线香蕉视频 | 国产在线播放一区二区 | 国产九九九九九 | 国产精品免费视频一区二区 | 精品国产伦一区二区三区观看体验 | 亚洲中字幕| 欧美少妇影院 | 午夜婷婷综合 | 免费黄色网址大全 | 天天综合久久综合 | 国产高清区| 色在线网 | 一本—道久久a久久精品蜜桃 | 日韩色中色 | 一二三区av | www.亚洲精品 | 色天堂在线视频 | 色wwww| 久久精品网址 | 日韩精品在线看 | 国产精品成人久久久久久久 | 成人免费视频网址 | 91免费版在线 | 国产精品原创在线 | 国色天香在线 | 四虎成人精品在永久免费 | 日韩色av色资源 | 精品欧美一区二区三区久久久 | 热热热热热色 | 成人免费视频免费观看 | 狠狠干网 | 日本中文字幕高清 | 国产尤物在线视频 | 国产在线国偷精品产拍 | 狠狠操导航 | 少妇视频在线播放 | 天天射天天爽 | 91手机电视 | 97超级碰碰| 欧美一级黄色视屏 | 开心色婷婷 | 久久久久综合视频 | 欧美一级久久 | 色先锋资源网 | 韩国av在线 | 日韩高清www | 美女搞黄国产视频网站 | 在线观看精品视频 | 日韩欧美大片免费观看 | 日本aa在线| 激情欧美一区二区三区 | 免费合欢视频成人app | 亚洲无吗av| 久久久久免费看 | 国产精品午夜在线观看 | 日韩r级电影在线观看 | 97精品国产97久久久久久免费 | 日韩欧美69 | www.色五月 | 91在线看免费 | 国产精品手机播放 | 国产成人精品在线 | 麻豆久久久久久久 | 国产人成一区二区三区影院 | 国产精品久久久久久久久久久久午夜片 | 日韩国产欧美在线视频 | 国产精品嫩草影院123 | 免费黄色看片 | 免费在线观看黄色网 | 亚洲v欧美v国产v在线观看 | 国产91免费观看 | 久久免费美女视频 | 亚洲成人免费在线 | 色天天久久 | 中文字幕91在线 | 亚洲 欧美 日韩 综合 | 午夜丁香视频在线观看 | 天天操夜夜想 | 成人福利在线观看 | 日日夜夜天天干 | 久久久久久高潮国产精品视 | 日韩av网站在线播放 | 狠狠狠色丁香婷婷综合激情 | 精品视频国产 | 免费黄色av片 | 在线观看中文字幕一区二区 | 国产精品国产亚洲精品看不卡15 | 超碰公开97| 国产亚洲情侣一区二区无 | 久久在线视频精品 | 中文视频一区二区 | 91av在线免费看 | 96精品在线 | 91免费在线视频 | 免费视频一二三区 | 在线成人观看 | 天天干天天操天天射 | 亚洲精品www久久久 www国产精品com | 天天在线视频色 | www.香蕉 | 国产免费观看高清完整版 | 国产玖玖视频 | 免费视频你懂得 | 国产日产精品一区二区三区四区 | 在线观看深夜视频 | 久久国产视频网 | 日韩3区| 欧美一级日韩三级 | 色中色综合| 91最新地址永久入口 | 国产精品一区二区三区视频免费 | 综合色天天 | 精品一区精品二区高清 | 亚洲久草网 | 国产高清免费在线观看 | 最近中文字幕在线中文高清版 | 91精品国产91热久久久做人人 | 国产视频久久久久 | 99久热精品 | 超碰国产97| 久久久www成人免费精品 | 国产精品久免费的黄网站 | 日本黄色免费看 | 欧美性受极品xxxx喷水 | 欧美日韩视频在线观看一区二区 | 国产精品短视频 | 99热这里只有精品国产首页 | 18女毛片 | 欧美精品你懂的 | 黄在线免费看 | 国产不卡片 | av在线永久免费观看 | 成人精品亚洲 | 久久婷婷国产色一区二区三区 | 亚洲综合在线观看视频 | 欧美ⅹxxxxxx | 国产日韩精品欧美 | 国产色资源 | 中文字幕视频一区 | 国内偷拍精品视频 | 亚洲精品网址在线观看 | 欧美一区二区三区激情视频 | 免费热情视频 | 在线视频精品 | 久久久精品国产一区二区 | 99re久久精品国产 | 99色免费| www.伊人网.com| 婷婷色资源 | av一区二区在线观看中文字幕 | 一区二区三区在线电影 | 在线不卡a | 亚洲精品色视频 | 夜夜操天天 | 999国产在线| 国产亚洲视频系列 | 二区中文字幕 | 久久视频国产精品免费视频在线 | 可以免费观看的av片 | 免费观看一级视频 | 久草精品免费 | 国产高清在线免费观看 | 久久久国产成人 | 色婷婷激情电影 | 欧美久久久一区二区三区 | 婷婷国产一区二区三区 | 亚洲精品在线二区 | 午夜在线免费观看视频 | 国产不卡在线播放 | 激情五月婷婷 | 中国一级片视频 | 91av资源网| 韩国av免费在线观看 | 久久91网 | 国产玖玖视频 | 欧美日韩国产mv | 亚洲成成品网站 | 日韩在线观看免费 | 热热热热热色 | 日韩午夜高清 | 成人在线观看影院 | 天天操天天干天天 | av网站在线免费观看 | 天天操综合网站 | av在线最新 | 国产激情免费 | 97精品国自产拍在线观看 | 久久精品电影网 | 亚洲国产一二三 | 91视频成人免费 | 福利视频导航网址 | 99热精品久久 | 国产五十路毛片 | 久久综合婷婷 | 国产视频观看 | 久久伊99综合婷婷久久伊 | 偷拍视频一区 | 日韩av播放在线 | 香蕉视频在线观看免费 | 久久久久久久久综合 | 日韩精品一区二区三区免费观看 | 久久老司机精品视频 | a久久久久 | 欧美日韩视频在线一区 | 免费黄色网址网站 | 丰满少妇一级 | 国产精品精品国产婷婷这里av | 99久久久久久久久久 | 碰超在线观看 | 国产va精品免费观看 | 日韩精品一区二区三区第95 | 狠狠色伊人亚洲综合网站色 | 久久精彩 | 午夜影视av| 精品久久久精品 | 欧美激情在线网站 | 99国产在线视频 | 中文字幕在线有码 | 色婷婷综合久久久久 | 国产中文字幕在线播放 | 国产成人精品久久二区二区 | 欧美一级电影 | 久久免费看视频 | 国产亚洲免费的视频看 | 久久99国产精品久久99 | 精品国产免费一区二区三区五区 | 韩国精品在线观看 | 亚欧日韩av | 韩国av在线播放 | 一区二区三区在线免费观看视频 | 中文在线天堂资源 | 欧美在线不卡一区 | 日韩精品一区二区三区在线播放 | 中文视频在线看 | 久操中文字幕在线观看 | 亚洲精品玖玖玖av在线看 | 91在线视频在线 | 中文字幕2021 | 亚洲国产精品成人女人久久 | 精品黄色在线观看 | 激情综合五月天 | 91色在线观看 | 黄色a一级视频 | 国精产品999国精产 久久久久 | 国产精品久久久久久久久久东京 | 成人av一区二区兰花在线播放 | 久久久久国产精品厨房 | 久久草草影视免费网 | 一区免费观看 | 成人av久久 | 国产精品综合av一区二区国产馆 | 久久精品中文视频 | 伊人色播| 色.com| 狠狠狠综合| 国产黄网站在线观看 | 五月婷婷丁香网 | 国产亚洲精品bv在线观看 | 91香蕉视频黄色 | 久久99久久99精品中文字幕 | 狠狠色丁香久久婷婷综合五月 | 在线观看中文 | 欧美在线观看视频一区二区 | 免费看av片网站 | 色操插| 黄色精品视频 | 视频在线观看入口黄最新永久免费国产 | 久草网在线视频 | 亚洲一区二区天堂 | 91成人区 | 中文字幕色婷婷在线视频 | 国产高清绿奴videos | 美女福利视频网 | 97**国产露脸精品国产 | 国产一级不卡视频 | 国产拍揄自揄精品视频麻豆 | 日韩电影一区二区在线观看 | 91人人澡人人爽人人精品 | 久久国产精品第一页 | 国产精品免费久久 | 欧美一级淫片videoshd | 九九久久视频 | 亚州精品在线视频 | 91av视频在线播放 | 天天射天天干天天爽 | 久久高清免费视频 | 在线观看日韩精品视频 | 在线免费中文字幕 | 国产日本三级 | 久艹视频在线免费观看 | 日本精品一区二区三区在线播放视频 | 91久久精品一区二区二区 | 丁香激情视频 | 欧美精品亚洲精品 | 一区二区不卡视频在线观看 | 亚洲午夜电影网 | 国产xx在线 | 国产精品99在线播放 | 毛片区 | 国产 视频 高清 免费 | 国产视频久久 | 成人午夜免费福利 | 99热精品国产一区二区在线观看 | 免费午夜视频在线观看 | 国产精品原创av片国产免费 | 亚洲一区二区三区毛片 | 日韩极品在线 | 99精品国产一区二区三区不卡 | 中文字幕有码在线 | 国产视频在线观看免费 | 国产精品国产三级国产aⅴ入口 | 亚洲精品在线一区二区 | 色多视频在线观看 | 激情五月激情综合网 | 黄色免费大片 | 亚洲成免费 | 欧美性一级观看 | 国产精品久久久久av福利动漫 | 在线a亚洲视频播放在线观看 | 黄污网站在线观看 | 亚洲精品美女 | 国产精品18videosex性欧美 | 久色小说| 久久久久久久久久久精 | 97电院网手机版 | 久久综合五月婷婷 | 午夜视频免费在线观看 | 欧美在线视频免费 | 欧美亚洲成人xxx | 久久久久久久久久网站 | 日韩欧美一区二区在线观看 | 国产69久久| 日韩电影在线视频 | 天天夜夜操 | 亚洲成人av影片 | 国产成人av在线 | 欧美成人在线网站 | 婷婷丁香久久五月婷婷 | 成人黄色电影在线观看 | 五月婷婷开心中文字幕 | 亚洲欧洲xxxx | 日本三级不卡视频 | 草免费视频 | 国产美女网 | 亚洲免费专区 | 久久久精选 | 久久久国产精品一区二区三区 | 一级黄色a视频 | 亚洲久久视频 | 日韩一区精品 | 国产三级午夜理伦三级 | 久久精品国产亚洲精品 | 国产99久久久久久免费看 | 日本黄色大片免费 | 五月香视频在线观看 | 亚洲伦理一区二区 | av解说在线观看 | 天天操比 | 日韩毛片一区 | 久久精品成人 | 国产精品自在欧美一区 | 91国内在线视频 | 五月天狠狠操 | 婷婷国产v亚洲v欧美久久 | 日日夜夜av | 色天天综合久久久久综合片 | 国产真实在线 | 欧美韩国日本在线 | 91高清完整版在线观看 | 欧美色图视频一区 | 国产精品久久久久久久久久直播 | 99re视频在线观看 | 天天拍天天色 | 高清不卡一区二区在线 | 色多视频在线观看 | 黄色网在线播放 | .国产精品成人自产拍在线观看6 | 精品久久一区二区 | 国产福利久久 | 国产精品美女久久久久久久久 | 色天天综合网 | 欧美色久| 天天爱天天舔 | 日韩激情视频 | 欧美午夜精品久久久久久浪潮 | 99精品欧美一区二区三区黑人哦 | 综合网婷婷 | 国产91精品在线播放 | 久久福利在线 | www.狠狠插.com | 午夜久久福利影院 | 免费视频一区二区 | 国产精品免费观看在线 | 手机av在线免费观看 | 又色又爽又黄高潮的免费视频 | 亚洲精品国产免费 | 欧美日韩视频免费 | 韩国av一区二区 | 欧美成人xxxxxxxx | 99免费在线观看视频 | 免费福利小视频 | 日韩一区二区三免费高清在线观看 | 日韩三级视频在线观看 | 一区二区三区日韩在线 | 久久国产三级 | a成人v在线 | 国产在线观看你懂的 | 午夜精品一区二区三区四区 | 在线亚洲欧美视频 | 国产精品手机看片 | 天天曰天天爽 | 日本精a在线观看 | 亚洲精品欧美成人 | 91精品久久久久久综合乱菊 | 国产91电影在线观看 | 日韩精品中文字幕av | 免费亚洲视频在线观看 | 久久99精品国产91久久来源 | 国产精品日韩久久久久 | 国产又粗又猛又黄视频 | 久久精品国产第一区二区三区 | 日韩欧美黄色网址 | 免费亚洲视频在线观看 | 91麻豆高清视频 | 日日操网 | 亚洲少妇xxxx| 国产黑丝一区二区三区 | 日韩欧美高清 | 亚洲 在线 | 欧美久久久一区二区三区 | 欧美精品一区二区免费 | 人人爽人人澡人人添人人人人 | 视频91在线 | 欧洲色综合 | sesese图片| 九九热1 | 玖玖玖国产精品 | 国产成人61精品免费看片 | 最近中文字幕mv免费高清在线 | 成人一级片视频 | 香蕉视频在线视频 | 狠狠干在线 | 色a综合 | 九热在线 | 久久久久电影 | 人人dvd | 激情在线网站 | 久久99精品久久久久蜜臀 | 四虎8848免费高清在线观看 | 日韩av播放在线 | 一区二区男女 | 国产精品岛国久久久久久久久红粉 | 久久高清av | 一区二区三区四区五区在线视频 | 伊人影院得得 | 五月开心婷婷网 | 亚洲一级免费观看 | av大全在线免费观看 | 欧美日韩中文在线 | 久久精品国产一区二区三 | 91丨九色丨蝌蚪丰满 | 射久久| 国产99久久久国产精品免费看 | 91精品麻豆 | 中文十次啦 | 热久久这里只有精品 | 亚洲国产精品电影在线观看 | 成人黄色中文字幕 | 久久亚洲私人国产精品va | 久免费 | 丁香 久久 综合 | 成人性生交大片免费观看网站 | 日本韩国在线不卡 | 国产精品免费一区二区 | 国产成人在线观看免费 | 亚洲欧洲xxxx| 国产成人1区 | 久久久精品免费看 | 蜜桃麻豆www久久囤产精品 | 免费人人干 | 婷婷色在线视频 | 亚洲精品白浆高清久久久久久 | 亚洲精品视频网址 | 九九热只有精品 | 最近日韩中文字幕中文 | 88av色| 在线色亚洲 | 国产成人av综合色 | 99久久综合国产精品二区 | 999久久国精品免费观看网站 | 国产国产人免费人成免费视频 | 97狠狠操 | 国产精品二区在线 | 亚洲理论片在线观看 | 亚洲一区二区麻豆 | 国产中文字幕在线免费观看 | av在线短片 | 91精品爽啪蜜夜国产在线播放 | 午夜狠狠操 | 福利一区二区三区四区 | 五月婷在线观看 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产成人一区二区三区久久精品 | 女人高潮特级毛片 | 国产一级片在线播放 | 亚洲精品99 | 一区二区精品久久 | 亚洲人成人在线 | 天天摸天天操天天爽 | 国产精品久久久久久久午夜片 | 91精品一区国产高清在线gif | 亚洲欧洲日韩在线观看 | 91完整版| 亚洲涩涩涩涩涩涩 | 日韩中文字幕免费看 | 五月开心六月婷婷 | 中文字幕免费一区 | 日韩精品免费一线在线观看 | 日韩午夜一级片 | 国产精品久久久久久久免费观看 | 国产精品一区二区在线观看 | 亚洲 中文 在线 精品 | 美女视频黄在线 | 国产一级性生活 | 91视频免费网站 | 福利电影一区二区 | 337p西西人体大胆瓣开下部 | 一级片免费在线 | 91麻豆网站 | 日韩成人精品在线观看 | 国产剧情久久 | 亚洲狠狠操 | 五月婷影院 | 99热在线免费观看 |