久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Python自動化之UnitTest框架實(shí)戰(zhàn)記錄

瀏覽:3日期:2022-07-11 18:52:55
1 UnitTest 基本用法

UnitTest 框架是 Python 自帶的一個作為單元測試的測試框,相當(dāng)于 Java中的 JUnit,隨著自動化技術(shù)的成熟,UnitTest 成為了測試框架第一選擇,可以完整的結(jié)合 Selenium、Requests 來實(shí)現(xiàn) Ul 和接口的自動化,由 UnitTest 再衍生出 PyTest,PyTest 可以完美結(jié)合 UnitTest 來實(shí)現(xiàn)自動化。

基本應(yīng)用:

1、環(huán)境搭建,Python 中已經(jīng)直接加載了 UnitTest 框架,無須額外安裝

2、四大組件:

a. test fixture:setUp(前置條件)、tearDown(后置條件),用于初始化測試用例及清理和釋放資源

b. test case:測試用例,通過集成 unttest.TestCase,來實(shí)現(xiàn)用例的繼承,在 Unitfest 中,測試用例都是通過 test 來識別的,測試用例命名 test_XXX

c. test suite:測試套件,也稱之為測試用例集

d. test runner:運(yùn)行器,一般通過 runner 來調(diào)用 suite 去執(zhí)行測試

UnitTest 運(yùn)行機(jī)制:通過在 main 函數(shù)中,調(diào)用 unitest.main() 運(yùn)行所有內(nèi)容

1.1 UnitTest 初體驗(yàn)

本節(jié)知識:1. 對 UnitTest 有直觀感受

講了這么多,也完全不明白,沒關(guān)系,通過實(shí)例先有個直觀的了解,UnitTest 是個什么東西

import unittest# 通過繼承 unittest。TestCase 來實(shí)現(xiàn)用例class forTest(unittest.TestCase): # 類的初始化 @classmethod def setUpClass(cls) -> None: print(’class’) # 類的釋放 @classmethod def tearDownClass(cls) -> None: print(’tclass’) # 測試用例初始化 def setUp(self) -> None: print('setUp') # 測試用例釋放 def tearDown(self) -> None: print('teadDown') # 測試用例 def test_a(self): print('a') # 測試用例 def test_b(self): print('b') # 函數(shù) def add(self, a, b): return a + b # 測試用例 def test_c(self): c = self.add(1, 3) print(’c =’, c)if __name__ == '__main__': unittest.main(verbosity=2)# 參數(shù) verbosity=2 的目的是為了讓打印的信息更加完整,也可以不要

對上面的程序進(jìn)行講解:

1、類的初始化與釋放

def setUpClass(cls) -> None 表示類的初始化,在執(zhí)行測試用例之前執(zhí)行,只執(zhí)行一次,函數(shù)參數(shù)為 cls 表示這是一個類方法 def tearDownClass(cls) -> None 表示類的釋放,在執(zhí)行測試用例之后執(zhí)行,只執(zhí)行一次

2、測試用例的初始化與釋放

def setUp(self) -> None 用于測試用例的初始化,在每個測試用例之前都會執(zhí)行,有多少個測試用例,就會執(zhí)行多少次 def tearDown(self) -> None 用于測試用例釋放,在每個測試用例執(zhí)行之后執(zhí)行,有多少個測試用例,就會執(zhí)行多少次注意:方法 setUpClass,tearDownClass,setUp,def tearDown 的方法名是固定的,不能改動,不然框架無法識別

3、測試用例的定義

測試用例的命名規(guī)則為 test_xxx,這樣測試用例就會自動執(zhí)行

注意:只有測試用例才會被執(zhí)行,不以test_xxx 命名的函數(shù)是方法,方法是不能被執(zhí)行的

4、執(zhí)行測試用例

通過在 main 函數(shù)中,調(diào)用 unitest.main() 運(yùn)行所有內(nèi)容

運(yùn)行結(jié)果如下:

類的初始化方法 setUpClass(cls) 在所有的測試用例之前執(zhí)行,類的釋放函數(shù) tearDownClass(cls) 在所有的測試用例之后執(zhí)行 測試用例的初始化在每個測試用例之前都會執(zhí)行,測試用例的釋放在每個測試用例之后都會執(zhí)行 test_a(self) 和 test_b(self) 是測試用例,運(yùn)行時被自動執(zhí)行,add(self, a, b) 是函數(shù),不會被自動執(zhí)行,test_c(self) 是測試用例,調(diào)用了 add 函數(shù),這樣就可以執(zhí)行 add 函數(shù)了。

classsetUpateadDownsetUpbteadDownsetUpc = 4teadDowntclass

相信有了上面的例子,已經(jīng)對UnitTest 有了一個初步的印象。

下面我們進(jìn)行一個實(shí)戰(zhàn)操作

1.2 UnitTest 自動化實(shí)現(xiàn)實(shí)戰(zhàn)

本節(jié)知識:1. 自動化測試減少冗余,便于維護(hù),2. ddt數(shù)據(jù)驅(qū)動

1、自動化測試減少冗余,便于維護(hù)

有了類的初始化與釋放,測試用例的初始化與釋放,我們可以將多個測試用例中相同的代碼提取出來,減少自動化測試冗余,這樣便于維護(hù)

下面看這樣一個例子,我們打開谷歌瀏覽器,輸入百度網(wǎng)址并進(jìn)行搜索,搜索后關(guān)閉瀏覽器

#coding=utf-8import unittestfrom selenium import webdriverimport timeclass forTest(unittest.TestCase):# 測試用例初始化 # 打開谷歌瀏覽器,并進(jìn)入百度 def setUp(self) -> None: self.driver = webdriver.Chrome() self.driver.get(’http://www.baidu.com’)# 測試用例釋放 # 等待 3s,關(guān)閉瀏覽器 def tearDown(self) -> None: time.sleep(3) self.driver.quit() # 輸入‘戰(zhàn)狼’,并點(diǎn)擊搜索 def test_1(self): pass self.driver.find_element_by_id(’kw’).send_keys(’戰(zhàn)狼’) self.driver.find_element_by_id(’su’).click() # 輸入‘紅海行動’,并點(diǎn)擊搜索 def test_2(self): pass self.driver.find_element_by_id(’kw’).send_keys(’紅海行動’) self.driver.find_element_by_id(’su’).click()if __name__ == ’__main__’: unittest.main()

上面的案例中,我們將打開谷歌瀏覽器,進(jìn)入百度,放在 setUp 中,完成每個測試用例之前的初始化,瀏覽器的關(guān)閉放在tearDown 中,完成測試用例的釋放

2 UnitTest 結(jié)合 DDT(data-driver tests) 自動化2.1 ddt 中的 data 與 unpack

在實(shí)際測試中,單個測試是需要用多種不同的條件(測試數(shù)據(jù))對其進(jìn)行測試的。

ddt 中最基本的應(yīng)用;在 class 前定義 @ddt,用于表示要使用 ddt 了,再基于實(shí)際的應(yīng)用。選擇對應(yīng)的裝飾器來使用即可,說白了,就是一個裝飾器

data 用于設(shè)定參數(shù) unpack 用于解析參數(shù)

直接看例子比較直觀

#coding=utf-8import unittestfrom ddt import ddtfrom ddt import data# 導(dǎo)入data# 類之前定義裝飾器,表示在類中要使用ddt了@ddtclass MyTestCase(unittest.TestCase): def setUp(self) -> None: print(’{:=^20}’.format('測試開始')) def tearDown(self) -> None: print('{:=^20}'.format(’測試結(jié)束’)) # data用于設(shè)定參數(shù) @data(’戰(zhàn)狼’, ’哪吒’, ’流浪地球’, ’復(fù)仇者聯(lián)盟’) def test_1(self, txt): print(txt)if __name__ == ’__main__’: unittest.main(verbosity=2)

運(yùn)行結(jié)果:

========測試開始========戰(zhàn)狼========測試結(jié)束================測試開始========哪吒========測試結(jié)束================測試開始========流浪地球========測試結(jié)束================測試開始========復(fù)仇者聯(lián)盟========測試結(jié)束========

可以看到測試用例 def test_1(self, txt) 被執(zhí)行了四次,data 用于設(shè)定參數(shù),將參數(shù)依次放入測試用例中進(jìn)行測試。

我們改變一下設(shè)定的參數(shù),將 data 設(shè)定的參數(shù)改為 ((‘戰(zhàn)狼’, ‘哪吒’), (‘流浪地球’, ‘復(fù)仇者聯(lián)盟’)),再進(jìn)行測試,如下所示

#coding=utf-8import unittestfrom ddt import ddtfrom ddt import data# 類之前定義裝飾器,表示在類中要使用ddt了@ddtclass MyTestCase(unittest.TestCase): def setUp(self) -> None: print(’{:=^20}’.format('測試開始')) def tearDown(self) -> None: print('{:=^20}'.format(’測試結(jié)束’)) # data 用于設(shè)定參數(shù),將包 (’戰(zhàn)狼’, ’哪吒’) 作為一個整體賦值給 txt @data((’戰(zhàn)狼’, ’哪吒’), (’流浪地球’, ’復(fù)仇者聯(lián)盟’)) def test_1(self, txt): print(txt)if __name__ == ’__main__’: unittest.main(verbosity=2)

運(yùn)行結(jié)果如下:

========測試開始========(’戰(zhàn)狼’, ’哪吒’)========測試結(jié)束================測試開始========(’流浪地球’, ’復(fù)仇者聯(lián)盟’)========測試結(jié)束========

可以看到,傳入?yún)?shù) ((‘戰(zhàn)狼’, ‘哪吒’), (‘流浪地球’, ‘復(fù)仇者聯(lián)盟’)) 時,將包 (‘戰(zhàn)狼’, ‘哪吒’) 和 (‘流浪地球’, ‘復(fù)仇者聯(lián)盟’) 作為一個整體,傳遞給測試用例了,如果我們希望將包里面的數(shù)據(jù)解開,傳遞給測試用例不同的參數(shù),就需要用到 unpack 進(jìn)行解包。

加入解包后的代碼如下所示:

#coding=utf-8import unittestfrom ddt import ddtfrom ddt import datafrom ddt import unpack # 導(dǎo)入unpack# 類之前定義裝飾器,表示在類中要使用ddt了@ddtclass MyTestCase(unittest.TestCase): def setUp(self) -> None: print(’{:=^20}’.format('測試開始')) def tearDown(self) -> None: print('{:=^20}'.format(’測試結(jié)束’)) @data((’戰(zhàn)狼’, ’哪吒’), (’流浪地球’, ’復(fù)仇者聯(lián)盟’)) # 解包,將 (’戰(zhàn)狼’, ’哪吒’) 解包,’戰(zhàn)狼’ 賦值給 txt1,’哪吒’賦值給 txt2 @unpack def test_3(self, txt1, txt2): print(txt1) print(txt2)if __name__ == ’__main__’: unittest.main(verbosity=2)

執(zhí)行結(jié)果如下:

========測試開始========戰(zhàn)狼哪吒========測試結(jié)束================測試開始========流浪地球復(fù)仇者聯(lián)盟========測試結(jié)束========

可以看到,unpack 對每次傳入的包進(jìn)行解包,例如將 (‘戰(zhàn)狼’, ‘哪吒’) 解包,‘戰(zhàn)狼’ 賦值給 txt1,’哪吒’賦值給 txt2

上面的例子中,我們將輸入的參數(shù)直接固定了,其實(shí)也可以通過文件讀取,讀取結(jié)果決定

#coding=utf-8import unittestfrom ddt import ddtfrom ddt import datafrom ddt import unpackdef readFile(): params = [] file = open(’ddt.txt’, ’r’, encoding = ’gbk’) for line in file.readlines(): params.append(line.strip(’n’).split(’,’)) return params# 類之前定義裝飾器,表示在類中要使用ddt了@ddtclass MyTestCase(unittest.TestCase): def setUp(self) -> None: print(’{:=^20}’.format('測試開始')) def tearDown(self) -> None: print('{:=^20}'.format(’測試結(jié)束’)) # 從文件中讀取 @data(*readFile()) @unpack def test_1(self, txt1, txt2): print(txt1) print(txt2)if __name__ == ’__main__’: unittest.main(verbosity=2)

ddt.txt 文件中的內(nèi)如下:

戰(zhàn)狼,哪吒流浪地球,復(fù)仇者聯(lián)盟

運(yùn)行結(jié)果:

函數(shù) readFile 從文件中讀取數(shù)據(jù),unpack 進(jìn)行解包

========測試開始========戰(zhàn)狼哪吒========測試結(jié)束================測試開始========流浪地球復(fù)仇者聯(lián)盟========測試結(jié)束========

上面從文件中讀取數(shù)據(jù)時先讀取文件,再處理讀取的結(jié)果,下面介紹一個直接操作文件的方法

從 ddt 中導(dǎo)入 file_data,導(dǎo)入 yaml,讀取數(shù)據(jù)的文件類型必須為 .yml 類型的文件。

#coding=utf-8import unittestfrom ddt import ddtfrom ddt import datafrom ddt import unpackfrom ddt import file_dataimport yaml# 類之前定義裝飾器,表示在類中要使用ddt了@ddtclass MyTestCase(unittest.TestCase): def setUp(self) -> None: print(’{:=^20}’.format('測試開始')) def tearDown(self) -> None: print('{:=^20}'.format(’測試結(jié)束’)) # 直接的文件讀取,直接操作一個文件 @file_data(’ddt2.yml’) def test_5(self, txt): print(txt)if __name__ == ’__main__’: unittest.main(verbosity=2)

ddt2.yml 文件內(nèi)容如下:

name: ’skx’info: ’hust’

運(yùn)行結(jié)果:

========測試開始========skx========測試結(jié)束================測試開始========hust========測試結(jié)束========

2.2 ddt 數(shù)據(jù)驅(qū)動

打開瀏覽器進(jìn)入百度查詢的例子中我們發(fā)現(xiàn)除了輸入的參數(shù)不同,test_1(self) 和 test_2(self) 完全相同,這里我們就要通過 data 設(shè)定參數(shù)實(shí)現(xiàn)在一個測試用例中輸入不同的參數(shù)

#coding=utf-8import unittestfrom selenium import webdriverimport timefrom ddt import ddtfrom ddt import data# 在 class 前定義 @ddt,用于表示要使用 ddt 了@ddtclass forTestTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.get(’http://www.baidu.com’) def tearDown(self): time.sleep(3) self.driver.quit() # data 用于設(shè)定參數(shù) @data(’戰(zhàn)狼’, ’哪吒’, ’流浪地球’) def test_1(self, txt): self.driver.find_element_by_id(’kw’).send_keys(txt) self.driver.find_element_by_id(’su’).click()if __name__ == '__main__': unittest.main()

運(yùn)行結(jié)果,谷歌瀏覽器被打開三次,進(jìn)入百度,分別輸入 ‘戰(zhàn)狼’, ‘哪吒’, ‘流浪地球’,每次瀏覽器關(guān)閉之后,才打開下一次,再進(jìn)行搜索

上面的例子中,我們將輸入的參數(shù)直接固定了,其實(shí)也可以通過文件讀取,決定進(jìn)入哪一個 url 和輸入的參數(shù)

#coding=utf-8import unittestfrom selenium import webdriverimport timefrom ddt import ddtfrom ddt import datafrom ddt import unpackdef readFile(): params = [] file = open(’forTest3.txt’, ’r’, encoding = ’gbk’) for line in file.readlines(): params.append(line.strip(’n’).split(’,’)) return params@ddtclass forTestTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() def tearDown(self): time.sleep(3) self.driver.quit()# data 用于設(shè)定參數(shù),表示參數(shù)由 readFile() 函數(shù)的返回值決定# unpack 用于解析參數(shù),例如將[’http://www.baidu.com’, ’戰(zhàn)狼’] 分別 賦值給 url 和 txt @data(*readFile()) @unpack def test_1(self, url, txt): self.driver.get(url) self.driver.find_element_by_id(’kw’).send_keys(txt) self.driver.find_element_by_id(’su’).click()if __name__ == '__main__': unittest.main()

forTest3.txt 文件中的內(nèi)容如下:

http://www.baidu.com,戰(zhàn)狼http://www.baidu.com,哪吒

分析:

readFile() 函數(shù)打開文件,讀取文件的每一行,按逗號 ‘,’ 劃分關(guān)鍵字, unpack 用于解析參數(shù),ddt 對于數(shù)據(jù)的解析方式為,解析一個,傳參一個,所以函數(shù)中 url 和 txt 的參數(shù)順序不能調(diào)換。

運(yùn)行結(jié)果,谷歌瀏覽器被打開兩次,進(jìn)入百度,分別輸入 ‘戰(zhàn)狼’, ‘哪吒’,每次瀏覽器關(guān)閉之后,才打開下一次,再進(jìn)行搜索

file_data 是 ddt 中用于讀取 yml 文件的裝飾器

3 yml 文件的使用

這個插入一個小插曲,上面提到了 yml 文件,這里就簡單講解一下 yml 文件怎么使用。

從yml 文件中直接讀取數(shù)據(jù)可以生成字典,列表等,yml 文件由一定的格式,我們通過實(shí)例來說明,yml_test.py 從 a.yml 文件中讀取文件并打印出來。

yml_test.py

import yamlfile = open(’a.yml’, encoding = ’utf-8’)res = yaml.load(file, Loader = yaml.FullLoader)print(res)

a.yml 文件中的內(nèi)容如下所示,冒號代表字典,字典結(jié)構(gòu)可以嵌套,也可以生成列表,具體格式參考下面的 a.yml 文件。

a.yml

name: ’skx’age: 18data: a: 1 b: 2 c: 3 d: 4list: - a - b - c - d

打印的結(jié)果如下所示,生成四個字典元素,第三個字典元素為嵌套字典結(jié)構(gòu),第四個字典對應(yīng)的 value 為列表。

{’name’: ’skx’, ’age’: 18, ’data’: {’a’: 1, ’b’: 2, ’c’: 3, ’d’: 4}, ’list’: [’a’, ’b’, ’c’, ’d’]}

如果將 a.yml 文件中的數(shù)據(jù)改為如下結(jié)構(gòu),則生成一個純列表,打印的結(jié)果如下所示。

a.yml

- a- b- c- d

[’a’, ’b’, ’c’, ’d’]

有了 yml 文件,我們就可以將測試數(shù)據(jù)放到 yml 文件中,從文件中獲取參數(shù),傳入測試函數(shù),完成測試。還是通過例子來講解,yml_test2.yml 中是一個列表,每個列表元素是一個字典,字典中有兩個元素,name 和 age,使用 file_data 直接可以將 yml_test2.yml 傳入測試用例中。

read_yml2.py

#coding=utf-8import unittestfrom ddt import ddtfrom ddt import file_dataimport yaml# 類之前定義裝飾器,表示在類中要使用ddt了@ddtclass MyTestCase(unittest.TestCase): def setUp(self) -> None: print(’{:=^20}’.format('測試開始')) def tearDown(self) -> None: print('{:=^20}'.format(’測試結(jié)束’)) @file_data(’read_yml2_data.yml’) def test_yam(self, **kwargs): # 獲取參數(shù)中key 為 name 的 value print(kwargs['name']) # 獲取為 text 的 value print(kwargs['age'])if __name__ == ’__main__’: unittest.main(verbosity=2)

read_yml2_data.yml

- name: ’Tom’ age: 13- name: ’Carl’ age: 20- name: ’Edward’ age: 28

運(yùn)行結(jié)果:

========測試開始========Tom13========測試結(jié)束================測試開始========Carl20========測試結(jié)束================測試開始========Edward28========測試結(jié)束========

4 UnitTest 斷言用法

在 UnitTest中,TestCase 已經(jīng)提供有封裝好的斷言方法進(jìn)行斷言校驗(yàn)。

斷言:用于校驗(yàn)實(shí)際結(jié)果與預(yù)期結(jié)果是否匹型,在斷言的內(nèi)容選擇上,是有要求的。

斷言強(qiáng)調(diào)的是對于整個測試流程的結(jié)果進(jìn)行判斷,所以斷言的內(nèi)容是極為核心的。

上面的代碼

#coding=utf-8import unittestfrom ddt import ddtfrom ddt import file_dataimport yaml# 類之前定義裝飾器,表示在類中要使用ddt了@ddtclass MyTestCase(unittest.TestCase): def setUp(self) -> None: print(’{:=^20}’.format('測試開始')) def tearDown(self) -> None: print('{:=^20}'.format(’測試結(jié)束’)) @file_data(’read_yml2_data.yml’) def test_yam(self, **kwargs): # 獲取參數(shù)中key 為 name 的 value name = kwargs[’name’] print(name) # 這里做斷言,當(dāng)斷言不相等的時候返回 msg self.assertEqual(name, ’Tom’, msg = ’NotEqual’) # 獲取為 text 的 value print(kwargs['age'])if __name__ == ’__main__’: unittest.main()

- name: ’Tom’ age: 13- name: ’Carl’ age: 20- name: ’Edward’ age: 28

Python自動化之UnitTest框架實(shí)戰(zhàn)記錄

可以看到第一個例子執(zhí)行正確,后面的例子,執(zhí)行結(jié)果和預(yù)期不一致,返回 NotEqual,左側(cè)的日志可以看到第一個用例執(zhí)行成功,后面兩個例子執(zhí)行失敗。

unittest 框架的 TestCase 類提供以下方法用于測試結(jié)果的判斷

方法 檢查 assertEqual(a, b) a ==b assertNotEqual(a, b) a !=b assertTrue(x) bool(x) is True assertFalse(x) Bool(x) is False assertIs(a, b) a is b assertIsNot(a, b) a is not b assertIsNone(x) x is None assertIsNotNone(x) x is not None assertIn(a, b) a in b assertNotIn(a, b) a not in b assertIsInstance(a, b) isinstance(a,b) assertNotIsInstance(a, b) not isinstance(a,b)

5 UnitTest.skip()用法

假設(shè)我們有很多測試用例,有些我們需要執(zhí)行,有些我們不想執(zhí)行,不想執(zhí)行的測試用例如何才能不執(zhí)行呢,這就需要用到 skip。

Skip用法:

在 Case 中,對于不需要運(yùn)行的用例或者特定條件下不執(zhí)行的用例,可以應(yīng)用 skip() 來實(shí)現(xiàn)有條件執(zhí)行,或者絕對性跳過,用于對指定用例進(jìn)行不執(zhí)行操作 skip通過裝飾器進(jìn)行使用

還是通過案例進(jìn)行講解,下面有 6 個測試用例,2-5測試用例被屏蔽了,使用的方法不同,

@unittest.skip(“xxx”)是無條件跳過,xxx為跳過的理由 unittest.skipIf(1 < 2, ‘xxx’),條件為 True 時跳過 @unittest.skipUnless(1 > 2, ‘xxx’),條件為 False 時跳過,和 skipIf 更好相反 @unittest.expectedFailure,如果用例執(zhí)行失敗,則不計(jì)入失敗的case數(shù)中

直接看例子更加直觀

skip_t.py

#coding=utf-8import unittestclass MyTestCase(unittest.TestCase): def setUp(self) -> None: pass def tearDown(self) -> None: pass def test_1(self): print(’1’) # 無條件跳過該條用例 @unittest.skip('不想運(yùn)行') def test_2(self): print(’2’) # 有條件跳過操作,條件為True跳過 @unittest.skipIf(1 < 2, ’1 < 2 為True,條件成立,跳過執(zhí)行’) def test_3(self): print(’3’) # 有條件執(zhí)行跳過,條件為False跳過 @unittest.skipUnless(1 > 2, ’Unless的理由,條件為False,跳過執(zhí)行’) def test_4(self): print(’4’) # 如果用例執(zhí)行失敗,則不計(jì)入失敗的case數(shù)中 @unittest.expectedFailure def test_5(self): print(’5’) self.assertEqual(4, 3, msg = ’NotEqual’) def test_6(self): print(’6’)if __name__ == '__main__': unittest.main()

執(zhí)行結(jié)果如下,可以看到,test_2,test_3,test_4 跳過,test_5執(zhí)行失敗,但是不計(jì)入case數(shù)中

Python自動化之UnitTest框架實(shí)戰(zhàn)記錄

5 UnitTest測試套件及runner應(yīng)用

測試套件 Suite 作用:

用于給測試用例進(jìn)行排序 管理測試用例

通過例子講解最容易理解,看一個最簡單的例子,下面的代碼中有五個測試用例,程序運(yùn)行的結(jié)果和測試用例在代碼中位置是沒有關(guān)系的,結(jié)果永遠(yuǎn)打印 1 2 3 4 5,這是因?yàn)闇y試用例的執(zhí)行順序默認(rèn)是按照字典順序執(zhí)行的,如何才能控制測試用例的執(zhí)行順序呢,這就需要使用測試套件了。

suite_case.py

import unittestclass MyTestCase(unittest.TestCase): def setUp(self) -> None: pass def tearDown(self) -> None: pass def test_2(self): print('2') def test_1(self): print('1') def test_4(self): print('4') def test_3(self): print('3') def test_5(self): print('5')if __name__ == '__main__': unittest.main()

運(yùn)行結(jié)果:

12345

再建一個py 文件

#coding=utf-8import unittestfrom suite_case import *# 創(chuàng)建一個測試套件 listsuite = unittest.TestSuite()# 方法一,添加測試用例(子元素)到測試套件(集合)suite.addTest(MyTestCase(’test_3’))suite.addTest(MyTestCase('test_1'))suite.addTest(MyTestCase('test_5'))# 套件通過TextTestRunner對象運(yùn)行,功能相當(dāng)于unittest.main()runner = unittest.TextTestRunner()runner.run(suite)

我們首先創(chuàng)建一個測試套件,然后向測試套件中添加測試用例,最后創(chuàng)建 TextTestRunner 對象,調(diào)用 run 函數(shù)運(yùn)行測試用例。這樣我們不僅可以控制測試用例的執(zhí)行順序,還可以控制運(yùn)行哪個測試用例。

結(jié)果如下:

315

上面的方法每次添加測試用例都需要調(diào)用 addTest 函數(shù),能不能一次添加多個測試用例呢,可以的,將測試用例寫成一個列表,通過addTests 函數(shù)可以一次添加多個測試用例

#coding=utf-8import unittestfrom suite_case import *# 創(chuàng)建一個測試套件 listsuite = unittest.TestSuite()# 方法二,批量添加測試用例cases = [MyTestCase(’test_3’), MyTestCase(’test_1’), MyTestCase(’test_5’)]suite.addTests(cases)# 套件通過TextTestRunner對象運(yùn)行,功能相當(dāng)于unittest.main()runner = unittest.TextTestRunner()runner.run(suite)

如果測試用例非常多,或者有多個文件中的測試用例都需要測試,這樣添加也不是很方便,我們好可以按照文件路徑,將該路徑下需要測試的文件添加進(jìn)測試套件中

#coding=utf-8import unittestfrom suite_case import *# 創(chuàng)建一個測試套件 listsuite = unittest.TestSuite()# 方法三,批量運(yùn)行多個unittest類test_dir = ’./’# start_dir 參數(shù)指定文件路徑,pattern 執(zhí)行規(guī)則,’s*.py’ 表示以 's' 開頭,'.py' 的都加入測試套件中discover = unittest.defaultTestLoader.discover(start_dir = test_dir, pattern = ’s*.py’)runner = unittest.TextTestRunner()runner.run(discover)# 通過 run 函數(shù)運(yùn)行測試用例

還可以執(zhí)行類的名字,執(zhí)行該類下面所有的測試用例,使用 loadTestsFromName 函數(shù)或者 loadTestsFromTestCase 都可以,案例如下:

#coding=utf-8import unittestfrom suite_case import *# 創(chuàng)建一個測試套件 listsuite = unittest.TestSuite()# 方法四,給出文件名和類名,就能測試所有的測試用例suite.addTests(unittest.TestLoader().loadTestsFromName(’suite.MyTestCase’))# 套件通過TextTestRunner對象運(yùn)行,功能相當(dāng)于unittest.main()runner = unittest.TextTestRunner()runner.run(suite)

#coding=utf-8import unittestfrom suite_case import *# 創(chuàng)建一個測試套件 listsuite = unittest.TestSuite()# 方法五,給出類名,就能測試所有的測試用例suite.addTests(unittest.TestLoader().loadTestsFromTestCase(MyTestCase))# 套件通過TextTestRunner對象運(yùn)行,功能相當(dāng)于unittest.main()runner = unittest.TextTestRunner()runner.run(suite)6 UnitTest+HTMLTestRunner 自動化實(shí)現(xiàn)

通過 HTMLTestRunner 我們可以將測試結(jié)果生成 html 文件,通過網(wǎng)頁端進(jìn)行查看。步驟如下:

1. 導(dǎo)入環(huán)境

下載 HTMLTestRunner.py 文件,下載地址

Python自動化之UnitTest框架實(shí)戰(zhàn)記錄

點(diǎn)進(jìn)入HTMLTestRunner.py,右鍵另存為就可以下載到本地。

下載后,把HTMLTestRunner.py 文件復(fù)制到 Python 安裝路徑下的 lib 文件夾中(我的安裝路徑是:C:UsersAdministratorAppDataLocalProgramsPythonPython38Lib)。在python3中用HTMLTestRunner.py 報(bào) importError“:No module named ’StringIO’解決辦法,原因是官網(wǎng)的是python2語法寫的,看官手動把官網(wǎng)的 HTMLTestRunner.py 改成 python3 的語法。

修改內(nèi)容:

第94行,將import StringIO修改成import io 第539行,將self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO() 第642行,將if not rmap.has_key(cls):修改成if not cls in rmap: 第631行,將print >> sys.stderr, ‘nTime Elapsed: %s’ % (self.stopTime-self.startTime)修改成print(sys.stderr, ‘nTime Elapsed: %s’ % (self.stopTime-self.startTime)) 第766行,將uo = o.decode(‘latin-1’)修改成uo = e 第772行,將ue = e.decode(‘latin-1’)修改成ue = e 2. 導(dǎo)包

from HTMLTestRunner import HTMLTestRunner

下面就通過案例進(jìn)行演示

suite_case.py 文件

import unittestclass MyTestCase(unittest.TestCase): def setUp(self) -> None: pass def tearDown(self) -> None: pass def test_2(self): print('2') def test_1(self): print('1') def test_4(self): print('4') def test_3(self): print('3') def test_5(self): print('5')if __name__ == '__main__': unittest.main()

#coding=utf-8import unittestfrom suite_case import MyTestCasefrom HTMLTestRunner import HTMLTestRunnerimport ossuite = unittest.TestSuite()report_path = ’./report/’report_file = report_path + ’report.html’# 路徑不存在就創(chuàng)建一個文件夾if not os.path.exists(report_path): os.mkdir(report_path)else: passreport_name = ’測試報(bào)告名稱’report_title = ’測試報(bào)告標(biāo)題’report_desc = ’測試報(bào)告描述’with open(report_file, ’wb’) as report: suite.addTests(unittest.TestLoader().loadTestsFromTestCase(MyTestCase)) # 套件結(jié)合 TextTestRunner 對象進(jìn)行運(yùn)行,相當(dāng)于 unittest.mian() # 如果結(jié)合 HTMLTestRunner 使用,則需要調(diào)用 HTMLTestRunner 中的運(yùn)行器 runner = HTMLTestRunner(stream = report, title = report_title, description = report_desc) runner.run(suite)

運(yùn)行 就會成成 report.html 文件,瀏覽器打開該文件,如下所示:

Python自動化之UnitTest框架實(shí)戰(zhàn)記錄

這樣就生成一個比較直觀的測試報(bào)告

總結(jié)

到此這篇關(guān)于Python自動化之UnitTest框架實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Python自動化UnitTest框架實(shí)戰(zhàn)內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 日韩精品专区 | 9色porny自拍视频一区二区 | 精品国产一区二区三区久久久蜜月 | 日韩成人免费 | 亚洲成人av在线 | 国产精品一区二区三区在线 | 日韩精品一区二区三区视频播放 | 国产精品久久久久久久久久久杏吧 | 中文字幕八区 | 北条麻妃一区二区三区中文字幕 | 人人爱夜夜爽日日视频 | 涩久久 | 91小视频网站 | 精品在线一区 | 国产精品69久久久久水密桃 | 激情婷婷 | 亚洲伊人中文字幕 | 国产精品久久久久久吹潮 | 欧美1级| 在线观看免费av的网址 | 中文字幕在线播放一区 | 国产午夜精品一区二区三区嫩草 | 精品免费国产 | 欧美日韩精品综合 | 欧美一区二区三区在线看 | 久久精品一区二区三区四区 | 成人欧美一区二区三区 | 久久久久亚洲美女啪啪 | 在线免费毛片 | 激情国产 | 精品一区二区久久 | 精品亚洲一区二区三区 | 91精品视频在线播放 | 国产精品一区二区在线 | 九色一区二区 | 日韩高清中文字幕 | 91色在线观看 | 精品在线一区二区三区 | 最新日韩av | 日韩欧美一区二区在线观看视频 | 国产精品久久精品 | 成人av影院 | 91在线看 | 嫩草影院地址 | 色综合天天综合网国产成人网 | 欧美性一区二区三区 | 久久久久久久久久久久国产精品 | 国产艹| 中国一级大黄大黄大色毛片 | 国产精品成人网 | 在线看片成人 | av国产精品 | 日本超碰 | 欧美成人一区二区三区片免费 | 亚洲一区在线观看视频 | 欧美激情在线精品一区二区三区 | 国产一级免费视频 | 日韩在线免费视频 | 精品精品 | 国产野精品久久久久久久不卡 | 中文字幕亚洲第一 | 天堂av中文 | 思热99re视热频这里只精品 | 操视频网站 | 日韩中文在线观看 | se69色成人网wwwsex | 亚洲天堂黄色 | 美女视频一区二区三区 | 国产成人精品免高潮在线观看 | 国产成人免费网站 | 北条麻妃一区二区三区中文字幕 | 三区在线观看 | 久草热8精品视频在线观看 欧美全黄 | 91中文字幕在线 | 欧美成人毛片 | 中文字幕第一页在线 | 精品国产一区二区三区在线观看 | 99久久视频 | h视频免费在线 | 狠狠的干 | 亚洲va中文字幕 | 91高清在线 | 亚洲欧美日韩另类一区二区 | 在线 丝袜 欧美 日韩 制服 | k8久久久一区二区三区 | 精品亚洲一区二区三区在线观看 | 久久不射电影网 | 国产一级一级特黄女人精品毛片 | 国产精品网站在线观看 | 亚洲一区二区三区高清 | 欧美日韩免费一区二区三区 | 日韩一区二区在线播放 | 69日影院| 亚洲艹 | 精品亚洲成a人在线观看 | 在线区| 日韩免费一区 | 国产一区二区精品在线 | 亚洲国产免费看 | 欧美日韩精品免费观看视频 | 色黄网站 | 一级欧美片| 久久久久国产精品一区二区三区 | av网站在线免费观看 | 免费在线精品视频 | 91精产国品一二三区在线观看 | 91精品久久久久久综合五月天 | 久操视频在线 | 精品久久国产老人久久综合 | 亚洲男人天堂2023 | 日韩二三区 | 成人在线三级 | 久久亚洲综合 | 国产日韩在线视频 | 日本中文在线 | 国产精选一区二区三区不卡催乳 | 成人免费视频一区二区 | 成人一区二区三区在线 | 欧美三级在线 | 亚洲综合无码一区二区 | 亚洲精品一区二区三区蜜桃久 | 国产一区二区三区四区在线观看 | 亚洲成av人片一区二区三区 | 免费久久久久 | 国内精品久久久久久中文字幕 | 中文字幕在线免费播放 | 免费v片在线观看 | 日韩一区二区三区在线 | 亚洲免费在线看 | 91精品国产一区二区三区四区在线 | 色999视频| 狠狠撸在线视频 | 中文字幕亚洲一区 | 亚洲天堂一区二区 | 久久国产精品一区 | 在线免费成人 | 欧美精三区欧美精三区 | 亚洲国产一区二区三区在线观看 | 伊人av成人 | 亚洲一区中文 | 成人免费淫片aa视频免费 | 日操视频 | 欧美日韩伊人 | 国产1区2区 | 精品一二三区在线观看 | 做视频免费观看网站 | 精品久久ai | 日本一本在线 | 成人免费在线电影 | 懂色av一区二区三区在线播放 | 狠狠操精品视频 | 国产精品1区二区 | 成人免费视频网 | 北条麻妃一区二区三区在线观看 | 午夜视频在线观看网站 | 国产精品一区二区久久 | 国产精品成人国产乱一区 | 高清免费av | 久久成人精品 | 亚洲综合视频在线 | 国产欧美精品一区二区 | 国产精品一区二区三区av | 羞羞视频在线播放 | 国产日韩欧美 | 一区二区三区的视频 | 浴室洗澡偷拍一区二区 | 2021最新热播中文字幕-第1页-看片视频 青青青久草 | 日本久久久亚洲精品 | 国产淫片在线观看 | 久久久网页 | 欧美高清一区 | 91 久久 | 国内精品一区二区 | 日韩中文在线播放 | 在线观看v片 | 欧美视频在线免费看 | 国产精品久久久久久久免费大片 | 九九九九九九精品任你躁 | 黄在线看v| 国产精品久久久久久一区二区三区 | 亚洲第一网站 | 五月婷婷综合网 | 97精品超碰一区二区三区 | 国产高清在线观看 | 蜜臀影院 | 国产视频精品视频 | 久久久久久久久中文字幕 | 91成人精品 | 成人一区二区三区 | 亚洲精品a在线观看 | 亚洲视频一区二区三区 | 日韩91| 亚洲 精品 综合 精品 自拍 | 在线第一页 | 亚洲精品不卡 | 成人久久18 | 久久精品国产一区 | 日韩欧美精品一区 | 久久国产精品免费一区二区三区 | 国产欧美日韩在线 | 在线国产一区 | 色黄视频在线 | 日韩成人免费视频 | 看免费av| 欧美成年人视频 | 成人av免费在线 | 国产成人在线免费观看视频 | 先锋资源久久 | 国产成人精品一区二区三区四区 | 色猫猫国产区一区二在线视频 | 天天操天天添 | 精品成人一区二区 | 久热在线视频 | 国产欧美网址 | 国产精品99久久免费观看 | 久久免费精品 | 国产黑丝在线 | 国产精品久久久久久吹潮 | 国产1级片 | 午夜伦理影院 | 日日爱视频 | 日韩精品一区二区三区中文在线 | 欧美日本亚洲 | 91精品国产综合久久国产大片 | 一级片国产 | 国产精品久久久久久久久久久久 | 一区二区在线免费观看 | 91视频免费观看网址 | 国产精品国产三级国产aⅴ 精品91 | 国产精品毛片久久久久久久 | 国产免费一区二区三区网站免费 | 一区二区三区高清不卡 | 日本另类αv欧美另类aⅴ | 久久国产精品99久久久久久老狼 | 日本在线视频一区二区 | 999久久久国产999久久久 | 久久久精品一区二区三区 | 91在线视频播放 | 日韩一级二级三级 | 黄色av免费看 | 操人视频网站 | 国产精品亚洲一区 | 亚洲欧洲无码一区二区三区 | 午夜精选视频 | 成人精品久久 | 亚洲v日韩v综合v精品v | 日韩在线视频观看免费 | 成人国产网站 | 亚洲一区日韩 | 欧美狠狠操 | 久久只有精品 | 国产精品视频一区二区三区四 | 亚洲国产精品久久久男人的天堂 | 伊人色综合久久天天五月婷 | 91精品视频在线 | 日日射av | 久久久精 | 国产一区二区欧美 | 91视频一区二区三区 | 夸克满天星在线观看 | 欧美国产日韩一区 | 综合天天 | 国产免费av网站 | 亚洲精品一区二区三区在线 | 一级毛片,一级毛片 | 日韩快播电影 | 欧美国产精品一区二区 | 伊人短视频| 婷婷久久综合 | 午夜视频一区二区三区 | 亚洲精品视频在线 | 国产免费一区二区三区最新不卡 | 午夜a v电影 | 在线观看一区 | 色国产精品 | 日韩小视频 | 99视频网站 | 黄视频网站免费看 | 龙珠z普通话国语版在线观看 | 国产在线中文字幕 | 伊人春色成人 | 欧美一区成人 | 午夜看片在线观看 | 91麻豆精品国产91久久久久久久久 | 超碰操 | 2018天天操| 久草久草久草 | 欧美一a一片一级一片 | 欧美极品视频 | 日韩成人一区二区 | 久久777| а√天堂中文在线资源8 | 黄色视频a级毛片 | 一区二区精品 | 色狠狠一区 | 午夜色电影| 91精品一区二区三区久久久久久 | 国产日韩欧美一二三区 | 色伊人网 | 欧美日本一区二区三区 | 久久免费视频观看 | 高清xxxx| 九九成人 | 亚洲成人观看 | 久久久美女 | 国产精品视频一区二区三区 | 麻豆亚洲| 性培育学校羞耻椅子调教h 欧美精品网站 | 97久久精品 | 一区二区日韩精品 | 中国妞videos高潮 | 精品无人乱码一区二区三区 | 国产日韩欧美一区 | 蜜臀av在线播放一区二区三区 | 欧美精品久久久 | 久久2018 | 国产精品美女久久久久aⅴ国产馆 | 久久免费精品 | 日韩成人在线一区 | 亚洲一区在线视频 | www.夜夜操.com | 99热精品在线| 一区二区三区四区不卡视频 | 欧美激情综合色综合啪啪五月 | 日本伊人网站 | 中文字幕久久精品 | 亚洲精品久久 | 欧美激情五月 | 亚洲综合区 | 欧美一区二区三区精品 | 成人av观看 | 久久成人精品视频 | 日韩不卡在线 | 男女视频免费在线观看 | 成人黄页在线观看 | 精品国产乱码久久久久久丨区2区 | 国产免费黄色 | 国产野精品久久久久久久不卡 | 欧美成人一区二区三区片免费 | 成人在线| 国产精品色一区二区三区 | 综合中文字幕 | www.99日本精品片com | 成人h动漫在线看 | 国产高清在线精品一区二区三区 | 色综合久| 日韩福利 | 久久美女视频 | 激情图区在线观看 | 日本1区2区 | 中文字幕亚洲精品 | 欧美激情一区二区三区在线观看 | 黄色毛片免费看 | 福利视频一区二区 | 国产一区二区三区视频 | 亚洲免费精品 | 亚洲精品午夜aaa久久久 | 视频一区 中文字幕 | 91社区在线播放 | 亚洲国产精品自拍 | 欧美日韩精品电影 | 一区视频在线 | 四虎永久在线观看 | 国产成人影院 | 天堂中文在线视频 | 国产精品免费观看 | 中文字幕视频在线 | 91在线精品一区二区 | 免费一区二区三区视频在线 | www.日韩在线视频 | 亚洲精品国产乱码在线看蜜月 | 超碰人人99 | 日韩国产中文字幕 | 亚洲欧美日韩精品久久奇米色影视 | 精品国产乱码久久久久夜 | 在线天堂av| 欧美国产精品一区二区 | 亚欧洲精品视频在线观看 | 亚洲毛片| 91在线视频播放 | 色久天堂 | 91中文字幕在线 | 日本一区不卡 | 日日摸夜夜添夜夜添高潮视频 | 可以在线观看的黄色 | 中文字幕在线观看亚洲 | 亚洲不卡视频在线 | 美女主播精品视频一二三四 | 亚洲超碰av| 91在线精品秘密一区二区 | 一级一级一级毛片 | 亚洲综合在线一区二区 | 欧美日韩中文在线 | 午夜黄色av| 国产精品美女久久久久久免费 | 日韩一区二区三区精品 | 精品久久久久久久 | www视频在线观看 | 欧美日韩高清在线一区 | 久久久久久亚洲精品 | 国产在线视频xxx | 国产色在线| 午夜精品久久久久久久 | 久久激情视频 | 国产日韩一区 | 国产黄色一级大片 | 国产精品久久久久久久竹霞 | 成人欧美一区二区三区白人 | 浴室洗澡偷拍一区二区 | 国产精品人人做人人爽人人添 | 日韩一区二区三区四区五区 | 欧美日韩国产在线观看 | 在线干| 黄色毛片av | 中文字幕日韩欧美一区二区三区 | 久久噜噜噜精品国产亚洲综合 | 99精品欧美一区二区三区综合在线 | 亚洲国产精品成人 | 久久久综合亚洲91久久98 | 精品国产福利 | 精品国产髙清在线看国产毛片 | 欧美综合激情 | 久久国| 在线观看视频一区二区三区 | 日日操夜夜操天天操 | 亚洲免费网 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 日韩在线不卡 | 私人毛片免费高清视频 | 久久99精品久久久久久噜噜 | 999精品免费| 色视频免费在线观看 | 99精品免费视频 | 国产91av视频在线观看 | 日韩精品在线观看免费 | xvideos.蜜桃一区二区 | 九九九九九九精品任你躁 | 国产成人一区二区三区影院在线 | 麻豆沈芯语在线观看 | 国产成人精品亚洲日本在线观看 | 亚洲国产精品久久久久久女王 | 欧美一区视频 | 一区二区成人在线 | 欧美成年黄网站色视频 | 日韩视频一区二区 | 国产 日韩 欧美 中文 在线播放 | 亚洲最大免费视频 | 91精品国产91久久综合桃花 | 日韩一区二区三区四区五区 | 久综合网| 亚洲 中文 欧美 日韩 在线观看 | 国产成人精品亚洲777人妖 | 午夜影院色| 久久精品伊人 | 色噜噜视频在线观看 | 一区二区三区国产 | www国产亚洲精品久久网站 | 在线欧美亚洲 | 天天久久| 欧美精品成人 | 最新中文字幕在线 | 欧美亚洲一区 | 91网在线观看| 国产精品一区欧美 | 国产精品美女视频一区二区三区 | 午夜不卡一区二区 | 亚洲最新中文字幕 | 狠狠天天 | 一区二区三区影院 | 国产精品婷婷午夜在线观看 | 亚洲天堂久久 | 日韩成人影院 | 成人免费av | 在线h观看 | 神马久久久久久久久久 | 91最新网站 | 国产一区二区视频精品 | 伊人网站| 久久99精品久久久久国产越南 | 精品视频一区二区三区 | 国产成人精品在线 | 日本免费一区二区视频 | 成人在线三级 | 国产精品一区二区精品 | 久久精彩视频 | 亚洲高清av在线 | av黄在线观看 | 奇米成人影视 | 在线一区观看 | 黄色电影在线免费观看 | 久久精品极品 | 狠狠艹夜夜艹 | 成人免费毛片嘿嘿连载视频 | 国产精品免费看 | 欧美黄色网 | 在线观看欧美一区 | 日韩免费 | 久久综合久久久 | 国产一区亚洲 | 亚洲男人的天堂网站 | 中文字幕在线观看的电影 | 综合99 | 欧美激情专区 | 啪啪免费网站 | 色婷婷综合网 | 亚洲一区二区三区四区五区中文 | 91精品国产综合久久久久久蜜月 | 日韩成人在线一区 | 欧洲一级毛片 | 不用播放器的免费av | 人人干人人干人人干 | 日韩激情网 | 最新一级毛片 | 久久久国产视频 | 午夜影院免费 | 欧美中文字幕在线 | 国产精自产拍久久久久久 | 色婷婷久久一区二区三区麻豆 | 日韩在线短视频 | 免费av片在线 | 国产视频久久久久 | 国产97久久 | 亚洲精选一区 | 国产综合精品一区二区三区 | 北条麻妃99精品青青久久 | 亚洲欧美激情另类 | 国产无毛 | 精品99久久久久久 | 久草成人 | 一区二区三区在线免费看 | 国产精品久久久久久久久久东京 | 夜久久| 久久91视频 | 成人在线观看h | 国产中文一区 | 嫩草精品 | 午夜精品一区二区三区免费视频 | av成人在线观看 | 丁香五月网久久综合 | 成人国产在线 | 亚洲一区二区日韩 | 成人男女激情免费视频 | 亚洲性人人天天夜夜摸 | 国产一区二区欧美 | 一级毛片免费完整视频 | 久草网站| 一区二区av| 青青99 | 国产三级在线 | 天天操网 | 99精品视频在线 | 亚州中文字幕蜜桃视频 | 日韩精品一区二区三区在线播放 | 亚洲码欧美码一区二区三区 | 中文字幕亚洲欧美日韩在线不卡 | 日韩在线视频观看 | 成人一区二区在线 | 中文字幕乱码亚洲精品一区 | 国产精自产拍久久久久久 | 秋霞在线一区 | 国产福利在线观看视频 | 四虎影院观看 | 美女久久| 中文字幕一区二区三区乱码图片 | 中文字幕在线视频精品 | 亚洲av毛片一级二级在线 | 久久国产一区二区三区 | 野狼在线社区2017入口 | 欧美精品一区在线观看 | 三级黄色片在线观看 | www久久精品| 久久久久久久免费 | 欧美日韩在线视频一区二区 | 亚洲精选一区二区 | 在线99 | 日韩一区在线播放 | 91精品久久 | 91电影在线 | 在线观看免费的av | 久久久久久99 | 亚洲一区二区三区免费视频 | 国产视频综合在线 | 欧美日韩一区二区三区在线观看 | 在线视频一区二区 | 日本videos18高清hd下 | 亚洲一级毛片 | 成年人视频免费在线看 | 日韩国产在线播放 | 久久久久国产 | 久久久久网站 | 久久久久久九九九九九九 | 欧美一区二区在线 | 特级淫片裸体免费看 | 精品国产一区二区三区久久久蜜臀 | 91精品综合久久久久久五月天 | 亚洲综合国产 | 欧美一区在线看 | 国产精品一区二区在线 | 欧美不卡视频一区发布 | 国产欧美日韩精品一区二区三区 | 精品久久精品久久 | 综合网av | 91麻豆精品国产91久久久久久久久 | 伊人激情综合 | 91大神免费观看 | 黄色片网站在线免费观看 | 91精品福利| 国产在线综合视频 | www.久久| 久久亚洲一区二区三区四区 | 欧美性www | 欧美日韩二区三区 | www.久久久.com| 亚洲在线观看免费视频 | 在线观看你懂的网站 |