成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > 對(duì)Ruby on Rails進(jìn)行高效的單元測試的教程

對(duì)Ruby on Rails進(jìn)行高效的單元測試的教程

熱門標(biāo)簽:湖州u友防封電銷卡 高德地圖標(biāo)注客服 滴滴外呼系統(tǒng) 地圖標(biāo)注賺錢項(xiàng)目注冊(cè) 白銀外呼paas系統(tǒng) 徐州網(wǎng)絡(luò)外呼系統(tǒng)哪個(gè)好 百度地圖標(biāo)注自定義圖片 電銷機(jī)器人廠商代理 常德電銷平臺(tái)外呼系統(tǒng)軟件價(jià)格


在筆者開發(fā)的系統(tǒng)中,有大量的數(shù)據(jù)需要分析,不僅要求數(shù)據(jù)分析準(zhǔn)確,而且對(duì)速度也有一定的要求的。沒有寫測試代碼之前,筆者用幾個(gè)很大的方法來實(shí)現(xiàn)這種需求。結(jié)果可想而知,代碼繁雜,維護(hù)困難,難于擴(kuò)展。借業(yè)務(wù)調(diào)整的機(jī)會(huì),筆者痛定思痛,決定從測試代碼做起,并隨著不斷地學(xué)習(xí)和應(yīng)用,慢慢體會(huì)到測試代碼的好處。

  •     改變思路:能做到從需求到代碼的過程轉(zhuǎn)換,逐步細(xì)化;
  •     簡化代碼:力圖讓每個(gè)方法都很小,只專注一件事;
  •     優(yōu)化代碼:當(dāng)測試代碼寫不出來,或者需要寫很長的時(shí)候,說明代碼是有問題的,是可以被分解的,需要進(jìn)一步優(yōu)化;
  •     便于擴(kuò)展:當(dāng)擴(kuò)展新業(yè)務(wù)或修改舊業(yè)務(wù)時(shí),如果測試代碼沒有成功,則說明擴(kuò)展和修改不成功;
  •     時(shí)半功倍:貌似寫測試代碼很費(fèi)時(shí),實(shí)際在測試、部署和后續(xù)擴(kuò)展中,測試代碼將節(jié)省更多的時(shí)間。

環(huán)境搭建

筆者采用的測試環(huán)境是比較流行通用的框架:RSpec + Factory Girl,并用autotest自動(dòng)工具。RSpec是一種描述性語言,通過可行的例子描述系統(tǒng)行為,非常容易上手,測試用例非常容易理解。Factory Girl可以很好的幫助構(gòu)造測試數(shù)據(jù),免去了自己寫fixture的煩惱。Autotest能自動(dòng)運(yùn)行測試代碼,隨時(shí)檢測測試代碼的結(jié)果,并且有很多的插件支持,可以讓測試結(jié)果顯示的很炫。
第一步 安裝rspec和rspec-rails

在命令行中執(zhí)行如下命令:

$ sudo gem install rspec v = 1.3.0
$ sudo gem install rspec-rails v = 1.3.2

安裝完成后,進(jìn)入rails應(yīng)用所在的目錄,運(yùn)行如下腳本,生成spec測試框架:

$ script/generate rspec     
  exists lib/tasks
 identical lib/tasks/rspec.rake
 identical script/autospec
 identical script/spec
  exists spec
 identical spec/rcov.opts
 identical spec/spec.opts
 identical spec/spec_helper.rb

第二步 安裝factory-girl


在命令行中執(zhí)行如下命令:

$ sudo gem install rspec v = 1.3.0
$ sudo gem install rspec-rails v = 1.3.2

安裝完成后,進(jìn)入rails應(yīng)用所在的目錄,運(yùn)行如下腳本,生成spec測試框架:

$ script/generate rspec     
  exists lib/tasks
 identical lib/tasks/rspec.rake
 identical script/autospec
 identical script/spec
  exists spec
 identical spec/rcov.opts
 identical spec/spec.opts
 identical spec/spec_helper.rb

第二步 安裝factory-girl

在命令行中執(zhí)行如下命令:

$ sudo gem install factory-girl

在config/environment/test.rb中,加入factory-girl這個(gè)gem:

config.gem "factory_girl"

在spec/目錄下,增加一個(gè)factories.rb的文件,用于所有預(yù)先定義的model工廠。
第三步 安裝autotest

在命令行中執(zhí)行如下命令:

$ sudo gem install ZenTest
$ sudo gem install autotest-rails

然后設(shè)置與RSpec的集成,在rails應(yīng)用的目錄下,運(yùn)行如下的命令,就可以顯示測試用例的運(yùn)行結(jié)果。

RSPEC=true autotest or autospec

在自己的home目錄下,增加一個(gè).autotest設(shè)置所有的Rails應(yīng)用的autotest插件。當(dāng)然,也可以把這個(gè)文件加到每個(gè)應(yīng)用的根目錄下,這個(gè)文件將覆蓋home目錄下的文件設(shè)置。autotest的插件很多,筆者用到如下的plugin:

$ sudo gem install autotest-growl
$ sudo gem install autotest-fsevent
$ sudo gem install redgreen

設(shè)置.autotest文件,在.autotest中,加入如下代碼。

require 'autotest/growl' 
require 'autotest/fsevent' 
require 'redgreen/autotest' 

Autotest.add_hook :initialize do |autotest|
 %w{.git .svn .hg .DS_Store ._* vendor tmp log doc}.each do |exception|
  autotest.add_exception(exception)
 end
end

測試經(jīng)驗(yàn)

安裝了必要的程序庫以后,就可以寫測試代碼了。本例中,所有應(yīng)用都是在Rails 2.3.4上開發(fā)的,RSpec采用的是1.3.0的版本。為了很好的說明問題,我們假定這樣的需求:判斷一個(gè)用戶在一個(gè)時(shí)間段內(nèi)是否遲到。寫測試代碼時(shí)都是遵循一個(gè)原則,只關(guān)心輸入和輸出,具體的實(shí)現(xiàn)并不在測試代碼的考慮范圍之內(nèi),是行為驅(qū)動(dòng)開發(fā)。根據(jù)這個(gè)需求,我們將會(huì)設(shè)計(jì)方法absence_at(start_time,end_time),有兩個(gè)輸入值start_time和end_time以及一個(gè)輸出值,類型是boolean。對(duì)應(yīng)的測試代碼如下:

describe "User absence or not during [start_time,end_time]" do
 before :each do 
  @user = Factory(:user)
 end

 it "should return false when user not absence " do
  start_time = Time.utc(2010,11,9,12,0,0,0)
  end_time = Time.utc(2010,11,9,12,30,0) 
  @user.absence_at(start_time,end_time).should be_false
 end

 it "should return true when user absence " do
  start_time = Time.utc(2010,11,9,13,0,0,0)
  end_time = Time.utc(2010,11,9,13,30,0) 
  @user.absence_at(start_time,end_time).should be_ture
 end
end

測試代碼已經(jīng)完成。至于absence_at方法我們并不關(guān)心它的實(shí)現(xiàn),只要這個(gè)方法的結(jié)果能讓測試代碼運(yùn)行結(jié)果正確就可以。在此測試代碼的基礎(chǔ)上,就可以大膽地去完成代碼,并根據(jù)測試代碼的結(jié)果不斷修改代碼直到所有測試用例通過。
Stub的使用

寫測試代碼,最好首先從model開始。因?yàn)閙odel的方法能很好與輸入輸出的原則吻合,容易上手。最初的時(shí)候,你會(huì)發(fā)現(xiàn)mock和stub很好用,任何的對(duì)象都可以mock,并且在它的基礎(chǔ)上可以stub一些方法,省去構(gòu)造數(shù)據(jù)的麻煩,一度讓筆者覺得測試代碼是如此美麗,一步步的深入,才發(fā)現(xiàn)自己陷入了stub的誤區(qū)。還是引用上面的例子,我們的代碼實(shí)現(xiàn)如下:

class User  ActiveRecord::Base
 def absence_at(start_time,end_time)  
  return false if have_connection_or_review?(start_time,end_time)
  return (login_absence_at?(start_time,end_time) ? true : false)  
 end
end

按照最初寫測試代碼的思路,本方法中存在三種情況,即需要三個(gè)用例,而且還調(diào)用了其他兩個(gè)方法,需要對(duì)他們進(jìn)行stub,于是就有了下面的測試代碼。記得當(dāng)時(shí)完成后還很興奮,心中還想:這么寫測試代碼真有趣。

before(:each) do
 @user = User.new
end

describe "method absence_at(start_time,end_time)>" do 
 s = Time.now
 e = s + 30.minutes
 # example one
 it "should be false when user have interaction or review" do
  @user.stub!(:have_connection_or_review?).with(s,e).and_return(true)
  @user.absence_at(s,e).should be_false
 end
  
 # example two
 it "should be true when user has no interaction and he no waiting at platform" do
  @user.stub!(:have_connection_or_review?).with(s,e).and_return(false)
  @user.stub!(:login_absence_at?).with(s,e).and_return(true)
  @user.absence_at(s,e).should be_true
 end

 # example three
 it "should be false when user has no interaction and he waiting at platform" do
  @user.stub!(:have_connection_or_review?).with(s,e).and_return(false)
  @user.stub!(:login_absence_at?).with(s,e).and_return(false)
  @user.absence_at(s,e).should be_false
 end  
end

上面的測試代碼,是典型把代碼的實(shí)現(xiàn)細(xì)節(jié)帶到了測試代碼中,完全是本末倒置的。當(dāng)然這個(gè)測試代碼運(yùn)行的時(shí)候,結(jié)果都是正確的。那是因?yàn)橛胹tub來假定所有的子方法都是對(duì)的,但是如果這個(gè)子方法have_connection_or_review?發(fā)生變化,它不返回boolean值,那么將會(huì)發(fā)生什么呢?這個(gè)測試代碼依然正確,可怕吧!這都沒有起到測試代碼的作用。

另外,如果是這樣,我們不僅要修改have_connection_or_review?的測試代碼,而且還要修改absence_at的測試代碼。這不是在增大代碼維護(hù)量嗎?

相比而言,不用stub的測試代碼,不用修改,如果Factory的數(shù)據(jù)沒有發(fā)生變化,那么測試代碼的結(jié)果將是錯(cuò)誤的,因?yàn)閔ave_connection_or_review?沒有通過測試,導(dǎo)致absence_at方法無法正常運(yùn)行。

其實(shí)stub主要是mock一些本方法或者本應(yīng)用中無法得到的對(duì)象,比如在tech_finish?方法中,調(diào)用了一個(gè)file_service來獲得Record對(duì)象的所有文件,在本方法測試代碼運(yùn)行過程中,無法得到這個(gè)service,這時(shí)stub就起作用了:

class A  ActiveRecord::Base
 has_many :records
 def tech_finish?
  self.records.each do |v_a|
   return true if v_a.files.size == 5
  end
  return false
 end
end

class Record  ActiveRecord::Base
 belongs_to :a
 has_files # here is a service in gem
end

所對(duì)應(yīng)的測試代碼如下:

describe "tech_finish?" do
 it "should return true when A's records have five files" do
  record = Factory(:record)
  app = Factory(:a,:records=>[record])
  record.stub!(:files).and_return([1,2,3,4,5])   
  app.tech_finish?.should == true
 end

 it "should return false when A's records have less five files" do
  record = Factory(:record)
  app = Factory(:a,:records=>[record])
  record.stub!(:files).and_return([1,2,3,5])   
  app.tech_finish?.should == false
 end
end

Factory的使用

有了這個(gè)工廠,可以很方便的構(gòu)造不同的模擬數(shù)據(jù)來運(yùn)行測試代碼。還是上面的例子,如果要測試absence_at方法,涉及到多個(gè)model:

  •     HistoryRecord:User的上課記錄
  •     Calendar:User的課程表
  •     Logging:User的日志信息

如果不用factory-girl構(gòu)造測試數(shù)據(jù),我們將不得不在fixture構(gòu)造這些測試數(shù)據(jù)。在fixture構(gòu)造的數(shù)據(jù)無法指定是那個(gè)測試用例使用,但是如果用Factory的話,可以為這個(gè)方法專門指定一組測試數(shù)據(jù)。

Factory.define :user_absence_example,:class => User do |user|
 user.login "test"
 class  user
  def default_history_records
   [Factory.build(:history_record,:started_at=>Time.now),
    Factory.build(:history_record,:started_at=>Time.now)]
  end
  def default_calendars
   [Factory.build(:calendar),
    Factory.build(:calendar)]      
   end
   def default_loggings
   [Factory.build(:logging,:started_at=>1.days.ago),
    Factory.build(:logging,:started_at=>1.days.ago)]
   end
  end
  user.history_records {default_history_records}
  user.calendars {default_calendars}
  user.loggings {default_loggings}
end

這個(gè)測試數(shù)據(jù)的構(gòu)造工廠,可以放在factories.rb文件中,方便其他測試用例使用,也可以直接放到測試文件的before中,僅供本測試文件使用。通過factory的構(gòu)造,不僅可以為多個(gè)測試用例共享同一組測試數(shù)據(jù),而且測試代碼也簡潔明了。

before :each do
 @user = Factory.create(:user_absence_example)
end

Readonly的測試

在筆者的系統(tǒng)中,大量使用了acts_as_readonly,從另外一個(gè)數(shù)據(jù)庫來讀取數(shù)據(jù)。由于這些model并不在本系統(tǒng)中,所以當(dāng)用Factory構(gòu)造測試數(shù)據(jù)的時(shí)候,總會(huì)有問題。雖然也可以使用mock來達(dá)到這個(gè)目的,但是由于mock的局限性,還是無法靈活的滿足構(gòu)造測試數(shù)據(jù)的需要。為此,擴(kuò)展了一些代碼,使得這些model依然可以測試。核心思想則是,根據(jù)配置文件的設(shè)置,將對(duì)應(yīng)的readonly的表創(chuàng)建在測試數(shù)據(jù)庫,這個(gè)操作在運(yùn)行測試之前執(zhí)行,這樣就達(dá)到與其他model一樣的效果。site_config配置文件中,關(guān)于readonly的配置格式如下:

readonly_for_test:
 logings:
  datetime: created_at
  string: status
  integer: trainer_id

Gem的測試

Gem在Rails中被廣泛使用,而且是最基礎(chǔ)的東西,因此它的準(zhǔn)確無誤就顯得更加重要。在不斷實(shí)踐的基礎(chǔ)上,筆者所在的團(tuán)隊(duì)總結(jié)出一種用spec測試gem的方法。假設(shè)我們要測試的gem是platform_base,步驟如下:

1. 在gem的根目錄下創(chuàng)建一個(gè)目錄spec(路徑為platform_base/spec)。

2. 在gem的根目錄下創(chuàng)建文件Rakefile(路徑為platform_base/Rakefile),內(nèi)容如下:

require 'rubygems'
require 'rake'

require 'spec/rake/spectask'

Spec::Rake::SpecTask.new('spec') do |t|
 t.spec_opts = ['--options', "spec/spec.opts"]
 t.spec_files = FileList['spec/**/*_spec.rb']
end

3. 文件在spec目錄下創(chuàng)建spec.opts(路徑為platform_base/spec/spec.opts),內(nèi)容如下:

復(fù)制代碼 代碼如下:
--colour
--format progress
--loadby mtime
--reverse

4. 在spec目錄下,創(chuàng)建一個(gè)Rails app,名為test_app。這個(gè)新應(yīng)用需要有spec目錄和spec_helper.rb文件。

5. 為了保持簡化,把這個(gè)新app(test_app)整理一下,刪除vendor和public目錄,最終的結(jié)構(gòu)如下:

復(fù)制代碼 代碼如下:
test_app
   |- app
   |- config
   |   |- environments
   |   |- initializers
   |   |- app_config.yml
   |   |- boot.rb
   |   |- database.yml
   |   |- environment.rb
   |   \- routes.rb
   |- db
   |   \- test.sqlite3
   |- log
   \- spec
       \- spec_helper.rb

6. 在config/environment.rb配置文件中,增加如下代碼:

Rails::Initializer.run do |config|
 config.gem 'rails_platform_base'
end

7. 在platform_base/spec/目錄下增加helpers_spec.rb文件,內(nèi)容如下:

require File.join(File.dirname(__FILE__), 'test_app/spec/spec_helper')

describe "helpers" do
 describe "url_of" do
  before do
   Rails.stub!(:env).and_return("development")
   @controller = ActionController::Base.new
  end

  it "should get url from app's configration" do
   @controller.url_of(:article, :comments, :article_id => 1).should == "http://www.idapted.com/article/articles/1/comments"
   @controller.url_of(:article, :comments, :article_id => 1, :params=>{:category=>"good"}).should == "http://www.idapted.com/article/articles/1/comments?category=good"
  end
 end
end

至此,準(zhǔn)備工作已經(jīng)就緒,可以在platform_base目錄下,運(yùn)行rake spec來進(jìn)行測試,當(dāng)然現(xiàn)在什么都不會(huì)發(fā)生,因?yàn)檫€沒有測試代碼呢。本方法中,最關(guān)鍵的就是下面的require語句,不僅加載了Rails environment,而且把gem在test_app中使用并測試。

require File.join(File.dirname(__FILE__), 'test_app/spec/spec_helper')

Controller的測試

對(duì)于controller的測試,一般來說比較簡單,基本是三段式:初始化參數(shù)、請(qǐng)求方法、返回render或者redirect_to。如下例中,對(duì)某個(gè)controller的index方法的測試:

describe "index action" do
 it "should render report page with the current month report" do
  controller.stub!(:current_user).and_return(@user)
  get :index,{:flag => “test”}
  response.should render_template("index")
 end
end

有些controller會(huì)設(shè)置session或者flash,這時(shí)的測試代碼就一定要檢查這個(gè)值設(shè)置的是否正確,而且還需要增加測試用例來覆蓋不同的值,這樣才能對(duì)方法進(jìn)行全面的測試。如下例:

describe "create action" do
 it "should donot create new user with wrong params" do
  post :create
  response.should redirect_to(users_path)
  flash[:notice].should == "Create Fail!"
 end

 it "should create a new user with right params" do
  post :create, {:email => "abc@eleutian.com"}
  response.should redirect_to(users_path)
  flash[:notice].should == "Create Successful!"
 end
end

同時(shí),也需要對(duì)controller的assigns進(jìn)行測試,以保證返回正確的數(shù)據(jù)。如下例:

before(:each) do
 @course = Factory(:course)
end 

describe "show action" do
 it "should render show page when flag != assess and success" do 
  get :show, :id => @course.id, :flag =>"test"
  response.should render_template("show")
  assigns[:test_paper].should == @course
  assigns[:flag].should == "test"
 end

 it "should render show page when flag == assess and success" do
  get :show, :id => @course.id, :flag =>"assess"
  response.should render_template("show")
  assigns[:test_paper].should == @course
  assigns[:flag].should == "assess"
 end  
end

View的測試

View的測試代碼寫的比較少,基本上是把核心的view部分集成到controller中來測試。主要用integrate_views方法。如下例:

describe AccountsController do
 integrate_views
 describe "index action" do
  it "should render index.rhtml" do
   get :index
   response.should render_template("index")
   response.should have_tag("a[href=?]",new_account_path)
   response.should have_tag("a[href=?]",new_session_path)
  end
 end
end

總結(jié)展望

在寫測試代碼的時(shí)候,并不一定要事無巨細(xì),有些比較簡單的方法以及Rails的內(nèi)部的方法,如named_scope,就完全沒有必要測試。本文中,只介紹了用rspec寫單元測試的代碼,對(duì)于集成測試沒有涉及,這也是今后努力的一個(gè)方向。

另外,用cumumber + rspec + webrat的BDD開發(fā)模式也是相當(dāng)不錯(cuò)的。尤其是cumumber對(duì)需求的描述,完全可以用它來做需求分析。

您可能感興趣的文章:
  • Ruby中嵌套對(duì)象轉(zhuǎn)換成json的方法
  • 在阿里云 (aliyun) 服務(wù)器上搭建Ruby On Rails環(huán)境
  • ruby安裝gem包失敗的通用解決方法

標(biāo)簽:普洱 遼寧 張家界 荊門 公主嶺 梧州 三沙 永州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《對(duì)Ruby on Rails進(jìn)行高效的單元測試的教程》,本文關(guān)鍵詞  對(duì),Ruby,Rails,進(jìn)行,高效,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《對(duì)Ruby on Rails進(jìn)行高效的單元測試的教程》相關(guān)的同類信息!
  • 本頁收集關(guān)于對(duì)Ruby on Rails進(jìn)行高效的單元測試的教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产黄色在线看| 波多野结衣久草一区| 91免费在线播放| 久久xxxx精品视频| 91国产精品成人| 丝袜美腿亚洲一区二区图片| 欧美色婷婷天堂网站| 免费黄网站在线观看| 在线精品亚洲一区二区不卡| 欧美噜噜久久久xxx| 猛性xxxxx| 精品无人区乱码1区2区3区免费| 国产美女搞久久| 99亚洲国产精品| 久久一区二区精品| 精品国产91亚洲一区二区三区www| 国产视频手机在线播放| 欧美亚洲另类小说| 国产精品久久77777| 亚洲xxx拳头交| 国产精品一区二区久久| 国产日韩欧美电影在线观看| 亚洲人辣妹窥探嘘嘘| 国产老熟女伦老熟妇露脸| 欧美日韩在线一| 国产一级二级三级| 欧洲美女少妇精品| 中文字幕日韩三级| 亚洲国产精品一区二区第一页| 国产精品一区二区不卡视频| 黄色三级视频在线播放| 国产精品一级片| 伊是香蕉大人久久| 黄色大片在线观看| 久久黄色片网站| 北条麻妃视频在线| 国产精品久久久久久久久久免费看| 动漫精品一区一码二码三码四码| 国自产拍偷拍精品啪啪一区二区| 最近中文字幕免费mv视频多少集| 清纯唯美日韩制服另类| 久久久999精品| 亚洲精品国产精品国自产在线| 中文字幕av一区二区三区免费看| 成人激情校园春色| 国产一区二区在线视频| 亚洲sss综合天堂久久| 午夜在线视频一区二区区别| 91在线观看免费| 日本高清免费电影一区| 在线国产三级| 欧美老头gaygay1069| 欧美日韩性视频| av免费观看网站| 精品1卡二卡三卡四卡老狼| 91网页版在线| 日韩视频 中文字幕| 先锋影音欧美四级| 久久九九全国免费| 久久精品一区二区三区四区| 51精品国产黑色丝袜高跟鞋| 日韩av片子| 欧美精品成人在线| 欧美最大成人综合网| 性欧美18—19sex性高清| 日韩免费在线观看av| 宅男噜噜噜66国产免费观看| 一区二区三区久久精品| 欧美中文字幕视频| 亚洲午夜18毛片在线看| 亚洲成av人在线观看| 亚洲精美色品网站| 免费男女羞羞的视频网站主页在线观看| 久久久福利视频| 国产精品密蕾丝视频下载| 亚洲综合偷拍欧美一区色| 男女视频一区二区三区| 麻豆国产精品一区二区三区| 久久福利小视频| 在线免费黄色小视频| 国产.精品.日韩.另类.中文.在线.播放| 日韩一级大片| 久久免费视频网| 日韩精品欧美国产精品忘忧草| 污污片在线免费视频| 国产婷婷在线视频| 久久狠狠高潮亚洲精品| 尤物视频网站| 手机免费观看av| 日韩伦理在线电影| 国产日产久久高清欧美一区| 国内拍拍自拍视频在线观看| 天堂在线一区二区三区| 亚洲精品国产熟女久久久| 国产又粗又猛又黄视频| 精品人妻无码一区二区| 国产精品久久久久久久久久10秀| va亚洲va日韩不卡在线观看| 国产极品视频在线观看| 中文字幕永久免费| 高潮一区二区三区| 国产成人短视频| 91小视频在线播放| 亚州av日韩av| 91精品国产自产在线老师啪| 日本一区二区三区在线视频| 国产调教在线| 男人天堂亚洲天堂| 91免费电影网站| 成年人在线免费看片| 欧美日韩国产美| 国产精品jizz在线观看老狼| 国产精品第一页在线| 亚洲免费在线看| 天天摸天天碰天天爽天天弄| 亚洲天堂开心观看| 在线观看国产原创自拍视频| 男人av在线| 91爱爱小视频k| 国产精品日本精品| 伪装者在线观看完整版免费| 2020国产精品自拍| 极品销魂美女一区二区三区| 色鬼7777久久| av中文字幕在线观看第一页| 不卡一区在线观看| 黄色片在线免费| 91国内精品久久久久| 国产精品theporn| 天天操天天射天天| 成人午夜一级二级三级| 在线一区二区三区精品| 国产欧美激情| 深夜视频在线观看| 日韩在线不卡av| 国产在线不卡av| 麻豆精品蜜桃| 成人美女免费网站视频| 麻豆短视频在线观看| 国产一区二区三区在线免费| 成人在线视频www| 山东少妇露脸刺激对白在线| 天天射,天天干| 成人免费毛片a| 黄色片一级视频| a级黄色免费视频| 日韩在线视频免费观看| 日韩成人在线免费观看| 在线成人午夜影院| 欧美一区 二区 三区| 视频免费一区二区| 日韩av网址在线| av在线不卡精品| 亲爱的老师9免费观看全集电视剧| 午夜不卡久久精品无码免费| 国产一区二区美女诱惑| 欧美女人性生活视频| 亚洲第一网中文字幕| 欧美激情一区在线观看| 欧美人妖在线观看| 哪个网站能看毛片| 精品少妇一区二区三区免费观看| 日韩手机在线导航| 丰满的少妇愉情hd高清果冻传媒| 亚洲国产成人精品无码区99| 亚洲成人影院麻豆| 肉丝袜脚交视频一区二区| 亚洲欧美在线观看视频| 欧美日韩一二三区| 99精品国产福利在线观看免费| 26uuu成人网一区二区三区| 99re成人精品视频| 亚洲国产精品一区二区尤物区| 天天综合入口| 九九九久久久久| 刘亦菲久久免费一区二区| 日韩中文字幕在线观看| 欧美妇性猛交视频| 成人免费a**址| 亚洲精品一区二区三区香蕉| 欧美精品一区二区三区视频| 91精品国产综合久久久久久久久| 久久天天躁狠狠躁老女人| 欧美一级精品片在线看| 色偷偷88欧美精品久久久| 中文字幕亚洲自拍| 成人在线免费观看av| 超级碰碰不卡在线视频| 在线日韩av观看| 精品一区二区三区在线观看l| 韩国精品一区| 日本不卡一二区| 日韩欧美中文一区二区| 99色精品视频| 欧美xxxx14xxxxx性爽| 日韩精品视频久久| 天天综合网天天| 天天色综合久久| 99re热精品| 亚洲一区二区精品在线| 自拍一区在线观看| 神马久久午夜| 宅男66日本亚洲欧美视频| 亚洲精品国产无天堂网2021| 欧美成人bangbros| 日韩激情综合网| 三级欧美韩日大片在线看| www.18av.com| 91精品国产91久久综合桃花| 国内不卡的二区三区中文字幕| 凹凸精品一区二区三区| 亚洲毛片在线免费| 亚洲天堂第一区| 日韩精品影视| 九九九九九国产| 日韩一级欧洲| 中文字幕一区在线播放| 偷拍自拍亚洲| av午夜在线观看| 欧美性色综合网| 青青成人在线| 欧洲性xxxx| 欧美日韩在线二区| 国产伦精品一区二区三区视频金莲| 最近中文字幕mv2018在线高清| 欧美 亚欧 日韩视频在线| 欧美激情午夜| 日韩欧美中文字幕在线观看| 婷婷精品国产一区二区三区日韩| 蜜桃一区二区| 一区二区三区视频在线观看免费| 成人看片网页| 99久久免费国产精品| 麻豆精品久久久久久久99蜜桃| 青青青国产在线观看| 免费成人进口网站| 中文字幕亚洲一区二区三区五十路| 国产精品久久中文| 欧美成人a∨高清免费观看| 欧美一区二区三区四区在线观看地址| 日批在线观看视频| 成人在线播放网站| 国产喷水theporn| 精品产国自在拍| 免费黄色片网站| gogo亚洲高清大胆美女人体| 一本一道久久a久久综合精品| 欧美伊人精品成人久久综合97| 国产精品福利观看| 日本丶国产丶欧美色综合| 这里有精品可以观看| 成人在线小说| 天天综合色天天| 黄色影视在线观看| 国产日韩欧美在线视频观看| 91毛片在线观看| 2018国产精品视频| 四虎国产精品永久在线国在线| 911亚洲精选| 中文字幕制服丝袜一区二区三区| 91久久香蕉国产日韩欧美9色| jizz免费一区二区三区| 伊人亚洲福利一区二区三区| 免费在线你懂的| www.成年人视频| 欧美精品入口蜜桃| 乱妇乱女熟妇熟女网站| 黄色动漫在线免费看| 成人在线观看av| 国产精品久久久久久久天堂| 欧美日韩免费一区二区三区| 亚洲精选视频免费看| 国产精品免费一区二区三区四区| 国产在线视频你懂的| av网站在线免费看推荐| 成人免费在线网址| 国产日产精品一区二区三区四区| 91视频一区二区三区| 91极品身材尤物theporn| 国产一区二区三区在线播放免费观看| 亚洲videos| 国产精品激情| 国产视频一区免费看| 亚洲婷婷国产精品电影人久久| 91国产成人在线| 午夜视频在线网站| 欧美性受xxxx黑人爽| 97在线免费观看视频| 91老司机精品视频| 亚洲国产成人va在线观看麻豆| 精品一区二区三区在线观看| 黄色成人在线观看网站| 亚洲精品男人天堂| 5858s免费视频成人| 精品国产成人在线影院| 中文字幕一区二区中文字幕| 欧美亚洲愉拍一区二区| 亚洲黄色免费观看| 香蕉视频成人在线观看| 在线看福利67194| 欧美一二三不卡| 九七电影韩国女主播在线观看| 欧美狂欢多p性派对| 97精品国产97久久久久久春色| 国产欧美日本一区视频| 香蕉视频国产精品| 99久久精品一区二区| 亚洲第一精品电影| 一区二区三区视频在线观看| 国产精品久久久久久久9999| 99精品视频在线观看播放| 国产精品久免费的黄网站| 男人天堂网视频| 成年女人免费毛片视频永久| 7777精品视频| 亚洲久久中文字幕| 国产精品午夜一区二区欲梦| 日韩欧美亚洲系列| 亚洲av无码国产精品久久| 在线成人av观看| 国内精品在线一区| 国产精品家庭影院| 亚洲人午夜射精精品日韩| 国产精品福利网站| 国产亚洲精久久久久久无码77777| 亚洲国产精品女人久久久| 亚洲成人第一页| 日韩xxxx视频|