3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

软件测试测试用例编写_不要先编写所有软件测试-只需编写一个

發(fā)布時(shí)間:2023/11/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件测试测试用例编写_不要先编写所有软件测试-只需编写一个 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

軟件測(cè)試測(cè)試用例編寫(xiě)

Test Driven Development (TDD) is sometimes described as “writing tests first”. The TDD mantra states that we should not write code before we have written automated tests that exercise that code. Writing code first is considered suboptimal.

測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)有時(shí)被稱為“首先編寫(xiě)測(cè)試”。 TDD的口頭禪規(guī)定,在編寫(xiě)用于執(zhí)行該代碼的自動(dòng)測(cè)試之前,請(qǐng)勿編寫(xiě)代碼。 首先編寫(xiě)代碼被認(rèn)為是次優(yōu)的。

And of course, writing code first is how we develop software following the so-called waterfall model. In that model, we divide software development activities into stages. For example, we have a ‘requirements gathering’ stage, we have an ‘a(chǎn)pplication building’ stage, we have an ‘a(chǎn)pplication testing’ stage, we have an ‘a(chǎn)pplication deployment’ stage and so on.

當(dāng)然,首先編寫(xiě)代碼是我們遵循所謂的瀑布模型開(kāi)發(fā)軟件的方式。 在該模型中,我們將軟件開(kāi)發(fā)活動(dòng)劃分為多個(gè)階段。 例如,我們有一個(gè)“需求收集”階段,有一個(gè)“應(yīng)用程序構(gòu)建”階段,有一個(gè)“應(yīng)用程序測(cè)試”階段,有一個(gè)“應(yīng)用程序部署”階段,依此類(lèi)推。

But how is that different from the agile methodology? Don’t we have the exact same stages in agile?

但是,這與敏捷方法學(xué)有何不同? 我們?cè)诿艚葜袥](méi)有完全相同的階段嗎?

敏捷方法論與瀑布方法論 (Agile Methodology vs Waterfall Methodology)

Of course we do. The crucial difference is that in agile, those stages are not gated.

當(dāng)然可以 關(guān)鍵的區(qū)別在于,在敏捷開(kāi)發(fā)中,這些階段不會(huì)受到限制。

In waterfall, we gate the stages and execute them in strict sequence. This means we won’t begin building the shipping application until such time as the requirements have been gathered, completed, signed off on and frozen. Once requirements are frozen (and controlled by our change management policies), we move into the next stage (or phase) – application building.

在瀑布中,我們對(duì)階段進(jìn)行門(mén)控并嚴(yán)格執(zhí)行。 這意味著直到需求被收集,完成,簽署并凍結(jié)后,我們才會(huì)開(kāi)始構(gòu)建運(yùn)輸應(yīng)用程序。 一旦需求被凍結(jié)(并由我們的變更管理策略控制),我們便進(jìn)入下一階段(或階段)–應(yīng)用程序構(gòu)建。

And similarly, we won’t move into the testing stage until the entire application has been built and we have reached the code complete milestone, at which point code changes have been frozen.

同樣,在整個(gè)應(yīng)用程序都已構(gòu)建并且達(dá)到代碼完整的里程碑之前,我們不會(huì)進(jìn)入測(cè)試階段,此時(shí)代碼更改已被凍結(jié)。

Once code gets frozen (and code freeze is then controlled by our change management policies), we hand it off to the testers. The testing phase begins, and only once all testing has completed (and provided that no significant defects have been detected), do we move into the deployment phase.

一旦代碼被凍結(jié)(然后凍結(jié)由我們的變更管理策略控制),我們便將其交給測(cè)試人員。 測(cè)試階段開(kāi)始,只有完成所有測(cè)試(并且前提是未檢測(cè)到重大缺陷)后,我們才進(jìn)入部署階段。

In agile, we do all the above activities in parallel. At the same time. We keep working on user stories (specs) while simultaneously building the shipping application. As we’re building the application we are also testing it. And as we are building and testing the application, we are also deploying it.

在敏捷中,我們同時(shí)進(jìn)行上述所有活動(dòng)。 與此同時(shí)。 我們會(huì)繼續(xù)處理用戶案例(規(guī)格),同時(shí)構(gòu)建運(yùn)輸應(yīng)用程序。 在構(gòu)建應(yīng)用程序時(shí),我們也在對(duì)其進(jìn)行測(cè)試。 在構(gòu)建和測(cè)試應(yīng)用程序時(shí),我們也在部署它。

We learn from the shipping application deployed to production and use that validated learning as the feedback that will inform new user stories. That way, the loop gets closed, and we’re iterating, improving the value incrementally.

我們從部署到生產(chǎn)中的運(yùn)輸應(yīng)用程序中學(xué)習(xí),并將經(jīng)過(guò)驗(yàn)證的學(xué)習(xí)用作將為新用戶故事提供信息的反饋。 這樣,循環(huán)就閉合了,我們進(jìn)行迭代,逐步提高了價(jià)值。

The only way to enable such iterative value stream delivery is by relying on automated tests. And as we’ve described, those tests are being written very early in the game. Actually, tests must be written before we write shipping code.

實(shí)現(xiàn)這種迭代式價(jià)值流交付的唯一方法是依靠自動(dòng)化測(cè)試。 正如我們已經(jīng)描述的那樣,這些測(cè)試是在游戲的早期階段編寫(xiě)的。 實(shí)際上,在編寫(xiě)運(yùn)輸代碼之前必須先編寫(xiě)測(cè)試。

Why then is the title of this article “Don’t Write All Your Tests First, Just Write One”? It sounds a bit confusing. Let’s unpack the meaning of this title. But first, here's an overview of what tech we'll be using:

那么,為什么標(biāo)題為“不要先編寫(xiě)所有測(cè)試,只編寫(xiě)一個(gè)”? 聽(tīng)起來(lái)有點(diǎn)混亂。 讓我們解開(kāi)此標(biāo)題的含義。 但是首先,這是我們將使用的技術(shù)的概述:

本練習(xí)使用的技術(shù)棧 (The technology stack used for this exercise)

In the attempt to keep the exercise simple and easy to follow, I have chosen .NET Core platform, together with xUnit.net testing platform. To follow the coding examples, please install .NET Core and xUnit.net.

為了使練習(xí)簡(jiǎn)單易行,我選擇了.NET Core平臺(tái)以及xUnit.net測(cè)試平臺(tái)。 要遵循編碼示例,請(qǐng)安裝.NET Core和xUnit.net 。

In order to be able to run the sample code, please open ./tests/tests.csproj file and add this line to the ItemGroup:

為了能夠運(yùn)行示例代碼,請(qǐng)打開(kāi)./tests/tests.csproj文件并將此行添加到ItemGroup :

<ProjectReference Include="../app/app.csproj" />

You’re now all set for following the coding exercises.

現(xiàn)在您已經(jīng)準(zhǔn)備好進(jìn)行編碼練習(xí)。

一個(gè)簡(jiǎn)單的例子 (A simple example)

To understand the difference between writing all tests first and writing one test first, it may be better to show rather than just tell.

要了解先編寫(xiě)所有測(cè)試與先編寫(xiě)一個(gè)測(cè)試之間的區(qū)別,最好顯示而不是僅僅講。

So let’s try to build a simple example – for this exercise I’ve chosen a trivial case of calculating a tip at a restaurant. Often times we find ourselves in a position where we want to tip the restaurant for the service, but it’s tough to calculate percentages in our head. So a nifty little Tip Calculator could come in handy.

因此,讓我們嘗試建立一個(gè)簡(jiǎn)單的示例-在本練習(xí)中,我選擇了一個(gè)在餐廳計(jì)算小費(fèi)的簡(jiǎn)單案例。 通常,我們發(fā)現(xiàn)自己想要為餐廳提供服務(wù)小費(fèi),但是很難計(jì)算出我們所占的百分比。 因此,一個(gè)漂亮的小Tip Calculator可能會(huì)派上用場(chǎng)。

Here are the expectations:

這是期望值:

As a patronI want to calculate the total bill (total plus the tip)Because I want to compliment the restaurant for the service

作為顧客我想計(jì)算總賬單(總計(jì)加上小費(fèi)),因?yàn)槲蚁雽?duì)餐廳的服務(wù)表示贊賞

方案1:贊助人計(jì)算可怕服務(wù)的總數(shù) (Scenario 1: Patron calculates the total for terrible service)

Given that the restaurant total is $100.00And the service was terribleWhen the tip calculator calculates the total chargeThen tip calculator shows $100.00 total charge

假設(shè)餐廳的總價(jià)為$ 100.00并且服務(wù)很糟糕,當(dāng)小費(fèi)計(jì)算器計(jì)算總費(fèi)用時(shí),小費(fèi)計(jì)算器將顯示$ 100.00的總費(fèi)用

方案2:顧客計(jì)算服務(wù)質(zhì)量差的總數(shù) (Scenario 2: Patron calculates the total for poor service)

Given that the restaurant total is $100.00And the service was poorWhen the tip calculator calculates the total chargeThen tip calculator shows $105.00 total charge

假設(shè)餐廳的總價(jià)為$ 100.00并且服務(wù)很差,當(dāng)小費(fèi)計(jì)算器計(jì)算總費(fèi)用時(shí),小費(fèi)計(jì)算器將顯示$ 105.00的總費(fèi)用

方案3:顧客計(jì)算出良好服務(wù)的總金額 (Scenario 3: Patron calculates the total for good service)

Given that the restaurant total is $100.00And the service was goodWhen the tip calculator calculates the total chargeThen tip calculator shows $110.00 total charge

假設(shè)餐廳的總價(jià)為$ 100.00并且服務(wù)很好,則當(dāng)小費(fèi)計(jì)算器計(jì)算總費(fèi)用時(shí),小費(fèi)計(jì)算器將顯示$ 110.00的總費(fèi)用

方案4:顧客計(jì)算出優(yōu)質(zhì)服務(wù)的總額 (Scenario 4: Patron calculates the total for great service)

Given that the restaurant total is $100.00And the service was greatWhen the tip calculator calculates the total chargeThen tip calculator shows $115.00 total charge

假設(shè)餐廳的總價(jià)為$ 100.00,服務(wù)很棒,那么當(dāng)小費(fèi)計(jì)算器計(jì)算總費(fèi)用時(shí),小費(fèi)計(jì)算器就會(huì)顯示$ 115.00的總費(fèi)用

方案5:顧客計(jì)算出優(yōu)質(zhì)服務(wù)的總額 (Scenario 5: Patron calculates the total for excellent service)

Given that the restaurant total is $100.00And the service was excellentWhen the tip calculator calculates the total chargeThen tip calculator shows $120.00 total charge

假設(shè)餐廳的總價(jià)為$ 100.00,服務(wù)非常好,當(dāng)小費(fèi)計(jì)算器計(jì)算總費(fèi)用時(shí),小費(fèi)計(jì)算器顯示總費(fèi)用為$ 120.00

Let’s now implement the above user story.

現(xiàn)在,讓我們實(shí)現(xiàn)上面的用戶故事。

We see that the story has 5 acceptance criteria (a.k.a. scenarios). Now we move into the analysis phase – think about what should be the first functionality that our Tip Calculator application should implement. But first, let’s open the command line terminal and create the new directory:

我們看到這個(gè)故事有5個(gè)接受標(biāo)準(zhǔn)(也稱為方案)。 現(xiàn)在,我們進(jìn)入分析階段-考慮一下Tip Calculator應(yīng)用程序應(yīng)該實(shí)現(xiàn)的第一個(gè)功能。 但是首先,讓我們打開(kāi)命令行終端并創(chuàng)建新目錄:

md TipCalculator cd TipCalculator

and create app and tests directories inside the TipCalculator directory.

并在TipCalculator目錄中創(chuàng)建app和tests目錄。

Now cd tests and run:

現(xiàn)在進(jìn)行cd tests并運(yùn)行:

dotnet new xunit

Then cd .. and cd app, then run:

然后cd ..和cd app ,然后運(yùn)行:

dotnet new classlib

We’re now ready to boogie!

我們現(xiàn)在可以開(kāi)始聊天了!

Open your favourite text editor (mine is Visual Studio Code) and set your mind on the expectations. What behaviour are we expecting from the Tip Calculator?

打開(kāi)您最喜歡的文本編輯器(我的是Visual Studio Code ),然后放下期望。 我們期望Tip Calculator有什么行為?

To narrow the scope of our expectations, it usually helps to take one acceptance criteria (i.e. one scenario) and focus on it first. Let’s take scenario #1:

為了縮小我們的期望范圍,通常有助于采用一個(gè)接受標(biāo)準(zhǔn)(即一種情況)并首先關(guān)注它。 讓我們來(lái)看場(chǎng)景1:

方案1:贊助人計(jì)算可怕服務(wù)的總數(shù) (Scenario 1: Patron calculates the total for terrible service)

Given that the restaurant total is $100.00And the service was terribleWhen the tip calculator calculates the total chargeThen tip calculator shows $100.00 total charge

假設(shè)餐廳的總價(jià)為$ 100.00并且服務(wù)很糟糕,當(dāng)小費(fèi)計(jì)算器計(jì)算總費(fèi)用時(shí),小費(fèi)計(jì)算器顯示總費(fèi)用為$ 100.00

In case the service was terrible, we are not adding any tips, and Tip Calculator is calculating a $0.00 tip. So how do we automate that scenario?

萬(wàn)一服務(wù)糟糕,我們不會(huì)添加任何小費(fèi), Tip Calculator會(huì)計(jì)算$ 0.00小費(fèi)。 那么,如何使這種情況自動(dòng)化?

My first expectation would be that we need to somehow inform the Tip Calculator that the service was terrible. We either type the word ‘Terrible’ into the input field, or we select ‘Terrible’ from the list of available service ratings.

我的第一個(gè)期望是,我們需要以某種方式告知Tip Calculator該服務(wù)很糟糕。 我們可以在輸入字段中輸入單詞“ Terrible”,或者從可用服務(wù)等級(jí)列表中選擇“ Terrible”。

So the first thing to do here is to articulate some expectations regarding Tip Calculator’s ability to get notified that the service was terrible.

因此,這里要做的第一件事是闡明有關(guān)Tip Calculator能夠獲得通知該服務(wù)很糟糕的能力的一些期望。

I like to always start with the expectation that what the user inputs is valid. So I’d first write a test that checks if the rating ‘Terrible’ is recognized by the Tip Calculator as a valid rating.

我總是希望用戶輸入的內(nèi)容有效。 因此,我首先要編寫(xiě)一個(gè)測(cè)試,檢查“ Tip Calculator是否將“可怕”等級(jí)識(shí)別為有效等級(jí)。

Go to the tests directory, rename the autogenerated UnitTest1.cs file to TipCalculatorTests.cs and add the following test:

轉(zhuǎn)到tests目錄,將自動(dòng)生成的UnitTest1.cs文件重命名為T(mén)ipCalculatorTests.cs并添加以下測(cè)試:

[Fact] public void CheckIfRatingTerribleIsValid(){ var expectedResponseForValidRating = true; var actualResponseForValidRating = false; Assert.Equal(expectedResponseForValidRating, actualResponseForValidRating); }

Now go to the command line, cd tests, and run:

現(xiàn)在轉(zhuǎn)到命令行cd tests并運(yùn)行:

dotnet test

Of course, the above trivial test will fail, because we have hardcoded the values. But it’s always a good practice to make sure we see our tests fail before we proceed. Not observing a test fail may give us false sense of safety later on, if no tests fail and we end up thinking that everything works as expected.

當(dāng)然,上述微不足道的測(cè)試將失敗,因?yàn)槲覀円呀?jīng)對(duì)值進(jìn)行了硬編碼。 但是,在繼續(xù)進(jìn)行之前,確保我們看到測(cè)試失敗是一種很好的做法。 如果沒(méi)有測(cè)試失敗,則不遵守測(cè)試失敗可能會(huì)在以后給我們帶來(lái)錯(cuò)誤的安全感,而我們最終認(rèn)為一切都會(huì)按預(yù)期進(jìn)行。

A few more observations about the above test:

關(guān)于上述測(cè)試的更多觀察結(jié)果:

  • It helps if the test name is descriptive. I chose CheckIfRatingTerribleIsValid to communicate the fact that we must make sure our application is capable of recognizing our commands.

    如果測(cè)試名稱具有描述性,它將很有幫助。 我選擇CheckIfRatingTerribleIsValid來(lái)傳達(dá)這樣一個(gè)事實(shí),即我們必須確保我們的應(yīng)用程序能夠識(shí)別我們的命令。

  • It also helps if the expected and actual variable names are descriptive. I chose expectedResponseForValidRating and actualResponseForValidRating as fairly indicative of what our expectation in this test is, and also what actual value will the Tip Calculator produce.

    如果期望的變量名和實(shí)際的變量名是描述性的,這也有幫助。 我選擇expectedResponseForValidRating和actualResponseForValidRating得到公平意味著就是我們?cè)诒敬螠y(cè)試的期望是,也什么實(shí)際價(jià)值,并將在Tip Calculator產(chǎn)品。

  • Test is a first-class source code and must be approached with equal care lavished upon the production code.

    測(cè)試是一流的源代碼,必須以與生產(chǎn)代碼相當(dāng)?shù)闹?jǐn)慎對(duì)待。

最初的設(shè)計(jì)決定 (First design decision)

At this point, we are forced to make a decision – how will our nascent Tip Calculator know if the service rating provided by the user is valid or not?

在這一點(diǎn)上,我們不得不做出決定-我們新生的Tip Calculator如何知道用戶提供的服務(wù)等級(jí)是否有效?

The design decision that comes to mind is that Tip Calculator must be able to store and retrieve some data. In this case, the data we’re interested in is the service rating.

想到的設(shè)計(jì)決定是Tip Calculator必須能夠存儲(chǔ)和檢索一些數(shù)據(jù)。 在這種情況下,我們感興趣的數(shù)據(jù)就是服務(wù)等級(jí)。

If we go back to the user story and review the five acceptance criteria, we will see that the expectations are that Tip Calculator must be able to recognize five different service ratings:

如果我們回到用戶故事并回顧五個(gè)接受標(biāo)準(zhǔn),我們將看到, Tip Calculator必須能夠識(shí)別五個(gè)不同的服務(wù)等級(jí):

  • Terrible

    可怕
  • Poor

    較差的
  • Good

  • Great

  • Excellent

    優(yōu)秀的
  • So the simplest way to get Tip Calculator to store that information would be to endow it with an array, or a list.

    因此,使“ Tip Calculator存儲(chǔ)該信息的最簡(jiǎn)單方法是為其賦予數(shù)組或列表。

    But rather than rushing in to implement that list, we should examine the expectations again, to see if there’s anything else we may have missed. And there is – not only must Tip Calculator be able to recognize valid service ratings, it also must be able to associate each rating with a percentage value.

    但是,我們不要急于執(zhí)行該列表,而應(yīng)該再次檢查期望,以查看是否還有其他我們可能錯(cuò)過(guò)的事情。 并且–不僅Tip Calculator必須能夠識(shí)別有效的服務(wù)等級(jí),還必須能夠?qū)⒚總€(gè)等級(jí)與百分比值相關(guān)聯(lián)。

    Our analysis shows the following associations:

    我們的分析顯示以下關(guān)聯(lián):

  • Terrible => 0%

    很差=> 0%
  • Poor => 5%

    差=> 5%
  • Good => 10%

    好=> 10%
  • Great => 15%

    很好=> 15%
  • Excellent => 20%

    優(yōu)秀=> 20%
  • In this case, a simple array or a simple list won’t be sufficient for holding the above associations. What’s the next simplest data structure that will allow us to implement these associations? After doing a little bit of research, we figure out that Hashtable is probably the most fitting data structure that can cover our needs with the least amount of ceremony.

    在這種情況下,簡(jiǎn)單的數(shù)組或簡(jiǎn)單的列表不足以容納上述關(guān)聯(lián)。 允許我們實(shí)現(xiàn)這些關(guān)聯(lián)的下一個(gè)最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)是什么? 經(jīng)過(guò)一些研究,我們發(fā)現(xiàn)Hashtable可能是最合適的數(shù)據(jù)結(jié)構(gòu),可以用最少的儀式滿足我們的需求。

    We now navigate to the app directory and rename autogenerated Class1.cs file to TipCalculator.cs. We now want to add a Hashtable that will hold service ratings and the associated percentage values:

    現(xiàn)在,我們導(dǎo)航到app目錄,并將自動(dòng)生成的Class1.cs文件重命名為T(mén)ipCalculator.cs 。 現(xiàn)在,我們要添加一個(gè)Hashtable ,該Hashtable表將保存服務(wù)評(píng)級(jí)和相關(guān)的百分比值:

    System.Collections.Hashtable ratingPercentages = new System.Collections.Hashtable();

    Now is a good time to recall that TDD is focused on coupling the expectations to the application’s behaviour, not to the application’s structure. Knowing that, we need to modify our test to make Tip Calculator exhibit some behaviour. The test codifies some expectations with regards to how the application must behave, and the running application provides the evidence of the expected behaviour.

    現(xiàn)在是回想一下TDD專(zhuān)注于將期望與應(yīng)用程序的行為而非應(yīng)用程序的結(jié)構(gòu)耦合的好時(shí)機(jī)。 知道這一點(diǎn),我們需要修改測(cè)試以使“ Tip Calculator表現(xiàn)出某些行為。 該測(cè)試將有關(guān)應(yīng)用程序必須如何行為的一些期望匯總起來(lái),正在運(yùn)行的應(yīng)用程序提供了預(yù)期行為的證據(jù)。

    But what is the evidence of the application’s behaviour? There is no other way for us to assess and evaluate application’s behaviour other than through examining the values that the running application produces.

    但是,該應(yīng)用程序行為的證據(jù)是什么? 除了檢查正在運(yùn)行的應(yīng)用程序產(chǎn)生的值之外,我們沒(méi)有其他方法可以評(píng)估和評(píng)估應(yīng)用程序的行為。

    In this case, we are expecting the running application to produce values true or false (Boolean values) after we ask the application if certain value (i.e. service rating) is valid.

    在這種情況下,我們希望正在運(yùn)行的應(yīng)用程序在詢問(wèn)某個(gè)值(例如,服務(wù)等級(jí))是否有效之后會(huì)產(chǎn)生值true或false (布爾值)。

    To teach the application how to behave in the expected fashion, we need to endow it with an API. In this case, we design the API as follows:

    要教應(yīng)用程序如何以預(yù)期的方式工作,我們需要為它提供一個(gè)API。 在這種情況下,我們將API設(shè)計(jì)如下:

    public bool CheckIfRatingIsValid(string rating)

    In our test, we will modify the actual expected value to exercise the running application and collect the output value:

    在我們的測(cè)試中,我們將修改實(shí)際期望值以執(zhí)行正在運(yùn)行的應(yīng)用程序并收集輸出值:

    As you can see from the screenshot above, we have instantiated TipCalculator but when attempting to ask the instance to check if the supplied rating (“Terrible”) is valid, the editor is complaining that it cannot find that method.

    從上面的屏幕快照中可以看到,我們已經(jīng)實(shí)例化了TipCalculator但是當(dāng)嘗試要求實(shí)例檢查所提供的等級(jí)(“可怕”)是否有效時(shí),編輯器抱怨說(shuō)找不到該方法。

    Well of course, the method hasn’t been implemented yet. Now’s the time to go ahead and do it:

    當(dāng)然,該方法尚未實(shí)現(xiàn)。 現(xiàn)在是時(shí)候繼續(xù)做下去了:

    public bool CheckIfRatingIsValid(string rating) { return false; }

    Now that the method is implemented, the test works; here is the complete listing:

    現(xiàn)在已經(jīng)實(shí)現(xiàn)了該方法,測(cè)試就可以進(jìn)行; 這是完整的清單:

    using Xunit; using app;namespace tests { public class TipCalculatorTests { TipCalculator tipCalculator = new TipCalculator(); [Fact] public void CheckIfRatingTerribleIsValid(){ var expectedResponseForValidRating = true; var actualResponseForValidRating = tipCalculator.CheckIfRatingIsValid("Terrible"); Assert.Equal(expectedResponseForValidRating, actualResponseForValidRating); } } }

    We see from the above example that we’re cheating again (we have hardcoded return false; in our newly minted method). What’s the point of beating around the bush and merely creating skeletons and scaffoldings instead of rolling up our sleeves and doing actual coding? Let’s discuss this important topic.

    從上面的示例中我們看到我們?cè)俅巫鞅?在我們新創(chuàng)建的方法中,我們已經(jīng)硬編碼return false;)。 在灌木叢中跳動(dòng),僅創(chuàng)建骨架和腳手架,而不是卷起袖子并進(jìn)行實(shí)際編碼,有什么意義? 讓我們討論這個(gè)重要的話題。

    討論我們的第一個(gè)設(shè)計(jì)決策 (Discussion about our first design decision)

    We’re illustrating here how to do TDD step-by-step. The funny part is that this step-by-step illustration is actually the exact way how we do TDD: step-by-step. There is no other way to do TDD than by doing it step-by-step. One step at a time.

    我們?cè)谶@里說(shuō)明如何逐步進(jìn)行TDD。 有趣的部分是,此分步說(shuō)明實(shí)際上是我們進(jìn)行TDD的確切方法:分步。 除了逐步進(jìn)行之外,沒(méi)有其他方法可以進(jìn)行TDD。 一步一步來(lái)。

    How’s that different from any other way of doing software development? Don’t we also do everything step-by-step even when not following TDD methodology? Well, not really. Let me explain:

    與進(jìn)行軟件開(kāi)發(fā)的任何其他方式有何不同? 即使不遵循TDD方法,我們也不一步一步地做所有事情嗎? 好吧,不是真的。 讓我解釋:

    TDD to me feels like riding a galloping horse. We’re moving swiftly toward our goal, but we’re frequently touching the ground (the galloping horse is every now and then hitting the ground in order to bounce off and run fast).

    TDD對(duì)我來(lái)說(shuō)就像騎著駿馬。 我們正在Swift向目標(biāo)邁進(jìn),但我們經(jīng)常碰到地面(奔騰的馬現(xiàn)在不時(shí)地撞到地面,以便反彈并快速奔跑)。

    In comparison, when I’m doing software development without TDD, it feels to me like I’m flying a kite. I’m making swift moves with the kite, but I never touch the ground, not even once. By the time I land the kite, the landing place may not be where I intended the kite to go (it’s very hard to control the direction of a kite if it’s flying in a strong wind).

    相比之下,當(dāng)我在沒(méi)有TDD的情況下進(jìn)行軟件開(kāi)發(fā)時(shí),對(duì)我來(lái)說(shuō)就像在放風(fēng)箏。 我正在用風(fēng)箏快速移動(dòng),但我從未觸地,甚至沒(méi)有觸地。 到我放風(fēng)箏時(shí),降落的地方可能不是我想要放風(fēng)箏的地方(如果風(fēng)很大,很難控制風(fēng)箏的方向)。

    With TDD, any time we make a change to the code (both the test code and the shipping application code), we run the tests and so we touch the ground. We are galloping, but at the same time we need this frequent grounding. We need to see whether we’re going in the right direction and also whether we’ve broken anything during our galloping. Our tests are the Oracle who keeps telling us if everything works as expected or if something started misbehaving.

    使用TDD時(shí),只要我們更改代碼(測(cè)試代碼和運(yùn)輸應(yīng)用程序代碼),就可以運(yùn)行測(cè)試,因此就可以使用。 我們?cè)诩柴Y,但同時(shí)我們需要這種頻繁的接地。 我們需要查看我們是否朝著正確的方向前進(jìn),以及在疾馳過(guò)程中是否損壞了任何東西。 我們的測(cè)試是Oracle,它會(huì)不斷告訴我們一切是否按預(yù)期進(jìn)行,或者某些事情開(kāi)始出現(xiàn)異常。

    Making changes to the code is a risky business. TDD provides a nice harness that is both guiding our design decisions and ensuring we don’t mess up something that we’ve already confirmed works to our expectations.

    更改代碼是一項(xiàng)冒險(xiǎn)的業(yè)務(wù)。 TDD提供了一個(gè)很好的工具,既可以指導(dǎo)我們的設(shè)計(jì)決策,又可以確保我們不會(huì)弄亂我們已經(jīng)確認(rèn)能達(dá)到預(yù)期效果的東西。

    用實(shí)際的處理邏輯替換硬編碼的值 (Replace hardcoded value with actual processing logic)

    Let’s now replace the hardcoded value with actual running code. We first teach our Tip Calculator that there is a service rating called “Terrible” and that tip percentage associated with this rating is 0:

    現(xiàn)在讓我們用實(shí)際的運(yùn)行代碼替換硬編碼的值。 我們首先告訴我們的Tip Calculator ,有一個(gè)服務(wù)評(píng)級(jí)為“可怕”,并且與該評(píng)級(jí)相關(guān)的小費(fèi)百分比為0:

    public bool CheckIfRatingIsValid(string rating) { ratingPercentages.Add("Terrible", 0); return false; }

    Our Tip Calculator is now knowledgeable about the fact that there is a service rating labeled “Terrible” and the tip percentage associated with terrible service is 0%. Great, but we’re still returning hardcoded value false. Time to replace it with actual calculation:

    現(xiàn)在,我們的Tip Calculator可以了解以下事實(shí):服務(wù)等級(jí)標(biāo)記為“糟糕”,并且與糟糕服務(wù)相關(guān)的小費(fèi)百分比為0%。 很好,但是我們?nèi)匀环祷赜簿幋a值false 。 是時(shí)候用實(shí)際計(jì)算替換它了:

    public bool CheckIfRatingIsValid(string rating) { ratingPercentages.Add("Terrible", 0); return ratingPercentages.ContainsKey(rating); }

    Run the test again:

    再次運(yùn)行測(cè)試:

    Great, but the code still looks contrived. We are loading the “Terrible” value into the instance of Hashtable ratingPercentages and then immediately checking to see if that value exists in the Hashtable. Now that we have moved from the failing test (Red) to the passing test (Green), it’s time to perform the third step in the TDD loop – Refactor.

    很好,但是代碼看起來(lái)還是人為的。 我們正在將“可怕”值加載到Hashtable ratingPercentages實(shí)例中,然后立即檢查該值是否存在于Hashtable 。 現(xiàn)在我們已經(jīng)從失敗測(cè)試(紅色)移至通過(guò)測(cè)試(綠色),是時(shí)候執(zhí)行TDD循環(huán)中的第三步–重構(gòu)。

    Refactoring is basically the activity of modifying the code structure without affecting the code behaviour. Our task here is simple: extract the code responsible for populating of the Hashtable ratingPercentages into a separate block of code.

    重構(gòu)基本上是在不影響代碼行為的情況下修改代碼結(jié)構(gòu)的活動(dòng)。 我們的任務(wù)很簡(jiǎn)單:將負(fù)責(zé)填充Hashtable ratingPercentages的代碼提取到單獨(dú)的代碼塊中。

    The most natural place for this loading is in the block of code that is doing the initialization of the Tip Calculator – the constructor method. After refactoring, our shipping application source code looks like this:

    進(jìn)行加載的最自然的地方是進(jìn)行Tip Calculator初始化的代碼塊- constructor方法。 重構(gòu)后,我們的運(yùn)輸應(yīng)用程序源代碼如下所示:

    using System.Collections;namespace app { public class TipCalculator { private Hashtable ratingPercentages = new Hashtable(); public TipCalculator() { ratingPercentages.Add("Terrible", 0); } public bool CheckIfRatingIsValid(string rating) { return ratingPercentages.ContainsKey(rating); } } }

    Run the test again, and it passes (we’re in green). We have modified the structure of the code without modifying its behaviour! Good job.

    再次運(yùn)行測(cè)試,測(cè)試通過(guò)(綠色)。 我們已經(jīng)修改了代碼的結(jié)構(gòu),而沒(méi)有修改其行為! 做得好。

    擲硬幣 (Flip the coin)

    Any time we satisfy a positive expectation, it is a prudent practice to turn things on their head and describe the negative expectation.

    每當(dāng)我們滿足積極的期望時(shí),明智的做法就是轉(zhuǎn)過(guò)頭去描述消極的期望。

    At this point, since we’ve satisfied that a legitimate service rating value is found in the Tip Calculator, we want to ensure that non-legitimate values are not found in the Tip Calculator.

    在這一點(diǎn)上,由于我們已經(jīng)滿意在Tip Calculator找到了合法的服務(wù)評(píng)級(jí)值,因此我們要確保在Tip Calculator中未找到不合法的值。

    What do we mean by non-legitimate values? Any value other than “Terrible”, “Poor”, “Good”, “Great” and “Excellent”. Time to write the new expectation (i.e. test):

    非合法價(jià)值是什么意思? “差”,“差”,“好”,“好”和“優(yōu)秀”以外的任何值。 是時(shí)候?qū)懗鲂碌钠谕?即測(cè)試):

    [Fact] public void CheckIfRatingWhateverIsValid() { var expectedResponseForValidRating = true; var actualResponseForValidRating = tipCalculator.CheckIfRatingIsValid("Whatever");Assert.Equal(expectedResponseForValidRating, actualResponseForValidRating); }

    Run the tests:

    運(yùn)行測(cè)試:

    Fails. As expected. (We specified that our expectation when supplying the service rating as “Whatever” should be true. In reality, it is false, because our Tip Calculator does not contain value “Whatever”.)

    失敗 如預(yù)期的那樣。 (我們指定在提供“任何”服務(wù)等級(jí)時(shí)的期望應(yīng)該是true 。實(shí)際上,這是false ,因?yàn)槲覀兊腡ip Calculator不包含值“任何”。)

    Fix the test (change the expectedResponseForValidRating from true to false) and run it again:

    修復(fù)測(cè)試(將expectedResponseForValidRating從true更改為false )并再次運(yùn)行它:

    A moment of reflection: why did we fake the first test run and made it fail? Because we always want to make sure we observe our new test failing. That way, we’ll know that in the future any successful passing of the test is not merely a false positive.

    片刻的反思:為什么我們要偽造第一次測(cè)試并使其失敗? 因?yàn)槲覀円恢毕氪_保我們觀察到新測(cè)試失敗。 這樣,我們就會(huì)知道,將來(lái)任何成功通過(guò)測(cè)試的都不僅僅是假陽(yáng)性。

    贊美穩(wěn)態(tài) (In praise of steady state)

    Software engineering is a balancing act between steady state and periods of unstable state. What do we mean by steady state?

    軟件工程是穩(wěn)定狀態(tài)和不穩(wěn)定狀態(tài)周期之間的平衡行為。 穩(wěn)定狀態(tài)是什么意思?

    If we have a system (a running application) that behaves the way we expect it to behave (i.e. it produces values we have specified as expected values), we declare that the system is in a steady state. It is running, and delivering some value.

    如果我們有一個(gè)系統(tǒng)(正在運(yùn)行的應(yīng)用程序)以我們期望的方式運(yùn)行(即產(chǎn)生我們指定為期望值的值),則我們聲明該系統(tǒng)處于穩(wěn)定狀態(tài)。 它正在運(yùn)行,并提供了一些價(jià)值。

    That value delivery is still partial. In our case, the only value to the users this Tip Calculator delivers is its ability to recognize service rating “Terrible” as a legitimate rating. In addition, it is capable of informing us that service rating “Whatever” is not a legitimate rating.

    價(jià)值傳遞仍然是部分的。 在我們的案例中,此Tip Calculator對(duì)用戶而言是唯一的價(jià)值 交付是其將服務(wù)等級(jí)“糟糕”識(shí)別為合法等級(jí)的能力。 此外,它還可以告知我們服務(wù)等級(jí)“無(wú)論如何”都不是合法的等級(jí)。

    That’s not much, but still is better than nothing. And good news – our running application is currently in a steady state. Now we want to look into how to add more valuable behaviour to our Tip Calculator. And the only way to add more value is by making some changes.

    數(shù)量不多,但總比沒(méi)有好。 好消息–我們正在運(yùn)行的應(yīng)用程序目前處于穩(wěn)定狀態(tài)。 現(xiàn)在,我們要研究如何向“ Tip Calculator添加更多有價(jià)值的行為。 而增加價(jià)值的唯一方法是進(jìn)行一些更改。

    Any time we make a change to our application, we disturb its steady state. This disturbance is risky. It may mean our changes could break something that is already working. Because of that concern, we strive to make the duration of this unstable state as short as possible.

    每當(dāng)我們對(duì)應(yīng)用程序進(jìn)行更改時(shí),我們都會(huì)破壞其穩(wěn)態(tài)。 這種干擾是危險(xiǎn)的。 這可能意味著我們的更改可能會(huì)破壞已經(jīng)起作用的某些功能。 因此,我們努力使這種不穩(wěn)定狀態(tài)的持續(xù)時(shí)間盡可能短。

    Remember how we compared TDD to riding a galloping horse? When the horse is in flight (i.e. not touching the ground) it is advancing toward our goal, but it’s not in the steady state. Only when the horse touches the ground does its state stabilize.

    還記得我們?nèi)绾螌DD與騎馬馳horse相提并論嗎? 當(dāng)馬在飛行中(即不接觸地面)時(shí),它正在向我們的目標(biāo)前進(jìn),但它不是處于穩(wěn)定狀態(tài)。 只有當(dāng)馬接觸地面時(shí),其狀態(tài)才會(huì)穩(wěn)定。

    TDD encourages making small changes (in flight) and immediately grounding the system by verifying that it is back in the steady state. We value steady state despite the fact that we eagerly embrace changes. Without changes, we won’t be able to deliver value, but we must do it in a very deliberate, careful fashion.

    TDD鼓勵(lì)進(jìn)行微小的更改(在飛行中),并通過(guò)驗(yàn)證系統(tǒng)是否處于穩(wěn)定狀態(tài)來(lái)立即將其接地。 盡管我們熱切地接受變化,但我們?nèi)灾匾暦€(wěn)定狀態(tài)。 沒(méi)有變化,我們將無(wú)法交付價(jià)值,但是我們必須以一種非常謹(jǐn)慎,謹(jǐn)慎的方式來(lái)實(shí)現(xiàn)它。

    When doing TDD, we treat changes to steady state like walking on eggshells. No matter how sure we may be in knowing what and how we’re doing software engineering, it is prudent to still let failing tests guide our decisions.

    在進(jìn)行TDD時(shí),我們像在蛋殼上行走一樣對(duì)待穩(wěn)態(tài)的變化。 無(wú)論我們有多確定要知道什么以及如何進(jìn)行軟件工程,還是要謹(jǐn)慎地讓失敗的測(cè)試來(lái)指導(dǎo)我們的決策。

    檢查是否正確的小費(fèi)百分比與服務(wù)等級(jí)相關(guān)聯(lián) (Check if correct tip percentage is associated with service rating)

    Let’s now introduce another change into our application – a test to verify if correct tip percentage is associated with service rating “Terrible”. Remember that we populated the instance of Hashtable ratingPercentages with the following values:

    現(xiàn)在,讓我們?cè)趹?yīng)用程序中進(jìn)行另一個(gè)更改–測(cè)試以驗(yàn)證正確的筆尖百分比是否與“可怕”服務(wù)等級(jí)相關(guān)聯(lián)。 請(qǐng)記住,我們使用以下值填充了Hashtable ratingPercentages實(shí)例:

    ratingPercentages.Add("Terrible", 0);

    We have written a test that verifies that our Hashtable ratingPercentages does contain legitimate service rating “Terrible”. Now we need a test that verifies that service rating “Terrible” means that the tip percentage for that rating is 0.

    我們編寫(xiě)了一個(gè)測(cè)試,以驗(yàn)證我們的Hashtable ratingPercentages是否包含合法的服務(wù)等級(jí)“ Terrible”。 現(xiàn)在,我們需要進(jìn)行一項(xiàng)測(cè)試,以驗(yàn)證服務(wù)等級(jí)“糟糕”是否意味著該等級(jí)的小費(fèi)百分比為0。

    [Fact] public void CheckIfRatingTerribleHasZeroPercentTip() { var expectedZeroPercentForTerribleRating = 0; var actualZeroPercentForTerribleRating = 10; Assert.Equal(expectedZeroPercentForTerribleRating, actualZeroPercentForTerribleRating); }

    The new test CheckIfRatingTerribleHasZeroPercentTip should fail:

    新測(cè)試CheckIfRatingTerribleHasZeroPercentTip應(yīng)該失敗:

    Again, we’re purposefully hard coding wrong actual values just so that we could observe our brand new test fail. Now we must replace hard coded value with the actual call to the Tip Calculator’s method that returns tip percentage for the service rating:

    同樣,我們有目的地硬編碼錯(cuò)誤的實(shí)際值,以便可以觀察到全新的測(cè)試失敗。 現(xiàn)在,我們必須用對(duì)Tip Calculator方法的實(shí)際調(diào)用替換硬編碼的值,該方法返回服務(wù)等級(jí)的提示百分比:

    [Fact] public void CheckIfRatingTerribleHasZeroPercentTip() { var expectedZeroPercentForTerribleRating = 0; var actualZeroPercentForTerribleRating = tipCalculator.GetPercentageTipForRating("Terrible");Assert.Equal(expectedZeroPercentForTerribleRating, actualZeroPercentForTerribleRating); }

    As in the previous case, we have invented a new API for Tip Calculator. We call this new capability GetPercentageTipForRating("Terrible"). It takes the value of the service rating and returns the tip percentage for that rating.

    與前面的情況一樣,我們?yōu)門(mén)ip Calculator發(fā)明了一個(gè)新的API。 我們將此新功能GetPercentageTipForRating("Terrible") 。 它采用服務(wù)等級(jí)的值,并返回該等級(jí)的小費(fèi)百分比。

    Flip over to the app/TipCalculator.cs and add the hard coded skeleton of the new method:

    翻轉(zhuǎn)到app/TipCalculator.cs并添加新方法的硬編碼框架:

    public int GetPercentageTipForRating(string rating) { return 10; }

    Running the test fails again, because we have hard coded the return value. Let’s replace it with actual processing:

    由于我們已經(jīng)對(duì)返回值進(jìn)行了硬編碼,因此運(yùn)行測(cè)試再次失敗。 讓我們用實(shí)際處理代替它:

    public int GetPercentageTipForRating(string rating) { int tipPercentage = Int32.Parse(ratingPercentages[rating].ToString());return tipPercentage; }

    Run the test again:

    再次運(yùn)行測(cè)試:

    All three tests pass – we’re in green, we’re back to steady state!

    所有三個(gè)測(cè)試均通過(guò)–我們處于綠色狀態(tài),我們回到了穩(wěn)定狀態(tài)!

    對(duì)于非合法的服務(wù)評(píng)級(jí),我們期望什么小費(fèi)百分比? (What tip percentage do we expect for non-legitimate service ratings?)

    Many years of experience in the field taught me to be a bit pessimistic. Now that we have our application back in the steady state and delivering value (answering questions about legitimate service ratings and also giving us correct tip percentage for the “Terrible” rating), we need to see what happens when we run our application by giving it non-legitimate service rating value (for example, by giving it service rating “Whatever”).

    在該領(lǐng)域的多年經(jīng)驗(yàn)教會(huì)我有些悲觀。 現(xiàn)在我們已經(jīng)使應(yīng)用程序恢復(fù)到穩(wěn)定狀態(tài)并交付了價(jià)值(回答有關(guān)合法服務(wù)等級(jí)的問(wèn)題,并為我們提供了“可怕”等級(jí)的正確提示百分比),我們需要通過(guò)提供應(yīng)用程序來(lái)查看運(yùn)行應(yīng)用程序時(shí)會(huì)發(fā)生什么不合法的服務(wù)等級(jí)值(例如,將其服務(wù)等級(jí)定為“ Whatever”)。

    Time for leaving the steady state yet again. We will write another test:

    是時(shí)候再次離開(kāi)穩(wěn)定狀態(tài)了。 我們將編寫(xiě)另一個(gè)測(cè)試:

    [Fact] public void CheckIfRatingWhateverHasNegativeOnePercentTip() { var expectedZeroPercentForWhateverRating = -1; var actualZeroPercentForWhateverRating = tipCalculator.GetPercentageTipForRating("Whatever");Assert.Equal(expectedZeroPercentForWhateverRating, actualZeroPercentForWhateverRating); }

    We are describing our expectation when Tip Calculator is asked to return tip percentage for service rating “Whatever”. Because service rating “Whatever” is a non-legitimate rating, we are expecting Tip Calculator to return tip percentage of value -1.

    當(dāng)要求Tip Calculator返回服務(wù)等級(jí)為“任何??”的小費(fèi)百分比時(shí),我們正在描述我們的期望。 由于服務(wù)等級(jí)“無(wú)論如何”都是不合法的等級(jí),因此我們希望Tip Calculator返回值-1的小費(fèi)百分比。

    This test now precipitates one improvement to our shipping code. We need to add some logic to first check whether the supplied service rating is legitimate or not. Only if it is legitimate do we ask Hashtable ratingPercentages to tell us what the associated value of the tip percentage is. If the supplied service rating is non-legitimate (for example, if it is “Whatever”) we bypass talking to Hashtable ratingPercentages and simply return -1.

    現(xiàn)在,此測(cè)試可對(duì)我們的運(yùn)輸代碼進(jìn)行改進(jìn)。 我們需要添加一些邏輯以首先檢查所提供的服務(wù)等級(jí)是否合法。 僅在合法的情況下,我們才要求Hashtable ratingPercentages告訴我們小費(fèi)百分比的關(guān)聯(lián)值是多少。 如果提供的服務(wù)等級(jí)Hashtable ratingPercentages (例如,如果是“ Whatever”),我們將忽略與Hashtable ratingPercentages并僅返回-1。

    public int GetPercentageTipForRating(string rating) { int tipPercentage = -1; if(CheckIfRatingIsValid(rating)) { tipPercentage = Int32.Parse(ratingPercentages[rating].ToString()); } return tipPercentage; }

    Run the tests, and all 4 tests pass:

    運(yùn)行測(cè)試,所有4個(gè)測(cè)試均通過(guò):

    We are back to the steady state. Another short excursion into the volatile area, and another swift victory and a safe return to steady, imperturbable state.

    我們回到了穩(wěn)定狀態(tài)。 再次短暫進(jìn)??入不穩(wěn)定地區(qū),又一次Swift獲勝,安全返回穩(wěn)定,穩(wěn)定的狀態(tài)。

    填充其他服務(wù)等級(jí)提示百分比 (Populate other service rating tip percentages)

    Now is a good time to take a breather and make less risky changes, following the already established pattern. Leave the safety of the steady state and make short trips into the volatile territory by adding a new test to verify if service rating “Poor” is a valid, legitimate rating:

    現(xiàn)在是按照已經(jīng)建立的模式喘口氣并進(jìn)行較小風(fēng)險(xiǎn)更改的好時(shí)機(jī)。 通過(guò)添加新的測(cè)試來(lái)驗(yàn)證服務(wù)等級(jí)“差”是否是有效的合法等級(jí),從而保持穩(wěn)定狀態(tài)的安全,并短暫進(jìn)入不穩(wěn)定區(qū)域:

    [Fact] public void CheckIfRatingPoorIsValid() { var expectedResponseForValidRating = true; var actualResponseForValidRating = tipCalculator.CheckIfRatingIsValid("Poor");Assert.Equal(expectedResponseForValidRating, actualResponseForValidRating); }

    Running this test will fail:

    運(yùn)行此測(cè)試將失敗:

    Service rating “Poor” hasn’t been implemented yet. To make the test pass, implement service rating “Poor” by adding this line to the TipCalculator constructor:

    服務(wù)等級(jí)“差”尚未實(shí)施。 要使測(cè)試通過(guò),請(qǐng)將此行添加到TipCalculator構(gòu)造函數(shù)中,以實(shí)現(xiàn)服務(wù)等級(jí)“差”:

    ratingPercentages.Add("Poor", 5);

    Run the tests, and we’re back to safety:

    運(yùn)行測(cè)試,我們回到安全狀態(tài):

    We’re enjoying steady state with 6 tests successfully passing.

    我們正在通過(guò)6個(gè)測(cè)試成功通過(guò)的狀態(tài)保持穩(wěn)定。

    Now that we have added service rating “Poor” associated with the 5% tip, let’s write a test that will describe that expectation:

    現(xiàn)在,我們添加了與5%的小費(fèi)相關(guān)的服務(wù)評(píng)級(jí)“差”,讓我們編寫(xiě)一個(gè)測(cè)試來(lái)描述這種期望:

    [Fact] public void CheckIfRatingPoorHasFivePercentTip() { var expectedZeroPercentForPoorRating = 5; var actualZeroPercentForPoorRating = tipCalculator.GetPercentageTipForRating("Poor");Assert.Equal(expectedZeroPercentForPoorRating, actualZeroPercentForPoorRating); }

    The tests run successfully, and we’re back to being safe in the steady state.I will leave it to the reader to make the changes that will drive the implementation of the service ratings “Good”, “Great” and “Excellent”. At the end of the exercise you should have your system back in the steady state with 12 tests successfully passing:

    測(cè)試成功運(yùn)行,我們已回到穩(wěn)定的安全狀態(tài)。我將它留給讀者進(jìn)行更改,以推動(dòng)實(shí)現(xiàn)“好”,“好”和“優(yōu)秀”服務(wù)等級(jí)。 在練習(xí)結(jié)束時(shí),您應(yīng)該使系統(tǒng)恢復(fù)穩(wěn)定并成功通過(guò)12個(gè)測(cè)試:

    給定總數(shù)和服務(wù)等級(jí),計(jì)算總數(shù) (Calculate grand total given the total and the service rating)

    We are now ready for the final step – given the total bill and the service rating, we expect Tip Calculator to calculate tip percentage and add it to the total, producing the grand total to be paid to the restaurant.

    現(xiàn)在我們準(zhǔn)備好進(jìn)行最后一步了-給定總賬單和服務(wù)等級(jí),我們希望Tip Calculator能夠計(jì)算小費(fèi)百分比并將其加到總計(jì)中,從而產(chǎn)生要支付給餐廳的總計(jì)。

    As we always do, first we describe the expectation:

    像往常一樣,首先我們描述期望:

    [Fact] public void CalculateTotalWithTip() { var expectedTotalWithTip = 135.7; var actualTotalWithTip = 200.0; Assert.Equal(expectedTotalWithTip, actualTotalWithTip); }

    As usual, we first hard code some expectations that we know are going to fail. This is so that we observe our new test failing:

    像往常一樣,我們首先硬編碼一些我們知道會(huì)失敗的期望。 這樣我們可以觀察到我們的新測(cè)試失敗了:

    Time to implement processing logic that will calculate correct total with tip. Given the total of $118.0, and the service rating “Great” (15% tip), we’re expecting the total to be $135.7:

    是時(shí)候?qū)嵤┨幚磉壿?#xff0c;用小費(fèi)計(jì)算正確的總數(shù)。 鑒于總金額為118.0美元,服務(wù)評(píng)級(jí)為“很好”(小費(fèi)15%),我們預(yù)計(jì)總金額為135.7美元:

    [Fact] public void CalculateTotalWithTip() { var rating = "Great"; var total = 118; var expectedTotalWithTip = 135.7; var actualTotalWithTip = tipCalculator.CalculateTotalWithTip(total, rating); Assert.Equal(expectedTotalWithTip, actualTotalWithTip); }

    We have designed a new API the Tip Calculator – a method called CalculateTotalWithTip(total, rating). It takes the total value and the service rating and returns the total with tip. The implementation of the method looks like this:

    我們?cè)O(shè)計(jì)了一個(gè)新的API Tip Calculator -一種稱為CalculateTotalWithTip(total, rating) 。 它獲取總價(jià)值和服務(wù)等級(jí),并帶小費(fèi)返回總和。 該方法的實(shí)現(xiàn)如下所示:

    public double CalculateTotalWithTip(double total, string rating) { double totalWithTip = -1; if(CheckIfRatingIsValid(rating)) { int percentage = GetPercentageTipForRating(rating); totalWithTip = total + ((total/100) * percentage); } return totalWithTip; }

    Run the tests, and we’re back to steady state:

    運(yùn)行測(cè)試,我們回到穩(wěn)定狀態(tài):

    我們?cè)谶@里完成嗎? (Are we done here?)

    No, not yet. Even when all tests are in green and we’re back to the steady state, there are still a couple of things we need to do.

    還沒(méi)有。 即使所有測(cè)試都呈綠色,并且我們又回到了穩(wěn)定狀態(tài),仍然需要做幾件事。

    To begin with, we need to add a pessimistic expectation for our Tip Calculator calculation of total with the tip based on the service rating:

    首先,我們需要根據(jù)服務(wù)等級(jí)為T(mén)ip Calculator的總費(fèi)用添加悲觀期望:

    [Fact] public void CalculateTotalWithTipForNonlegitimateRating() { var rating = "Meh"; var total = 118; var expectedTotalWithTip = 135.7; var actualTotalWithTip = tipCalculator.CalculateTotalWithTip(total, rating); Assert.Equal(expectedTotalWithTip, actualTotalWithTip); }

    Running the tests produces one failing test:

    運(yùn)行測(cè)試會(huì)產(chǎn)生一個(gè)失敗的測(cè)試:

    Our expectation for non-legitimate service rating (“Meh”) was incorrect. The actual total is -1, so we need to adjust our expectation by replacing 135.7 with -1. Run the tests again, and we’re back to the steady state!

    我們對(duì)非合法服務(wù)等級(jí)(“ Meh”)的預(yù)期不正確。 實(shí)際總數(shù)為-1,因此我們需要通過(guò)將-135.7替換為-1來(lái)調(diào)整期望值。 再次運(yùn)行測(cè)試,我們回到了穩(wěn)定狀態(tài)!

    We now have 14 tests, they all successfully pass, and our Tip Calculator works according to our expectations and satisfies the acceptance criteria.

    現(xiàn)在,我們有14個(gè)測(cè)試,它們都成功通過(guò)了,并且我們的小費(fèi)計(jì)算器可以按照我們的期望工作并滿足驗(yàn)收標(biāo)準(zhǔn)。

    We’re almost done. One more sanity check before we can confidently ship our shiny new Tip Calculator – we must run mutation testing.

    我們快完成了。 在我們可以放心地發(fā)送閃亮的新Tip Calculator之前,還需要進(jìn)行一次完整性檢查-我們必須運(yùn)行突變測(cè)試 。

    Our mutation testing framework will mutate the shipping code, one line at a time, and will run all tests for each individual mutation.

    我們的突變測(cè)試框架將一次更改一行代碼的運(yùn)輸代碼,并將針對(duì)每個(gè)單獨(dú)的突變運(yùn)行所有測(cè)試。

    If the tests complain about the mutated code, all is good, we have killed the mutant. If the tests don’t complain, we’re in trouble. We have a surviving mutant in our codebase, which means there are lines of code in our repo that are doing something for which we haven’t provided any expectations.

    如果測(cè)試抱怨突變的代碼,那一切都很好,我們已經(jīng)殺死了該突變體。 如果測(cè)試沒(méi)有問(wèn)題,我們就麻煩了。 我們的代碼庫(kù)中有一個(gè)尚存的變體,這意味著我們的存儲(chǔ)庫(kù)中有一些代碼行正在做一些我們沒(méi)有想到的事情。

    Let’s run mutation testing to see how solid our solution is. Good news – our solution has killed 100% of mutants!

    讓我們運(yùn)行突變測(cè)試,看看我們的解決方案有多牢固。 好消息–我們的解決方案殺死了100%的突變體!

    Mutation testing has given our shipping application a clean bill of health. Our Tip Calculator seems to be in good shape.

    突變測(cè)試為我們的運(yùn)輸應(yīng)用程序提供了清晰的健康清單。 我們的Tip Calculator似乎狀態(tài)良好。

    紅綠重構(gòu)反射 (Red-Green-Refactor-Reflect)

    Let’s review our Tip Calculator building exercise. We started the process by describing our expectations using the classical user story format. User story (as the name implies) is focused on describing scenarios that fulfill end user’s goals.

    讓我們回顧一下Tip Calculator構(gòu)建練習(xí)。 我們通過(guò)使用經(jīng)典用戶故事格式描述我們的期望來(lái)開(kāi)始該過(guò)程。 用戶故事(顧名思義)專(zhuān)注于描述實(shí)現(xiàn)最終用戶目標(biāo)的方案。

    In this case, the simple goal is to calculate the tip amount from the supplied service rating and the restaurant bill total. The calculated tip amount is then automatically added to the total.

    在這種情況下,簡(jiǎn)單的目標(biāo)是從提供的服務(wù)等級(jí)和餐廳賬單總額中計(jì)算小費(fèi)金額。 然后將計(jì)算出的小費(fèi)金額自動(dòng)添加到總數(shù)中。

    From there we proceeded to build our shipping application by following the TDD methodology. As we’ve demonstrated, the methodology consists of writing a failing test, observing it fail (the Red phase of TDD), then immediately making code changes that ensure the test passes (the Green phase of TDD). Once the test passes, we move into the Refactor phase (we restructure the code without affecting its behaviour). That way, we make sure our code is not expensive to change.

    從那里開(kāi)始,我們遵循TDD方法來(lái)構(gòu)建運(yùn)輸應(yīng)用程序。 如我們所展示的,該方法包括編寫(xiě)一個(gè)失敗的測(cè)試,觀察它是否失敗(TDD的紅色階段),然后立即進(jìn)行代碼更改以確保測(cè)試通過(guò)(TDD的綠色階段)。 測(cè)試通過(guò)后,我們進(jìn)入重構(gòu)階段(我們?cè)诓挥绊懫湫袨榈那闆r下重構(gòu)了代碼)。 這樣,我們確保更改代碼的代價(jià)并不昂貴。

    A proper TDD practice also mandates frequent retrospective – we call it reflection. We stop and think about the things we’ve accomplished thus far, to see if we could learn from our recent experiences. This reflection fortifies the process, as it relies on frequent and tight feedback provided by the failing, then succeeding tests.

    適當(dāng)?shù)腡DD做法也要求經(jīng)常進(jìn)行回顧-我們稱其為反思。 我們停下來(lái)想一想到目前為止我們已經(jīng)完成的事情,看看我們是否可以從最近的經(jīng)驗(yàn)中學(xué)到東西。 這種反映加強(qiáng)了該過(guò)程,因?yàn)樗蕾囉谑〉臏y(cè)試和隨后的測(cè)試所提供的頻繁而嚴(yán)格的反饋。

    I have already compared Test Driven Development to the experience of riding a galloping horse. While riding a horse, we’re alternating between flying through the air (i.e. speed achieved when the horse leaps from the ground) and steering the horse. It is impossible to steer the horse while we’re off the ground, up in the air. At that point, we gain speed, but we cannot make any changes of the direction. It is only once the horse touches the ground that we can make a change in direction.

    我已經(jīng)將“測(cè)試驅(qū)動(dòng)開(kāi)發(fā)”與“奔馬”的體驗(yàn)進(jìn)行了比較。 騎馬時(shí),我們?cè)诳罩酗w行(即,馬從地面跳下時(shí)達(dá)到的速度)和操縱馬之間進(jìn)行切換。 當(dāng)我們離開(kāi)地面,懸而未決時(shí),不可能操縱馬匹。 在這一點(diǎn)上,我們可以提高速度,但是不能改變方向。 只有當(dāng)馬觸地時(shí),我們才能改變方向。

    In TDD, we strive to touch the ground as frequently as possible. The longer the leaps we make without touching the ground, the less chance we have for correcting the course.

    在TDD中,我們努力盡可能多地接觸地面。 我們?cè)诓挥|地面的情況下進(jìn)行的跳躍越長(zhǎng),糾正路線的機(jī)會(huì)就越少。

    I also compared software development practices that don’t follow TDD principles to the experience of flying a kite. When flying a kite, we never touch the ground. It is an exhilarating feeling of letting the wind pick the kite up and bounce it up in the air. We can achieve considerable speed that way. But we struggle in such situations to maintain desired course. And after we eventually land the kite, it usually does not land in the spot we originally wanted it to land.

    我還將不遵循TDD原理的軟件開(kāi)發(fā)實(shí)踐與放風(fēng)箏的體驗(yàn)進(jìn)行了比較。 放風(fēng)箏時(shí),我們永遠(yuǎn)不會(huì)觸地。 讓風(fēng)把風(fēng)箏拾起并在空中彈起,這是一種令人振奮的感覺(jué)。 這樣我們可以達(dá)到可觀的速度。 但是我們?cè)谶@樣的情況下努力維持預(yù)期的路線。 在我們最終放下風(fēng)箏后,它通常不會(huì)降落在我們最初希望放下的地方。

    Why is the emphasis of this article on “don’t write tests first”? Many software engineers who are not familiar with agile practices as implemented in TDD usually either claim that writing automated tests isn’t necessary, or claim that automated tests should be written after the code is complete.

    為什么本文強(qiáng)調(diào)“不要先編寫(xiě)測(cè)試”? 許多不熟悉TDD中實(shí)現(xiàn)的敏捷實(shí)踐的軟件工程師通常要么聲稱不需要編寫(xiě)自動(dòng)測(cè)試,要么聲稱應(yīng)該在代碼完成后編寫(xiě)自動(dòng)測(cè)試。

    Once they start learning about agile and TDD, they may reconsider their practices and decide that writing tests before writing implementation code may make more sense. Still, because of the ingrained waterfall mentality, some of those engineers make the mistake of writing all tests first, and only then move into writing the code.

    一旦他們開(kāi)始學(xué)習(xí)敏捷和TDD,他們可能會(huì)重新考慮他們的實(shí)踐,并決定在編寫(xiě)實(shí)現(xiàn)代碼之前編寫(xiě)測(cè)試可能更有意義。 但是,由于根深蒂固的瀑布思維,其中一些工程師犯了先編寫(xiě)所有測(cè)試,然后才編寫(xiě)代碼的錯(cuò)誤。

    That approach is completely wrong. It is equivalent to the traditional waterfall approach where we go through the development process by respecting gated phases.

    這種方法是完全錯(cuò)誤的。 它等效于傳統(tǒng)的瀑布方法,在這種方法中,我們會(huì)遵循選通階段來(lái)經(jīng)歷開(kāi)發(fā)過(guò)程。

    First we write the requirements (in this case, requirements would be expectations written in the form of automated tests). Only once all the requirements (i.e. automated tests) have been written, signed off and frozen, do we move into the next gated phase – write the code for the shipping application.

    首先,我們編寫(xiě)需求(在這種情況下,需求就是以自動(dòng)化測(cè)試的形式編寫(xiě)的期望)。 只有在所有要求(即自動(dòng)測(cè)試)均已編寫(xiě),簽字并凍結(jié)后,我們才能進(jìn)入下一個(gè)封閉階段–編寫(xiě)運(yùn)輸應(yīng)用程序的代碼。

    TDD is the exact opposite of the “write tests first” approach. In TDD, we always write only one test. That test describes a desired behaviour. The desired behaviour does not exist yet (that’s why it is desired), and the test fails.

    TDD與“先寫(xiě)測(cè)試”方法完全相反。 在TDD中,我們總是只編寫(xiě)一個(gè)測(cè)試。 該測(cè)試描述了期望的行為。 所需的行為尚不存在(這就是所需的原因),并且測(cè)試失敗。

    We then immediately move into making changes to the code in the attempt to create the desired behaviour. Once desired behaviour is created, it gets validated by the test, and if the expectations of the test are satisfied, we move into refactoring the code (to satisfy nonfunctional requirements, such as cost of change).

    然后,我們立即著手對(duì)代碼進(jìn)行更改,以嘗試創(chuàng)建所需的行為。 一旦創(chuàng)建了期望的行為,它就會(huì)通過(guò)測(cè)試進(jìn)行驗(yàn)證,如果滿足了測(cè)試的期望,我們將著手重構(gòu)代碼(以滿足非功能性需求,例如變更成本)。

    We practice a rigorous discipline to never succumb to the temptation to write more than one test at a time. That way, we ensure that we keep touching the ground as frequently as possible.

    我們實(shí)行嚴(yán)格的紀(jì)律,以免屈從于一次編寫(xiě)多個(gè)測(cè)試的誘惑。 這樣,我們可以確保我們盡可能頻繁地接觸地面。

    We prefer to remain ‘in flight’ for the shortest possible time. We are ‘in flight’ during that period when the desired behaviour described in the test has not materialized yet. The smaller the expected and desired behaviour is, the shorter will be our ‘in flight’ trajectory. That way, we keep touching the ground often, which gives us a chance to adjust the steering.

    我們希望在最短的時(shí)間內(nèi)保持“飛行”狀態(tài)。 當(dāng)測(cè)試中描述的所需行為尚未實(shí)現(xiàn)時(shí),我們正在“飛行中”。 預(yù)期和期望的行為越小,我們的“飛行中”軌跡就越短。 這樣,我們就經(jīng)常與地面接觸,這給了我們調(diào)整轉(zhuǎn)向的機(jī)會(huì)。

    結(jié)論 (Conclusion)

    Building a simple Tip Calculator is a toy sized problem, and using that exercise to illustrate TDD methodology is not necessarily providing a convincing argument in favour of TDD. Still, within the constraints of a technical article, going over this hands-on exercise may provide valuable insights into the benefits of adopting TDD.

    建立一個(gè)簡(jiǎn)單的Tip Calculator是一個(gè)玩具大小的問(wèn)題,使用該練習(xí)來(lái)說(shuō)明TDD方法論并不一定提供支持TDD的令人信服的論點(diǎn)。 盡管如此,在技術(shù)文章的限制范圍內(nèi),繼續(xù)進(jìn)行此動(dòng)手練習(xí)可能會(huì)為采用TDD的好處提供有價(jià)值的見(jiàn)解。

    We would still argue that the real benefits of TDD only become apparent when dealing with much larger, more complex software engineering efforts. The ability to remain grounded while making potentially risky changes to a large, complex system is often a life saver.

    我們?nèi)匀徽J(rèn)為,只有在處理更大,更復(fù)雜的軟件工程工作時(shí),TDD的真正好處才會(huì)顯現(xiàn)出來(lái)。 在對(duì)大型復(fù)雜系統(tǒng)進(jìn)行潛在風(fēng)險(xiǎn)更改時(shí)保持接地的能力通常可以挽救生命。

    In addition to that, building software using TDD methodology results in much less rework. TDD drives high degree of modularization, which results in high cohesiveness of the modules and low coupling between the modules.

    除此之外,使用TDD方法構(gòu)建軟件可以減少返工。 TDD驅(qū)動(dòng)了高度的模塊化,這導(dǎo)致了模塊的高內(nèi)聚性和模塊之間的低耦合。

    All these characteristics produce a shipping application whose codebase is easy and inexpensive to change. And lowering the cost of change has proven to be the best way on the path to embracing changes and abandoning the concept known as ‘scope creep’.

    所有這些特征產(chǎn)生了一個(gè)運(yùn)輸應(yīng)用程序,其代碼庫(kù)易于更改且成本低廉。 事實(shí)證明,降低變更成本是擁抱變更并摒棄“范圍蔓延”概念的最佳途徑。

    Bottom line, TDD enables software engineering teams to deliver high degree of flexibility to the business.

    總而言之,TDD使軟件工程團(tuán)隊(duì)能夠?yàn)闃I(yè)務(wù)提供高度的靈活性。

    翻譯自: https://www.freecodecamp.org/news/dont-write-all-your-software-tests-first-just-write-one/

    軟件測(cè)試測(cè)試用例編寫(xiě)

    總結(jié)

    以上是生活随笔為你收集整理的软件测试测试用例编写_不要先编写所有软件测试-只需编写一个的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产精品内射视频免费 | 亚洲精品国产a久久久久久 | 无码人妻av免费一区二区三区 | 人妻aⅴ无码一区二区三区 | 免费观看激色视频网站 | 国产两女互慰高潮视频在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 久久久久成人精品免费播放动漫 | 麻豆精产国品 | 人人妻人人澡人人爽欧美精品 | 性色欲情网站iwww九文堂 | 无码人妻精品一区二区三区不卡 | 全黄性性激高免费视频 | 欧美性生交xxxxx久久久 | 亚洲乱码中文字幕在线 | www国产亚洲精品久久网站 | 一个人免费观看的www视频 | 婷婷六月久久综合丁香 | 国内揄拍国内精品人妻 | 99久久久无码国产精品免费 | 精品久久久中文字幕人妻 | 狠狠色噜噜狠狠狠狠7777米奇 | 人妻少妇精品视频专区 | 亚洲精品国偷拍自产在线观看蜜桃 | 老太婆性杂交欧美肥老太 | 国产亚洲美女精品久久久2020 | 国产人妻精品午夜福利免费 | av无码电影一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 日本护士xxxxhd少妇 | 久青草影院在线观看国产 | 国内精品一区二区三区不卡 | 99er热精品视频 | 精品无码一区二区三区的天堂 | 丰满人妻翻云覆雨呻吟视频 | 大地资源网第二页免费观看 | 中文字幕精品av一区二区五区 | 在线播放亚洲第一字幕 | 狂野欧美性猛xxxx乱大交 | 久久综合给合久久狠狠狠97色 | 国产精品毛多多水多 | www国产亚洲精品久久久日本 | 亚洲精品国偷拍自产在线观看蜜桃 | 少妇高潮一区二区三区99 | 久久精品国产一区二区三区肥胖 | 成人精品一区二区三区中文字幕 | 色欲综合久久中文字幕网 | 国产在线aaa片一区二区99 | 久久精品中文闷骚内射 | 狠狠色噜噜狠狠狠狠7777米奇 | 激情五月综合色婷婷一区二区 | 一本色道久久综合狠狠躁 | 国产性生大片免费观看性 | 亚洲中文字幕无码一久久区 | 99精品视频在线观看免费 | 国产美女精品一区二区三区 | 色五月丁香五月综合五月 | 人妻体内射精一区二区三四 | 激情内射亚州一区二区三区爱妻 | 一本无码人妻在中文字幕免费 | 久久久久99精品国产片 | 亚洲精品无码人妻无码 | 色偷偷人人澡人人爽人人模 | 无码国内精品人妻少妇 | 午夜时刻免费入口 | 午夜不卡av免费 一本久久a久久精品vr综合 | 67194成是人免费无码 | 巨爆乳无码视频在线观看 | 亚洲色欲色欲天天天www | 精品无人区无码乱码毛片国产 | 国产亚洲精品久久久久久久久动漫 | 中国女人内谢69xxxx | 国产精品国产三级国产专播 | 小sao货水好多真紧h无码视频 | 天堂亚洲免费视频 | 97久久精品无码一区二区 | 一本色道婷婷久久欧美 | 国产极品视觉盛宴 | 亚洲精品综合一区二区三区在线 | 在线观看欧美一区二区三区 | 婷婷综合久久中文字幕蜜桃三电影 | 精品无码一区二区三区的天堂 | 老熟女乱子伦 | 国产成人无码午夜视频在线观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 伊人色综合久久天天小片 | 疯狂三人交性欧美 | 人人妻人人澡人人爽欧美一区九九 | 亚洲无人区一区二区三区 | 内射欧美老妇wbb | 日韩人妻少妇一区二区三区 | 免费人成网站视频在线观看 | 亚洲中文字幕在线无码一区二区 | 亚洲欧美国产精品专区久久 | 国产舌乚八伦偷品w中 | 亚洲综合另类小说色区 | 久久午夜无码鲁丝片秋霞 | 一本色道婷婷久久欧美 | 国产无av码在线观看 | 四十如虎的丰满熟妇啪啪 | 少妇无码一区二区二三区 | 野狼第一精品社区 | 美女张开腿让人桶 | 永久黄网站色视频免费直播 | 精品久久久无码人妻字幂 | 日本精品少妇一区二区三区 | 亚洲日韩av一区二区三区中文 | 亚洲伊人久久精品影院 | 精品日本一区二区三区在线观看 | 国产精品久久久久久亚洲影视内衣 | 思思久久99热只有频精品66 | 国精品人妻无码一区二区三区蜜柚 | 欧美激情综合亚洲一二区 | 妺妺窝人体色www婷婷 | 欧美国产亚洲日韩在线二区 | 男女性色大片免费网站 | 六月丁香婷婷色狠狠久久 | 女人高潮内射99精品 | 国产区女主播在线观看 | 内射欧美老妇wbb | 亚洲色无码一区二区三区 | 日韩无套无码精品 | 欧美国产亚洲日韩在线二区 | 影音先锋中文字幕无码 | 日韩人妻系列无码专区 | 99久久亚洲精品无码毛片 | 5858s亚洲色大成网站www | www国产精品内射老师 | 色一情一乱一伦一区二区三欧美 | 久久精品国产一区二区三区 | 国产 浪潮av性色四虎 | 亚洲欧洲中文日韩av乱码 | 久久久久久久久蜜桃 | 无码毛片视频一区二区本码 | 日韩在线不卡免费视频一区 | 蜜桃臀无码内射一区二区三区 | 麻豆蜜桃av蜜臀av色欲av | 免费看男女做好爽好硬视频 | 粗大的内捧猛烈进出视频 | 无码吃奶揉捏奶头高潮视频 | 76少妇精品导航 | 激情人妻另类人妻伦 | 亚洲の无码国产の无码影院 | 亚洲国产一区二区三区在线观看 | 少妇无码av无码专区在线观看 | 免费观看又污又黄的网站 | 欧美刺激性大交 | 特大黑人娇小亚洲女 | 波多野结衣乳巨码无在线观看 | 波多野结衣高清一区二区三区 | 久久久久国色av免费观看性色 | 日韩欧美中文字幕在线三区 | 熟女少妇在线视频播放 | 精品水蜜桃久久久久久久 | 国产午夜福利100集发布 | 无码av中文字幕免费放 | 精品人妻中文字幕有码在线 | 老子影院午夜精品无码 | 久久午夜无码鲁丝片午夜精品 | 娇妻被黑人粗大高潮白浆 | 澳门永久av免费网站 | 18无码粉嫩小泬无套在线观看 | 国内精品九九久久久精品 | 欧美野外疯狂做受xxxx高潮 | 久久99久久99精品中文字幕 | 一区二区三区乱码在线 | 欧洲 | 亚洲中文字幕无码一久久区 | 99精品国产综合久久久久五月天 | 亚洲第一无码av无码专区 | aⅴ在线视频男人的天堂 | 麻豆精品国产精华精华液好用吗 | 国产成人无码午夜视频在线观看 | 国产成人无码专区 | 国产特级毛片aaaaaaa高清 | 成人无码视频免费播放 | 国产精品鲁鲁鲁 | 欧美喷潮久久久xxxxx | 日本大乳高潮视频在线观看 | 国产av无码专区亚洲a∨毛片 | 理论片87福利理论电影 | 国产又爽又黄又刺激的视频 | 国产午夜精品一区二区三区嫩草 | 国产无遮挡吃胸膜奶免费看 | 国产午夜福利亚洲第一 | 久久精品视频在线看15 | 伊人久久大香线蕉午夜 | 在线播放亚洲第一字幕 | 国产人妻人伦精品1国产丝袜 | 精品国精品国产自在久国产87 | a片在线免费观看 | 国内少妇偷人精品视频免费 | 狠狠色色综合网站 | a片免费视频在线观看 | 丰满少妇女裸体bbw | 欧美高清在线精品一区 | 男女猛烈xx00免费视频试看 | 国内精品人妻无码久久久影院蜜桃 | 久久精品中文闷骚内射 | 色偷偷人人澡人人爽人人模 | 男人扒开女人内裤强吻桶进去 | 免费无码午夜福利片69 | 成人免费视频一区二区 | 麻豆精产国品 | 日日橹狠狠爱欧美视频 | 精品偷自拍另类在线观看 | 国产精品资源一区二区 | 国产成人精品一区二区在线小狼 | 男女作爱免费网站 | 无码国内精品人妻少妇 | 在线观看国产一区二区三区 | 国产亚洲人成a在线v网站 | 成人无码精品一区二区三区 | 久久视频在线观看精品 | 亚洲国产精品一区二区第一页 | 东北女人啪啪对白 | 国产成人精品一区二区在线小狼 | 国产真实伦对白全集 | 女人高潮内射99精品 | 亚洲国产精品久久久天堂 | 久久久精品456亚洲影院 | www国产精品内射老师 | 丝袜 中出 制服 人妻 美腿 | 国产精品永久免费视频 | 日韩精品久久久肉伦网站 | 色欲综合久久中文字幕网 | 在线а√天堂中文官网 | 中文亚洲成a人片在线观看 | 国产成人无码av片在线观看不卡 | 欧美真人作爱免费视频 | 人妻与老人中文字幕 | 国产一区二区三区日韩精品 | 无码精品人妻一区二区三区av | 成人无码视频免费播放 | 一本大道久久东京热无码av | 99久久99久久免费精品蜜桃 | 免费国产黄网站在线观看 | 永久免费观看美女裸体的网站 | 图片小说视频一区二区 | 超碰97人人做人人爱少妇 | 内射白嫩少妇超碰 | 欧美老妇交乱视频在线观看 | 亚洲色欲久久久综合网东京热 | 欧美xxxx黑人又粗又长 | 偷窥日本少妇撒尿chinese | 国产精品人妻一区二区三区四 | 国产一区二区三区四区五区加勒比 | 色欲av亚洲一区无码少妇 | 国产偷自视频区视频 | 日韩精品无码一区二区中文字幕 | 国产精品嫩草久久久久 | 免费无码午夜福利片69 | 精品无码一区二区三区爱欲 | 天天拍夜夜添久久精品 | 欧美35页视频在线观看 | 国产精品视频免费播放 | 久久婷婷五月综合色国产香蕉 | 精品人妻中文字幕有码在线 | 1000部夫妻午夜免费 | 国产农村妇女高潮大叫 | 成人无码影片精品久久久 | 一区二区传媒有限公司 | 色综合久久88色综合天天 | 小sao货水好多真紧h无码视频 | 东京热男人av天堂 | 性色欲网站人妻丰满中文久久不卡 | 牲交欧美兽交欧美 | 精品国产成人一区二区三区 | 自拍偷自拍亚洲精品10p | 天堂а√在线中文在线 | 亚洲呦女专区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产99久久精品一区二区 | 4hu四虎永久在线观看 | 亚洲精品欧美二区三区中文字幕 | 久久久久久九九精品久 | 国产av无码专区亚洲a∨毛片 | 国产av无码专区亚洲awww | 99久久无码一区人妻 | 九月婷婷人人澡人人添人人爽 | 国产精品.xx视频.xxtv | 亚洲精品美女久久久久久久 | 亚洲精品一区二区三区四区五区 | 国产亚洲人成在线播放 | 中文亚洲成a人片在线观看 | 巨爆乳无码视频在线观看 | 久久久精品456亚洲影院 | 国产免费久久久久久无码 | 国产三级久久久精品麻豆三级 | 丰满少妇人妻久久久久久 | 国产人妻人伦精品1国产丝袜 | 大胆欧美熟妇xx | 亚洲 日韩 欧美 成人 在线观看 | 久久伊人色av天堂九九小黄鸭 | 亚洲欧美国产精品久久 | 国内老熟妇对白xxxxhd | 国产色精品久久人妻 | 对白脏话肉麻粗话av | av在线亚洲欧洲日产一区二区 | 欧洲vodafone精品性 | 欧美精品无码一区二区三区 | 精品无码一区二区三区爱欲 | 全球成人中文在线 | 亚洲精品成人av在线 | 波多野结衣一区二区三区av免费 | 欧美丰满熟妇xxxx性ppx人交 | 性欧美牲交在线视频 | 中文字幕无码av激情不卡 | 色情久久久av熟女人妻网站 | 国产内射老熟女aaaa | 久久久成人毛片无码 | 亚洲综合色区中文字幕 | 欧美成人家庭影院 | 亚洲成av人片在线观看无码不卡 | 亚洲午夜福利在线观看 | 无人区乱码一区二区三区 | 55夜色66夜色国产精品视频 | 少妇愉情理伦片bd | 乱人伦人妻中文字幕无码 | 无人区乱码一区二区三区 | 亚洲人亚洲人成电影网站色 | 亚洲精品国产品国语在线观看 | 国产人妻大战黑人第1集 | 又紧又大又爽精品一区二区 | 日韩精品一区二区av在线 | 欧美真人作爱免费视频 | 少妇被黑人到高潮喷出白浆 | 18精品久久久无码午夜福利 | 无码一区二区三区在线 | 日本熟妇人妻xxxxx人hd | 天堂在线观看www | 毛片内射-百度 | 国产一区二区三区日韩精品 | 久久精品中文字幕大胸 | 久久精品国产日本波多野结衣 | 国产午夜亚洲精品不卡下载 | 丰满妇女强制高潮18xxxx | 日本一区二区更新不卡 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲国产精品久久人人爱 | 巨爆乳无码视频在线观看 | 麻豆人妻少妇精品无码专区 | 天天躁夜夜躁狠狠是什么心态 | 欧美成人家庭影院 | 性生交大片免费看l | 又紧又大又爽精品一区二区 | 免费播放一区二区三区 | 亚洲精品美女久久久久久久 | 最新国产麻豆aⅴ精品无码 | 久久久久国色av免费观看性色 | 国产精品.xx视频.xxtv | 日本大香伊一区二区三区 | 天堂亚洲免费视频 | 久久亚洲国产成人精品性色 | 久久国产精品精品国产色婷婷 | 香港三级日本三级妇三级 | 日日躁夜夜躁狠狠躁 | 在线a亚洲视频播放在线观看 | 亚洲欧美国产精品久久 | 久9re热视频这里只有精品 | 男女超爽视频免费播放 | 免费国产成人高清在线观看网站 | 亚洲精品一区二区三区在线观看 | 无码国产乱人伦偷精品视频 | 桃花色综合影院 | 国产午夜亚洲精品不卡下载 | 日本精品人妻无码免费大全 | 色欲av亚洲一区无码少妇 | 国产精品高潮呻吟av久久4虎 | 日本一区二区三区免费播放 | 国产热a欧美热a在线视频 | 99精品视频在线观看免费 | 欧美日韩久久久精品a片 | 亚洲欧美综合区丁香五月小说 | 亚洲日本va中文字幕 | 亚洲一区二区三区无码久久 | 免费视频欧美无人区码 | 两性色午夜免费视频 | 久久久久亚洲精品男人的天堂 | 中国女人内谢69xxxxxa片 | 少妇高潮喷潮久久久影院 | 国产精品亚洲五月天高清 | 一本久道久久综合婷婷五月 | 荫蒂添的好舒服视频囗交 | 亚洲成a人片在线观看日本 | 亚洲欧美精品aaaaaa片 | 国产办公室秘书无码精品99 | 蜜臀aⅴ国产精品久久久国产老师 | 日本丰满熟妇videos | 狠狠色丁香久久婷婷综合五月 | 无码吃奶揉捏奶头高潮视频 | 欧美人与动性行为视频 | 日韩 欧美 动漫 国产 制服 | 一本无码人妻在中文字幕免费 | √天堂中文官网8在线 | 在线精品国产一区二区三区 | 色欲综合久久中文字幕网 | 亚洲熟悉妇女xxx妇女av | 在线观看国产午夜福利片 | 成在人线av无码免费 | 俺去俺来也在线www色官网 | 国产片av国语在线观看 | 无码一区二区三区在线 | 国产精品亚洲五月天高清 | 夜精品a片一区二区三区无码白浆 | 牲交欧美兽交欧美 | 欧美精品无码一区二区三区 | 亚洲经典千人经典日产 | 噜噜噜亚洲色成人网站 | 精品乱子伦一区二区三区 | 精品偷拍一区二区三区在线看 | aⅴ在线视频男人的天堂 | 丝袜美腿亚洲一区二区 | 亚洲人成网站在线播放942 | 人人妻人人澡人人爽人人精品浪潮 | 久久久久成人精品免费播放动漫 | 国产精品人人爽人人做我的可爱 | www成人国产高清内射 | 免费网站看v片在线18禁无码 | 女人被爽到呻吟gif动态图视看 | 久久www免费人成人片 | 亚洲啪av永久无码精品放毛片 | 丰满人妻翻云覆雨呻吟视频 | 人妻少妇精品视频专区 | 日日干夜夜干 | 精品国产av色一区二区深夜久久 | 免费观看黄网站 | 午夜精品一区二区三区的区别 | 97精品人妻一区二区三区香蕉 | 波多野结衣高清一区二区三区 | 国产在线aaa片一区二区99 | 国产明星裸体无码xxxx视频 | 国产欧美亚洲精品a | 亚洲熟妇色xxxxx欧美老妇 | 国产成人无码区免费内射一片色欲 | 久久国产精品偷任你爽任你 | 久久精品国产大片免费观看 | 扒开双腿吃奶呻吟做受视频 | 亚洲国产精品无码一区二区三区 | 亚洲无人区一区二区三区 | 国产九九九九九九九a片 | 亚洲欧美精品伊人久久 | 四虎国产精品一区二区 | 精品国产一区av天美传媒 | 国产女主播喷水视频在线观看 | 亚洲国产一区二区三区在线观看 | 青春草在线视频免费观看 | 国产成人亚洲综合无码 | 国产黄在线观看免费观看不卡 | 麻豆国产丝袜白领秘书在线观看 | 99精品无人区乱码1区2区3区 | 久久午夜无码鲁丝片秋霞 | 奇米影视7777久久精品人人爽 | 夜夜躁日日躁狠狠久久av | 天天做天天爱天天爽综合网 | 亚洲精品久久久久avwww潮水 | 精品一区二区不卡无码av | 蜜臀av在线播放 久久综合激激的五月天 | 国产精品久久国产精品99 | 曰韩无码二三区中文字幕 | 波多野结衣av一区二区全免费观看 | 久久久久久av无码免费看大片 | 少妇太爽了在线观看 | 色妞www精品免费视频 | 国精品人妻无码一区二区三区蜜柚 | 300部国产真实乱 | 激情亚洲一区国产精品 | 国产又爽又黄又刺激的视频 | 国产亚洲精品久久久久久 | 少妇人妻大乳在线视频 | 欧美变态另类xxxx | 一本色道久久综合狠狠躁 | 国产精品99久久精品爆乳 | 国产亚洲tv在线观看 | 亚洲午夜无码久久 | 亚洲人成人无码网www国产 | 婷婷六月久久综合丁香 | 国产色xx群视频射精 | 午夜不卡av免费 一本久久a久久精品vr综合 | 色综合久久久无码中文字幕 | 久久亚洲中文字幕精品一区 | 亚洲人成网站在线播放942 | 成人免费视频在线观看 | 性色av无码免费一区二区三区 | 成人动漫在线观看 | 亚洲一区二区三区香蕉 | 天下第一社区视频www日本 | 日本又色又爽又黄的a片18禁 | 狠狠噜狠狠狠狠丁香五月 | 偷窥村妇洗澡毛毛多 | 人人妻人人澡人人爽人人精品浪潮 | 国产成人无码av一区二区 | 久久久久久亚洲精品a片成人 | 亚洲国产午夜精品理论片 | 丰满少妇高潮惨叫视频 | 亚洲午夜久久久影院 | 国产av无码专区亚洲a∨毛片 | 色综合视频一区二区三区 | 无码av免费一区二区三区试看 | 少妇性l交大片欧洲热妇乱xxx | 亚洲精品午夜无码电影网 | 中文字幕乱码人妻无码久久 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲欧美日韩综合久久久 | 风流少妇按摩来高潮 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 日本一区二区三区免费高清 | 国产三级精品三级男人的天堂 | 国产精品内射视频免费 | 亚洲s码欧洲m码国产av | 亚洲一区av无码专区在线观看 | 欧美 亚洲 国产 另类 | 鲁一鲁av2019在线 | 成年女人永久免费看片 | 国产成人无码一二三区视频 | 国产在线精品一区二区高清不卡 | 中文字幕人妻无码一区二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲欧美日韩综合久久久 | 欧美国产日产一区二区 | 国产无套粉嫩白浆在线 | 樱花草在线播放免费中文 | 人妻有码中文字幕在线 | www一区二区www免费 | 成熟人妻av无码专区 | 国产成人无码a区在线观看视频app | 国产成人一区二区三区在线观看 | 伊在人天堂亚洲香蕉精品区 | 亚拍精品一区二区三区探花 | av香港经典三级级 在线 | 岛国片人妻三上悠亚 | 国产精品久久久久久久9999 | 曰本女人与公拘交酡免费视频 | 亚洲伊人久久精品影院 | 国精产品一品二品国精品69xx | 亚洲中文字幕成人无码 | 在线观看免费人成视频 | 欧美日本精品一区二区三区 | 中文字幕无码免费久久99 | 亚洲精品午夜无码电影网 | 国产av无码专区亚洲a∨毛片 | 人人妻人人藻人人爽欧美一区 | 亚洲欧美日韩国产精品一区二区 | 丰满少妇人妻久久久久久 | 东北女人啪啪对白 | 日本在线高清不卡免费播放 | 日本爽爽爽爽爽爽在线观看免 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 丰满人妻被黑人猛烈进入 | 久久亚洲精品中文字幕无男同 | 国产精品二区一区二区aⅴ污介绍 | 亚洲精品中文字幕乱码 | 免费无码一区二区三区蜜桃大 | 国产猛烈高潮尖叫视频免费 | 久久久久久国产精品无码下载 | 秋霞特色aa大片 | 欧美黑人巨大xxxxx | 高潮毛片无遮挡高清免费 | 免费国产黄网站在线观看 | 亚洲色在线无码国产精品不卡 | 国产成人综合色在线观看网站 | 国产欧美精品一区二区三区 | 色综合久久中文娱乐网 | 综合人妻久久一区二区精品 | 欧美变态另类xxxx | 18禁止看的免费污网站 | 性欧美牲交xxxxx视频 | 国产深夜福利视频在线 | 在线成人www免费观看视频 | 在线观看国产午夜福利片 | 精品欧洲av无码一区二区三区 | 激情内射日本一区二区三区 | 99久久无码一区人妻 | 中文字幕 亚洲精品 第1页 | 久久精品女人的天堂av | 成人欧美一区二区三区黑人 | 无人区乱码一区二区三区 | 亚洲国产av精品一区二区蜜芽 | 欧美变态另类xxxx | 人人澡人人透人人爽 | 正在播放东北夫妻内射 | 麻豆av传媒蜜桃天美传媒 | 久久99精品久久久久久动态图 | 国产精品久久久久久无码 | 亚洲精品一区二区三区在线观看 | 国产三级久久久精品麻豆三级 | 最近免费中文字幕中文高清百度 | 欧美 亚洲 国产 另类 | 成 人影片 免费观看 | 国产又粗又硬又大爽黄老大爷视 | 精品国产aⅴ无码一区二区 | 欧美喷潮久久久xxxxx | 亚洲精品成a人在线观看 | 国产av无码专区亚洲awww | 精品无码一区二区三区爱欲 | 日韩在线不卡免费视频一区 | 少妇被粗大的猛进出69影院 | 女高中生第一次破苞av | 无码人中文字幕 | 亚洲码国产精品高潮在线 | 乱人伦人妻中文字幕无码久久网 | 小鲜肉自慰网站xnxx | 亚洲色偷偷偷综合网 | 在线天堂新版最新版在线8 | 日本乱偷人妻中文字幕 | 久久精品视频在线看15 | 亚洲人成影院在线观看 | 乱中年女人伦av三区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲码国产精品高潮在线 | 国产色在线 | 国产 | 少妇性l交大片欧洲热妇乱xxx | 大肉大捧一进一出视频出来呀 | 亚洲欧美色中文字幕在线 | 色婷婷av一区二区三区之红樱桃 | 亚洲国产精品毛片av不卡在线 | 亚欧洲精品在线视频免费观看 | 日韩人妻无码一区二区三区久久99 | 内射巨臀欧美在线视频 | 国产精品美女久久久久av爽李琼 | 四虎4hu永久免费 | 国产成人精品无码播放 | 久久精品人人做人人综合试看 | 国产精品亚洲а∨无码播放麻豆 | 老熟妇乱子伦牲交视频 | 欧美熟妇另类久久久久久多毛 | 欧美 日韩 亚洲 在线 | 一个人免费观看的www视频 | 中文字幕日韩精品一区二区三区 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 久久精品成人欧美大片 | 美女毛片一区二区三区四区 | 久久视频在线观看精品 | 午夜精品一区二区三区在线观看 | 成熟女人特级毛片www免费 | 亚洲一区二区三区在线观看网站 | 黑人巨大精品欧美一区二区 | 日本又色又爽又黄的a片18禁 | 久久人人爽人人爽人人片av高清 | 麻豆国产丝袜白领秘书在线观看 | 成人aaa片一区国产精品 | 久久久久免费精品国产 | 日本大乳高潮视频在线观看 | 内射欧美老妇wbb | 精品熟女少妇av免费观看 | 日韩精品无码一本二本三本色 | 亚洲区欧美区综合区自拍区 | 久久综合给合久久狠狠狠97色 | 曰本女人与公拘交酡免费视频 | 中文无码伦av中文字幕 | 丰满人妻翻云覆雨呻吟视频 | 1000部啪啪未满十八勿入下载 | 夜夜躁日日躁狠狠久久av | 国产亚洲美女精品久久久2020 | 久久综合狠狠综合久久综合88 | 99久久久无码国产aaa精品 | 亚洲综合色区中文字幕 | 国产精品毛片一区二区 | 88国产精品欧美一区二区三区 | 久久久精品国产sm最大网站 | 一区二区三区高清视频一 | 色一情一乱一伦一区二区三欧美 | 九九在线中文字幕无码 | 人妻aⅴ无码一区二区三区 | 欧美精品国产综合久久 | 天天拍夜夜添久久精品大 | 亚洲精品国偷拍自产在线麻豆 | 国产黑色丝袜在线播放 | 中文字幕人妻无码一夲道 | 欧美激情一区二区三区成人 | 国产亚洲精品久久久久久 | 中文字幕中文有码在线 | 丰满少妇女裸体bbw | 久久久久av无码免费网 | 久久综合九色综合97网 | 国产区女主播在线观看 | 亚洲色欲色欲欲www在线 | 中文字幕无码视频专区 | 色老头在线一区二区三区 | 免费无码一区二区三区蜜桃大 | 一本久久a久久精品亚洲 | 久久久国产一区二区三区 | 欧美亚洲日韩国产人成在线播放 | 亚洲综合伊人久久大杳蕉 | 亚洲国产av美女网站 | 国产suv精品一区二区五 | 最近的中文字幕在线看视频 | 亚洲国产成人a精品不卡在线 | 久久综合九色综合97网 | 5858s亚洲色大成网站www | 成年美女黄网站色大免费视频 | 无码国产乱人伦偷精品视频 | 久久国产精品偷任你爽任你 | 精品无码成人片一区二区98 | 午夜福利一区二区三区在线观看 | 亚洲精品成人av在线 | 好爽又高潮了毛片免费下载 | 无码国产激情在线观看 | 午夜精品久久久内射近拍高清 | 欧美freesex黑人又粗又大 | 精品国产乱码久久久久乱码 | 国产综合久久久久鬼色 | 永久免费观看美女裸体的网站 | 真人与拘做受免费视频一 | 国产乱码精品一品二品 | 九九综合va免费看 | 婷婷综合久久中文字幕蜜桃三电影 | 久久亚洲日韩精品一区二区三区 | 亚洲aⅴ无码成人网站国产app | 精品国产一区av天美传媒 | 久久久精品成人免费观看 | 亚洲精品国偷拍自产在线麻豆 | 中文字幕中文有码在线 | 色欲av亚洲一区无码少妇 | 女人和拘做爰正片视频 | 图片小说视频一区二区 | 日日噜噜噜噜夜夜爽亚洲精品 | 熟妇女人妻丰满少妇中文字幕 | 精品国产aⅴ无码一区二区 | 亚洲欧美色中文字幕在线 | 色五月五月丁香亚洲综合网 | 无码人妻出轨黑人中文字幕 | 国产精品久久国产三级国 | 亚洲人成无码网www | 亚洲国产精品美女久久久久 | 国产性生交xxxxx无码 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲精品一区二区三区在线观看 | 亚洲热妇无码av在线播放 | 女人被爽到呻吟gif动态图视看 | 久久久久se色偷偷亚洲精品av | 天天爽夜夜爽夜夜爽 | 久久久久免费看成人影片 | 18禁止看的免费污网站 | 久久婷婷五月综合色国产香蕉 | 亚洲国产高清在线观看视频 | 图片小说视频一区二区 | 亚洲国产综合无码一区 | 国内精品九九久久久精品 | 亚洲日韩精品欧美一区二区 | 国产午夜福利100集发布 | 亚洲s码欧洲m码国产av | 国产香蕉尹人视频在线 | 亚洲中文字幕成人无码 | 伊人久久大香线蕉av一区二区 | 精品无码一区二区三区的天堂 | av在线亚洲欧洲日产一区二区 | 乱人伦人妻中文字幕无码久久网 | 爆乳一区二区三区无码 | 99麻豆久久久国产精品免费 | 亲嘴扒胸摸屁股激烈网站 | 国产精品无码一区二区桃花视频 | 在线观看免费人成视频 | 十八禁真人啪啪免费网站 | 成人免费无码大片a毛片 | 性生交大片免费看l | 欧美人与牲动交xxxx | 亚洲aⅴ无码成人网站国产app | 亚洲欧美综合区丁香五月小说 | 亚洲男人av天堂午夜在 | 亚洲自偷精品视频自拍 | 日韩精品乱码av一区二区 | 综合人妻久久一区二区精品 | 男人扒开女人内裤强吻桶进去 | 久久国产精品精品国产色婷婷 | 无码福利日韩神码福利片 | 大地资源中文第3页 | 精品偷拍一区二区三区在线看 | 久久精品女人的天堂av | 国产尤物精品视频 | 国产情侣作爱视频免费观看 | 亚洲天堂2017无码 | 日本肉体xxxx裸交 | 黄网在线观看免费网站 | 日韩人妻无码一区二区三区久久99 | 亚洲春色在线视频 | 4hu四虎永久在线观看 | 成熟人妻av无码专区 | 亚洲成熟女人毛毛耸耸多 | 欧美亚洲日韩国产人成在线播放 | 国产做国产爱免费视频 | 成 人 网 站国产免费观看 | 亚洲一区二区三区播放 | 亚洲乱码国产乱码精品精 | 小泽玛莉亚一区二区视频在线 | 永久免费观看国产裸体美女 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产真实乱对白精彩久久 | 亚洲色在线无码国产精品不卡 | 一本久久a久久精品亚洲 | 精品 日韩 国产 欧美 视频 | 中文无码精品a∨在线观看不卡 | 中文字幕无码免费久久99 | 国精产品一品二品国精品69xx | 波多野结衣高清一区二区三区 | 麻豆md0077饥渴少妇 | 国产精品久久精品三级 | 亚洲性无码av中文字幕 | 日本精品久久久久中文字幕 | 18禁黄网站男男禁片免费观看 | 大乳丰满人妻中文字幕日本 | 国产亚洲精品久久久ai换 | 亚洲国产欧美日韩精品一区二区三区 | 在线a亚洲视频播放在线观看 | 欧美国产日韩久久mv | 在线精品国产一区二区三区 | 亚洲综合在线一区二区三区 | 亚洲无人区一区二区三区 | 色情久久久av熟女人妻网站 | 香港三级日本三级妇三级 | 男女爱爱好爽视频免费看 | 久久综合激激的五月天 | 2020久久超碰国产精品最新 | 大色综合色综合网站 | 亚洲精品www久久久 | 日韩精品乱码av一区二区 | 国产人妻精品一区二区三区 | 久久久精品欧美一区二区免费 | 少妇性荡欲午夜性开放视频剧场 | 日日摸日日碰夜夜爽av | 狂野欧美性猛交免费视频 | 国产又爽又黄又刺激的视频 | 野外少妇愉情中文字幕 | 99精品无人区乱码1区2区3区 | 久久精品中文字幕大胸 | 亚无码乱人伦一区二区 | 日本爽爽爽爽爽爽在线观看免 | 免费看男女做好爽好硬视频 | 学生妹亚洲一区二区 | 麻豆md0077饥渴少妇 | 少妇邻居内射在线 | 亚洲一区二区三区无码久久 | 福利一区二区三区视频在线观看 | 国产精品久久久午夜夜伦鲁鲁 | 国产亚洲精品久久久久久国模美 | 欧美成人午夜精品久久久 | 亚洲国产精品久久久天堂 | 18黄暴禁片在线观看 | 精品国产av色一区二区深夜久久 | 最近免费中文字幕中文高清百度 | 欧美三级a做爰在线观看 | 妺妺窝人体色www婷婷 | 久久综合给久久狠狠97色 | 日本一卡2卡3卡四卡精品网站 | 又色又爽又黄的美女裸体网站 | 久久久久av无码免费网 | 美女毛片一区二区三区四区 | 亚洲爆乳大丰满无码专区 | 丰满人妻被黑人猛烈进入 | 色婷婷欧美在线播放内射 | av无码不卡在线观看免费 | 亚洲精品一区二区三区在线观看 | 午夜男女很黄的视频 | 精品人妻人人做人人爽夜夜爽 | 日本又色又爽又黄的a片18禁 | 未满成年国产在线观看 | 狠狠亚洲超碰狼人久久 | 国产成人久久精品流白浆 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日本丰满熟妇videos | 亚洲a无码综合a国产av中文 | 7777奇米四色成人眼影 | 国产精品99久久精品爆乳 | 最近的中文字幕在线看视频 | 激情内射亚州一区二区三区爱妻 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品 日韩 国产 欧美 视频 | 午夜男女很黄的视频 | 人妻与老人中文字幕 | 又黄又爽又色的视频 | 曰韩无码二三区中文字幕 | 特级做a爰片毛片免费69 | 无码人妻丰满熟妇区五十路百度 | 久久久久se色偷偷亚洲精品av | 性做久久久久久久久 | 欧美精品一区二区精品久久 | 少妇性荡欲午夜性开放视频剧场 | 伊人久久大香线蕉午夜 | 欧美黑人性暴力猛交喷水 | 国产人妻精品一区二区三区不卡 | 久久久久99精品成人片 | 国产97在线 | 亚洲 | 日欧一片内射va在线影院 | 日本爽爽爽爽爽爽在线观看免 | 国产莉萝无码av在线播放 | 日韩精品久久久肉伦网站 | 无码乱肉视频免费大全合集 | 久久这里只有精品视频9 | 无码福利日韩神码福利片 | 亚洲va中文字幕无码久久不卡 | 99精品久久毛片a片 | 99久久精品国产一区二区蜜芽 | 日产精品高潮呻吟av久久 | 亚洲a无码综合a国产av中文 | 亚洲一区二区三区在线观看网站 | 国产真实乱对白精彩久久 | 一本加勒比波多野结衣 | 激情亚洲一区国产精品 | 鲁一鲁av2019在线 | 国产香蕉尹人视频在线 | 成人免费视频视频在线观看 免费 | 在线a亚洲视频播放在线观看 | 曰韩少妇内射免费播放 | 成人动漫在线观看 | 国产精品亚洲综合色区韩国 | 377p欧洲日本亚洲大胆 | 高潮喷水的毛片 | 成人免费视频在线观看 | 亚洲精品无码国产 | 亚洲国产成人av在线观看 | 香港三级日本三级妇三级 | 精品无码一区二区三区爱欲 | 性欧美videos高清精品 | 亚洲欧美综合区丁香五月小说 | 一本色道久久综合狠狠躁 | 久久久成人毛片无码 | 国产人妻精品一区二区三区不卡 | 亚洲国产欧美在线成人 | 狠狠躁日日躁夜夜躁2020 | 亚洲中文字幕成人无码 | 精品午夜福利在线观看 | 精品无码一区二区三区爱欲 | 亚洲欧美中文字幕5发布 | 麻豆国产97在线 | 欧洲 | 国产真实伦对白全集 | aⅴ在线视频男人的天堂 | 色一情一乱一伦一区二区三欧美 | 少妇性l交大片欧洲热妇乱xxx | 丰满护士巨好爽好大乳 | 99久久精品国产一区二区蜜芽 | 亚洲欧洲日本综合aⅴ在线 | 内射爽无广熟女亚洲 | 欧美激情内射喷水高潮 | 天干天干啦夜天干天2017 | 少妇被粗大的猛进出69影院 | 男人和女人高潮免费网站 | 中文字幕无码av波多野吉衣 | 国产亚洲人成在线播放 | 99国产精品白浆在线观看免费 | 久久国产精品萌白酱免费 | 成人无码影片精品久久久 | 欧美日韩久久久精品a片 | 青青久在线视频免费观看 | 亚洲色无码一区二区三区 | 无码av中文字幕免费放 | 亚洲国产一区二区三区在线观看 | 亚洲gv猛男gv无码男同 | 亚洲成av人片天堂网无码】 | 久久午夜无码鲁丝片 | 成人无码精品一区二区三区 | 国产成人综合色在线观看网站 | 国产偷抇久久精品a片69 | 性欧美疯狂xxxxbbbb | 国产精品igao视频网 | 国产精品久久久久无码av色戒 | 成人无码精品一区二区三区 | 国产网红无码精品视频 | 精品夜夜澡人妻无码av蜜桃 | 樱花草在线播放免费中文 | 精品久久久久久亚洲精品 | 无码av中文字幕免费放 | 日本熟妇浓毛 | 无码av最新清无码专区吞精 | 中文字幕无码日韩欧毛 | 中文字幕无码日韩专区 | 人人澡人人妻人人爽人人蜜桃 | 成人三级无码视频在线观看 | 亚洲国产精品久久久久久 | 乱码午夜-极国产极内射 | 亚洲日韩av片在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 大胆欧美熟妇xx | 在线观看欧美一区二区三区 | 欧美 日韩 人妻 高清 中文 | 国精品人妻无码一区二区三区蜜柚 | 99精品国产综合久久久久五月天 | 乌克兰少妇xxxx做受 | 双乳奶水饱满少妇呻吟 | 夜精品a片一区二区三区无码白浆 | 国产精华av午夜在线观看 | 狠狠色欧美亚洲狠狠色www | 无码精品人妻一区二区三区av | 日本精品人妻无码免费大全 | 人妻人人添人妻人人爱 | 一本精品99久久精品77 | 亚洲自偷精品视频自拍 | 午夜丰满少妇性开放视频 | 特黄特色大片免费播放器图片 | 欧美午夜特黄aaaaaa片 | 中国女人内谢69xxxxxa片 | 国产精品久久久av久久久 | 无码毛片视频一区二区本码 | 日韩欧美中文字幕公布 | 精品一区二区三区波多野结衣 | 国精品人妻无码一区二区三区蜜柚 | 亚洲s码欧洲m码国产av | 中文字幕乱码亚洲无线三区 | 国产精品毛片一区二区 | 夜夜高潮次次欢爽av女 | 人妻少妇精品久久 | 四十如虎的丰满熟妇啪啪 | 99精品视频在线观看免费 | 任你躁在线精品免费 | 久久国产自偷自偷免费一区调 | 欧美自拍另类欧美综合图片区 | 亚洲欧美精品伊人久久 | 老熟女重囗味hdxx69 | 在线观看国产午夜福利片 | 亚洲欧美综合区丁香五月小说 | 亚洲va欧美va天堂v国产综合 | 四虎国产精品免费久久 | 国产精品无码一区二区三区不卡 | 国产片av国语在线观看 | 精品乱子伦一区二区三区 | 76少妇精品导航 | 人妻互换免费中文字幕 | 亚洲第一无码av无码专区 | 精品人人妻人人澡人人爽人人 | 欧美成人高清在线播放 | 男女爱爱好爽视频免费看 | 午夜男女很黄的视频 | 婷婷丁香六月激情综合啪 | 成人无码精品一区二区三区 | 亚洲精品久久久久avwww潮水 | 精品少妇爆乳无码av无码专区 | 国产在线aaa片一区二区99 | 伊在人天堂亚洲香蕉精品区 | 亚洲精品美女久久久久久久 | 国产黑色丝袜在线播放 | 日产精品99久久久久久 | 午夜精品久久久久久久 | 在线a亚洲视频播放在线观看 | 免费乱码人妻系列无码专区 | 窝窝午夜理论片影院 | 久久久久国色av免费观看性色 | 日韩成人一区二区三区在线观看 | 欧美黑人乱大交 | 国产av人人夜夜澡人人爽麻豆 | 97久久国产亚洲精品超碰热 | 一区二区三区乱码在线 | 欧洲 | 国产人妖乱国产精品人妖 | 伊在人天堂亚洲香蕉精品区 | 天干天干啦夜天干天2017 | 理论片87福利理论电影 | 亚洲爆乳精品无码一区二区三区 | 内射后入在线观看一区 | а天堂中文在线官网 | 亚洲国产精品久久久久久 | 亚洲精品成人av在线 | 亚洲日本va午夜在线电影 | 精品夜夜澡人妻无码av蜜桃 | 国内综合精品午夜久久资源 | 一个人看的视频www在线 | 久久久婷婷五月亚洲97号色 | 西西人体www44rt大胆高清 | 乌克兰少妇性做爰 | 精品久久久中文字幕人妻 | 我要看www免费看插插视频 | 樱花草在线播放免费中文 | 亚洲色成人中文字幕网站 | 国产无套内射久久久国产 | 国产人妻久久精品二区三区老狼 | 人妻熟女一区 | 亚洲乱码国产乱码精品精 | 无遮无挡爽爽免费视频 | 午夜福利电影 | 高清无码午夜福利视频 | 亚洲第一网站男人都懂 | 国产精品久久久av久久久 | 久久久精品456亚洲影院 | 国产97人人超碰caoprom | 兔费看少妇性l交大片免费 | 国产极品美女高潮无套在线观看 | 精品亚洲韩国一区二区三区 | 又湿又紧又大又爽a视频国产 | 成熟人妻av无码专区 | 曰本女人与公拘交酡免费视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 欧美第一黄网免费网站 | 久久天天躁狠狠躁夜夜免费观看 | 内射爽无广熟女亚洲 | 在线精品亚洲一区二区 | 一本大道伊人av久久综合 | 红桃av一区二区三区在线无码av | 亚洲天堂2017无码中文 | 午夜肉伦伦影院 | 俺去俺来也www色官网 | 丁香花在线影院观看在线播放 | 美女毛片一区二区三区四区 | 国产香蕉尹人视频在线 | 窝窝午夜理论片影院 | 日本肉体xxxx裸交 | 青草视频在线播放 | 人人爽人人爽人人片av亚洲 | 国精产品一品二品国精品69xx | 88国产精品欧美一区二区三区 | 伊人久久婷婷五月综合97色 | 少妇激情av一区二区 | 国产明星裸体无码xxxx视频 | 婷婷丁香六月激情综合啪 | 在线亚洲高清揄拍自拍一品区 | 久9re热视频这里只有精品 | 亚洲综合久久一区二区 | 国产午夜视频在线观看 | 免费观看又污又黄的网站 | 激情亚洲一区国产精品 | 久久精品人人做人人综合试看 | 成人毛片一区二区 | 天天躁日日躁狠狠躁免费麻豆 | 国内少妇偷人精品视频免费 | 久久精品中文字幕一区 | 久久综合香蕉国产蜜臀av | 国产亚av手机在线观看 | 欧美野外疯狂做受xxxx高潮 | 日韩无码专区 | 国产精品a成v人在线播放 | 九一九色国产 | 亚洲爆乳无码专区 | 国模大胆一区二区三区 | 久久综合狠狠综合久久综合88 | 免费网站看v片在线18禁无码 | 亚洲人成网站色7799 | 青草视频在线播放 | 伊人久久大香线焦av综合影院 | 一个人看的视频www在线 | 三上悠亚人妻中文字幕在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产亚洲美女精品久久久2020 | 国产午夜手机精彩视频 | 日日躁夜夜躁狠狠躁 | 天天拍夜夜添久久精品 | 伊在人天堂亚洲香蕉精品区 | 久久天天躁狠狠躁夜夜免费观看 | 欧美黑人性暴力猛交喷水 | 人妻天天爽夜夜爽一区二区 | 噜噜噜亚洲色成人网站 | 久久久久久国产精品无码下载 | 国内精品久久毛片一区二区 | 国内少妇偷人精品视频 | 亚洲成在人网站无码天堂 | 人妻中文无码久热丝袜 | 国内少妇偷人精品视频免费 | 在线播放亚洲第一字幕 | 三上悠亚人妻中文字幕在线 | 国产精品-区区久久久狼 | 欧美xxxxx精品 | 玩弄中年熟妇正在播放 | 亚洲人交乣女bbw | 18精品久久久无码午夜福利 | 亚洲春色在线视频 | 欧美日韩综合一区二区三区 | 午夜精品一区二区三区在线观看 | 精品一二三区久久aaa片 | 午夜福利一区二区三区在线观看 | 国产午夜精品一区二区三区嫩草 | 国产精品成人av在线观看 | 好男人www社区 | 永久免费观看国产裸体美女 | 99er热精品视频 | 丰满护士巨好爽好大乳 | 成人一区二区免费视频 | 日产精品高潮呻吟av久久 | 国精品人妻无码一区二区三区蜜柚 | 熟妇人妻无乱码中文字幕 | 宝宝好涨水快流出来免费视频 | 波多野结衣aⅴ在线 | 国产特级毛片aaaaaaa高清 | 久久综合给久久狠狠97色 | 蜜桃av抽搐高潮一区二区 | 亚洲精品欧美二区三区中文字幕 | 久久亚洲国产成人精品性色 | 国产午夜手机精彩视频 | 精品国产国产综合精品 | 久久www免费人成人片 | 国产97色在线 | 免 | 精品国产国产综合精品 | 国产真人无遮挡作爱免费视频 | 大肉大捧一进一出好爽视频 | 亚洲欧美日韩国产精品一区二区 | 免费无码的av片在线观看 | 香蕉久久久久久av成人 | 亚洲熟妇色xxxxx欧美老妇 | 性生交片免费无码看人 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲国产精品久久久久久 | av香港经典三级级 在线 | 国产人妻大战黑人第1集 | 国产一区二区不卡老阿姨 | 全球成人中文在线 | 国产av剧情md精品麻豆 | 国产xxx69麻豆国语对白 | 学生妹亚洲一区二区 | 久久久精品456亚洲影院 | 精品国产一区二区三区av 性色 | 高潮喷水的毛片 | 亚洲色欲久久久综合网东京热 | 国产综合色产在线精品 | 亚洲欧美国产精品专区久久 | 狠狠色噜噜狠狠狠7777奇米 | 在线a亚洲视频播放在线观看 | 日本一区二区三区免费高清 | 国产亚洲精品精品国产亚洲综合 | 日产国产精品亚洲系列 | 少妇的肉体aa片免费 | 亚洲精品成人av在线 | 无码人妻少妇伦在线电影 | 久久婷婷五月综合色国产香蕉 | 美女毛片一区二区三区四区 | 欧美性猛交xxxx富婆 | 无码精品国产va在线观看dvd | 人妻夜夜爽天天爽三区 | 久久国产精品萌白酱免费 | 成人动漫在线观看 | 999久久久国产精品消防器材 | 国产无套内射久久久国产 | 精品亚洲韩国一区二区三区 | 日韩精品无码一区二区中文字幕 | 风流少妇按摩来高潮 | 国产一区二区三区四区五区加勒比 | 国产精品怡红院永久免费 | 超碰97人人做人人爱少妇 | 亚洲精品一区二区三区四区五区 | 女人色极品影院 | 亚洲欧美国产精品专区久久 | 99久久无码一区人妻 | 国产无遮挡吃胸膜奶免费看 | 婷婷五月综合缴情在线视频 | √天堂中文官网8在线 | 国产午夜福利100集发布 | 色综合久久久久综合一本到桃花网 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 岛国片人妻三上悠亚 | 日本大乳高潮视频在线观看 | 国产亚洲人成a在线v网站 | 久久久亚洲欧洲日产国码αv | 男女超爽视频免费播放 | 色综合久久中文娱乐网 | 久久国产36精品色熟妇 | 国产美女极度色诱视频www | 免费观看又污又黄的网站 | 亚洲综合精品香蕉久久网 | 日韩av激情在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 久在线观看福利视频 | 久久亚洲精品成人无码 | 欧美日韩精品 | 亚洲高清偷拍一区二区三区 | 人妻与老人中文字幕 | 性生交片免费无码看人 | 国产口爆吞精在线视频 | 图片区 小说区 区 亚洲五月 | 丝袜人妻一区二区三区 | 国产乡下妇女做爰 | 国产精品无码一区二区三区不卡 | 国产精品亚洲а∨无码播放麻豆 | 真人与拘做受免费视频 | 国产精品丝袜黑色高跟鞋 | 日本一卡2卡3卡四卡精品网站 | 色综合久久久无码中文字幕 | 一本久久伊人热热精品中文字幕 | 任你躁在线精品免费 | 亚洲精品一区二区三区四区五区 | 国产三级久久久精品麻豆三级 | 国产凸凹视频一区二区 | 久久午夜夜伦鲁鲁片无码免费 | 日产精品99久久久久久 | 国产综合色产在线精品 | 天干天干啦夜天干天2017 | 免费观看的无遮挡av | 国产精品久久久久久无码 | 日本一区二区更新不卡 | 久久久久久av无码免费看大片 | 激情国产av做激情国产爱 | 成人欧美一区二区三区黑人免费 | 野外少妇愉情中文字幕 | 人人妻人人澡人人爽欧美一区 | 又湿又紧又大又爽a视频国产 | 人人妻人人澡人人爽欧美精品 | 对白脏话肉麻粗话av | 免费观看又污又黄的网站 | 熟女俱乐部五十路六十路av | 国产av人人夜夜澡人人爽麻豆 | 亚洲中文字幕久久无码 | 久久综合狠狠综合久久综合88 | 无码乱肉视频免费大全合集 | 久久精品国产99精品亚洲 | 超碰97人人做人人爱少妇 | 亚洲成a人片在线观看无码 | 国产精品久久久久7777 | 曰本女人与公拘交酡免费视频 | 国产精品沙发午睡系列 | 久久国产劲爆∧v内射 | 国产乱子伦视频在线播放 | 色综合久久久无码中文字幕 | 无码av免费一区二区三区试看 | 黄网在线观看免费网站 | 中文字幕乱妇无码av在线 | 午夜无码区在线观看 | 少妇性荡欲午夜性开放视频剧场 | 思思久久99热只有频精品66 | 中文字幕 亚洲精品 第1页 | 欧美性色19p | 人妻少妇精品无码专区二区 | 亚洲日本一区二区三区在线 | 久久久国产精品无码免费专区 | 激情人妻另类人妻伦 | 无码吃奶揉捏奶头高潮视频 | 麻豆国产人妻欲求不满谁演的 | 超碰97人人做人人爱少妇 | 国产熟妇高潮叫床视频播放 | 亚洲最大成人网站 | 偷窥日本少妇撒尿chinese | 免费男性肉肉影院 | 女人被男人爽到呻吟的视频 | 国产超级va在线观看视频 | 亚洲一区二区观看播放 | 国产成人综合在线女婷五月99播放 | 成人aaa片一区国产精品 | 精品成在人线av无码免费看 | 亚无码乱人伦一区二区 | 妺妺窝人体色www婷婷 | 丰满人妻精品国产99aⅴ | 牛和人交xxxx欧美 | 精品国产成人一区二区三区 | 日本精品高清一区二区 | 免费网站看v片在线18禁无码 | 国产精品无码mv在线观看 | 亚洲一区二区三区国产精华液 | 爽爽影院免费观看 | 免费乱码人妻系列无码专区 | 精品国偷自产在线 | 免费人成网站视频在线观看 | 蜜桃臀无码内射一区二区三区 | 欧洲精品码一区二区三区免费看 | 久久久久国色av免费观看性色 | 日本熟妇乱子伦xxxx | 麻豆蜜桃av蜜臀av色欲av | 漂亮人妻洗澡被公强 日日躁 | 99国产欧美久久久精品 | 国产超碰人人爽人人做人人添 | 天天拍夜夜添久久精品大 | 亚洲自偷自拍另类第1页 | 成人av无码一区二区三区 | 国产成人精品无码播放 | 免费无码的av片在线观看 | 夜精品a片一区二区三区无码白浆 | 少妇无码吹潮 | 少妇愉情理伦片bd | 天天躁日日躁狠狠躁免费麻豆 | 国产亚洲美女精品久久久2020 | 国产精品久久久久9999小说 | 久久精品国产大片免费观看 | 国产激情无码一区二区 | 天堂亚洲免费视频 | 亚洲精品午夜无码电影网 | 偷窥日本少妇撒尿chinese | аⅴ资源天堂资源库在线 | 综合网日日天干夜夜久久 | 久久精品一区二区三区四区 | 99精品视频在线观看免费 | 亚洲人成无码网www | 麻豆果冻传媒2021精品传媒一区下载 | 中文字幕无线码免费人妻 | 色婷婷综合激情综在线播放 | 欧美老熟妇乱xxxxx | 久久亚洲精品成人无码 | 性啪啪chinese东北女人 | 67194成是人免费无码 | 国产精品18久久久久久麻辣 | 日日碰狠狠躁久久躁蜜桃 | 欧美 日韩 人妻 高清 中文 | 色一情一乱一伦 | 亚洲精品久久久久中文第一幕 | 国产精品美女久久久网av | 国产另类ts人妖一区二区 | 久久国语露脸国产精品电影 | 亚洲一区二区三区 | 久久99精品国产麻豆蜜芽 | 国产av无码专区亚洲a∨毛片 | 无码精品人妻一区二区三区av | 亚洲熟妇自偷自拍另类 | 国产精品久久久午夜夜伦鲁鲁 | 99久久精品国产一区二区蜜芽 | 无码国产色欲xxxxx视频 | 国产成人无码av片在线观看不卡 | 少妇无套内谢久久久久 | 成人免费无码大片a毛片 | 国产精品久久久久久亚洲毛片 | 乱码av麻豆丝袜熟女系列 | 中文字幕无码免费久久9一区9 | 欧美大屁股xxxxhd黑色 | 色五月丁香五月综合五月 | 内射爽无广熟女亚洲 | 狠狠色欧美亚洲狠狠色www | 亚洲国产高清在线观看视频 | 丰满少妇女裸体bbw | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 丰满人妻翻云覆雨呻吟视频 | 鲁大师影院在线观看 | 日本丰满熟妇videos | 特黄特色大片免费播放器图片 | 国产精品高潮呻吟av久久 | 国产美女精品一区二区三区 | 国内精品一区二区三区不卡 | 亚洲国产精品一区二区第一页 | 亚洲最大成人网站 | 对白脏话肉麻粗话av | 波多野结衣高清一区二区三区 | 中文字幕无码av激情不卡 | 岛国片人妻三上悠亚 | 亚洲精品久久久久avwww潮水 | 精品国产av色一区二区深夜久久 | 激情国产av做激情国产爱 | 夫妻免费无码v看片 | 国产欧美熟妇另类久久久 | 久久无码中文字幕免费影院蜜桃 | www国产亚洲精品久久久日本 | 天下第一社区视频www日本 | 狂野欧美激情性xxxx | 国产9 9在线 | 中文 | 国产av无码专区亚洲awww | 中文字幕乱码人妻二区三区 | 荡女精品导航 | 无码帝国www无码专区色综合 | 免费观看激色视频网站 | 日日躁夜夜躁狠狠躁 | 亚洲乱码中文字幕在线 | 日韩av无码一区二区三区 | 粉嫩少妇内射浓精videos | 一本久久a久久精品亚洲 | 日日摸天天摸爽爽狠狠97 | 国产真实乱对白精彩久久 | 噜噜噜亚洲色成人网站 | 性生交片免费无码看人 | 激情爆乳一区二区三区 | 国产香蕉尹人综合在线观看 | 久久99国产综合精品 | 窝窝午夜理论片影院 | 熟妇人妻无码xxx视频 | 色噜噜亚洲男人的天堂 | 在线播放免费人成毛片乱码 | 亚洲国产av精品一区二区蜜芽 | 亚洲 日韩 欧美 成人 在线观看 | 乌克兰少妇xxxx做受 | 亚洲爆乳无码专区 | 国产女主播喷水视频在线观看 | 麻豆国产97在线 | 欧洲 | 欧美性生交xxxxx久久久 | 又大又紧又粉嫩18p少妇 | 国内精品久久毛片一区二区 | 国产在线aaa片一区二区99 | 在线精品国产一区二区三区 | 青春草在线视频免费观看 | 亚洲中文字幕乱码av波多ji | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 人人妻人人澡人人爽欧美精品 | 一个人看的www免费视频在线观看 | 欧美野外疯狂做受xxxx高潮 | 欧美老人巨大xxxx做受 | 黑人大群体交免费视频 | 亚洲精品一区三区三区在线观看 | 亚洲精品成a人在线观看 | 日本大乳高潮视频在线观看 | 亚洲精品综合一区二区三区在线 | 国产人妻精品一区二区三区 | 免费无码av一区二区 | 国产精品亚洲五月天高清 | 丝袜人妻一区二区三区 | 乌克兰少妇xxxx做受 | 男人扒开女人内裤强吻桶进去 | 国产肉丝袜在线观看 | 国内少妇偷人精品视频 | 丁香花在线影院观看在线播放 | 亚洲经典千人经典日产 | 国内精品人妻无码久久久影院蜜桃 | 欧美亚洲国产一区二区三区 | 色综合视频一区二区三区 | 女人被男人躁得好爽免费视频 | 国产人妻精品一区二区三区 | 中文字幕av日韩精品一区二区 | 18黄暴禁片在线观看 | 亚洲va中文字幕无码久久不卡 | 亚洲日本va午夜在线电影 | 成人免费视频一区二区 | 亚洲成av人在线观看网址 | 国产情侣作爱视频免费观看 | 欧美 日韩 人妻 高清 中文 | 精品无码国产自产拍在线观看蜜 | 丰满护士巨好爽好大乳 | 日日碰狠狠躁久久躁蜜桃 | 国产人成高清在线视频99最全资源 | 久久久国产精品无码免费专区 | 国产熟妇另类久久久久 | 亚洲精品久久久久中文第一幕 | 精品国产一区二区三区四区在线看 | 日本饥渴人妻欲求不满 | 亚洲色www成人永久网址 | 宝宝好涨水快流出来免费视频 | 国产成人综合色在线观看网站 | 色偷偷人人澡人人爽人人模 | 国产精品福利视频导航 | 国产精品嫩草久久久久 | 蜜臀av在线播放 久久综合激激的五月天 | 无码成人精品区在线观看 | 亚洲一区二区三区含羞草 | 夜精品a片一区二区三区无码白浆 | 亚洲精品一区二区三区四区五区 | 熟妇女人妻丰满少妇中文字幕 | 国产精品人人妻人人爽 | 国产超级va在线观看视频 | 色一情一乱一伦一视频免费看 | 精品久久8x国产免费观看 | 少妇无码一区二区二三区 | 99久久99久久免费精品蜜桃 | 国产疯狂伦交大片 | 久久天天躁狠狠躁夜夜免费观看 | 国产无遮挡又黄又爽又色 | 色一情一乱一伦一区二区三欧美 | 国产高清av在线播放 | 97se亚洲精品一区 | 亚洲国产精华液网站w | 人人爽人人澡人人人妻 | 天天摸天天透天天添 | 日韩精品无码一本二本三本色 | 精品乱码久久久久久久 | 国产舌乚八伦偷品w中 | 色综合久久网 | 清纯唯美经典一区二区 | 久久99精品国产麻豆 | 国产人妻精品一区二区三区 | 狠狠色噜噜狠狠狠狠7777米奇 | 99久久久无码国产精品免费 | 国内丰满熟女出轨videos | 国产尤物精品视频 | 久久久久免费看成人影片 | 性欧美videos高清精品 | 少妇高潮一区二区三区99 | 国产精品高潮呻吟av久久 | 亚洲国产精品一区二区美利坚 | 日本肉体xxxx裸交 | 麻豆人妻少妇精品无码专区 | 国产精品毛片一区二区 | 欧洲vodafone精品性 | 中文久久乱码一区二区 | 国产亚洲精品久久久久久 | 激情人妻另类人妻伦 | 亚洲综合在线一区二区三区 | 丰满人妻精品国产99aⅴ | 国产又爽又黄又刺激的视频 | 午夜无码区在线观看 | 女人高潮内射99精品 | 少妇愉情理伦片bd | 亚洲国产成人a精品不卡在线 | 亚洲日韩av一区二区三区四区 | 亚洲国产精品无码久久久久高潮 | 中文字幕中文有码在线 | 精品无码成人片一区二区98 | 久久精品中文字幕一区 | 秋霞成人午夜鲁丝一区二区三区 | 在线观看国产一区二区三区 | aa片在线观看视频在线播放 | 人人妻人人澡人人爽欧美精品 | 蜜桃av抽搐高潮一区二区 | 国内精品人妻无码久久久影院 | 久精品国产欧美亚洲色aⅴ大片 | √天堂中文官网8在线 | 狠狠色丁香久久婷婷综合五月 | 性色欲网站人妻丰满中文久久不卡 | 日本www一道久久久免费榴莲 | 国产97色在线 | 免 | 无码人妻丰满熟妇区五十路百度 | 99久久久国产精品无码免费 | 国产av无码专区亚洲awww | 99久久婷婷国产综合精品青草免费 | 久久久久久a亚洲欧洲av冫 | 久久精品成人欧美大片 | 女人和拘做爰正片视频 | 亚洲国产综合无码一区 | 日欧一片内射va在线影院 | 亚洲 欧美 激情 小说 另类 | 国产人妻久久精品二区三区老狼 | 久久人人97超碰a片精品 | 青青青手机频在线观看 | 欧美freesex黑人又粗又大 | 国产电影无码午夜在线播放 | 国产乱码精品一品二品 | 男女作爱免费网站 | 国产精品高潮呻吟av久久 | 国产人妻久久精品二区三区老狼 | 欧美日韩一区二区免费视频 | 久久亚洲精品中文字幕无男同 | 亚洲阿v天堂在线 | 国产精品久久久久无码av色戒 | 99国产欧美久久久精品 | 国产精品久久久久无码av色戒 | 老司机亚洲精品影院 | 中文精品无码中文字幕无码专区 | 亚洲中文字幕va福利 | 亚洲国产一区二区三区在线观看 | 一二三四在线观看免费视频 | a国产一区二区免费入口 | 久久这里只有精品视频9 | 国产在线一区二区三区四区五区 | 国产精品福利视频导航 | 成人精品视频一区二区三区尤物 | 欧美日韩在线亚洲综合国产人 | 欧美三级不卡在线观看 | 四虎影视成人永久免费观看视频 | 国产精品久久久 | 丝袜足控一区二区三区 | 一本久道久久综合狠狠爱 | 亚洲国产成人a精品不卡在线 | 亚洲精品国产a久久久久久 | 久久久久久久久888 | 国产偷抇久久精品a片69 | 亚洲欧美中文字幕5发布 | 亚洲区小说区激情区图片区 | 亚洲人成无码网www | 亚洲精品一区国产 | 欧美刺激性大交 | 一本久道久久综合婷婷五月 | 熟女俱乐部五十路六十路av | 我要看www免费看插插视频 | www国产亚洲精品久久网站 | 亚洲va中文字幕无码久久不卡 | 又色又爽又黄的美女裸体网站 | 无码国产色欲xxxxx视频 | 欧美 日韩 人妻 高清 中文 | 国内精品人妻无码久久久影院蜜桃 | 性欧美熟妇videofreesex | 人人妻人人澡人人爽人人精品 | 国产在线无码精品电影网 | 波多野结衣av在线观看 | 亚洲欧洲中文日韩av乱码 | 国产亚洲精品久久久闺蜜 | 国产精品久免费的黄网站 | 少妇被黑人到高潮喷出白浆 | 日本乱偷人妻中文字幕 | 欧美熟妇另类久久久久久多毛 | 色偷偷人人澡人人爽人人模 | 无码人妻少妇伦在线电影 | 国产成人av免费观看 | 76少妇精品导航 | 亚洲人成网站免费播放 | 国产成人精品一区二区在线小狼 | 综合网日日天干夜夜久久 | 乱中年女人伦av三区 | 亚洲aⅴ无码成人网站国产app | 欧美高清在线精品一区 | 无码av中文字幕免费放 | 久久视频在线观看精品 | 色综合久久久无码中文字幕 | 18精品久久久无码午夜福利 | 国产内射爽爽大片视频社区在线 | 性做久久久久久久久 | 极品嫩模高潮叫床 | 国产亚洲人成a在线v网站 | 精品久久久久香蕉网 | 在线精品亚洲一区二区 | 人妻有码中文字幕在线 | 国产97人人超碰caoprom | 国产日产欧产精品精品app | 色综合久久久无码网中文 | 久久精品国产99久久6动漫 | 成人免费视频视频在线观看 免费 | 欧美激情内射喷水高潮 | 领导边摸边吃奶边做爽在线观看 | 丰满人妻一区二区三区免费视频 | 无码任你躁久久久久久久 | 欧美日韩色另类综合 | 国产精品怡红院永久免费 | 人妻体内射精一区二区三四 | 精品日本一区二区三区在线观看 | 成人免费视频在线观看 | 国产一区二区不卡老阿姨 | 欧美精品免费观看二区 | 亚洲小说图区综合在线 |