python+unittest框架第二天unittest之簡單認識Test Suite:測試套件


  今天了解下測試套件Test Suite,什么是測試套件,測試套件是由多個Test Case測試用例組成的,當然也可以由多個子測試套件組成。

接下來看下如果構建測試套件,構建測試套件的方法:

1、用unittest.TestSuite()實例化測試套件對象后,內部的addTest()方法對測試類內部的測試案例進行逐一添加。

 1 import unittest                     #導入unittest
 2 import time as t                    #導入time  設置別名 t
 3 from selenium import webdriver      #導入selenium中的webdriver
 4 
 5 class page_baidu(unittest.TestCase):       #定義一個類,並繼承unittest.TestCase類
 6 
 7     @classmethod                           #使用 @classmethod  裝飾器函數,把方法變成類方法,可以直接調用方法,不需要實例化類對象就可以調用方法
 8     def setUp(cls):
 9         cls.driver = webdriver.Chrome()
10         cls.driver.maximize_window()
11         cls.driver.implicitly_wait(15)
12         cls.driver.get(r'http://www.baidu.com')
13         t.sleep(2)
14     @classmethod
15     def tearDown(cls):
16         cls.driver.quit()
17 
18     '''以下案例是測試百度首頁鏈接'''
19     def test_baidu_001(self):     #案例001  測試進入百度新聞界面
20         '''測試百度首新聞鏈接'''
21         self.driver.find_element_by_link_text('新聞').click()    #點擊百度頁面,超鏈接【新聞】兩個字
22         t.sleep(2)     #設置強制等待2秒,就是必須等待,用導入的time中的sleep方法,不是全局性,哪里需要設置到哪里,局部的
23         self.driver.back()
24     def test_baidu_002(self):      #案例002  測試進入百度地圖界面
25         '''測試百度首地圖鏈接'''
26         self.driver.find_element_by_link_text('地圖').click()   ##點擊百度頁面,超鏈接【地圖】兩個字
27         t.sleep(2)
28         self.driver.back()
29 
30     '''以下案例是測試百度首頁搜索'''
31     def test_baidu_003(self):
32         '''測試百度首頁搜索功能'''
33         self.driver.find_element_by_id('kw').send_keys('你好朋友')
34         self.driver.back()
35 if __name__ =='__main__':
36     suite =unittest.TestSuite()    #對測試套件這個類進行實例化對象的操作,方便后面調用它里面的方法
37     suite.addTest(page_baidu('test_baidu_001'))   #addTest()是TestSuite()類中的添加測試用例的方法
38     suite.addTest(page_baidu('test_baidu_002'))   #我們用addTest()方法添加page_baidu()這個測試類中的測試案例
39     suite.addTest(page_baidu('test_baidu_003'))
40     unittest.TextTestRunner(verbosity=2).run(suite)   #用TextTestResult生成測試結果,結果是根據測試套件中的案例生成

這樣的方法很奇怪,如果測試類中有100個測試案例,我要這樣suite.addTest(page_baidu('第N個測試點')) 去添加100個嗎?這樣的代碼冗余是不是太多了~

所以接下來我們看第二個方法:一次性將整個測試案例類中的所有案例都添加到測試套件中

 

 1 import unittest                     #導入unittest
 2 import time as t                    #導入time  設置別名 t
 3 from selenium import webdriver      #導入selenium中的webdriver
 4 
 5 class page_baidu(unittest.TestCase):       #定義一個類,並繼承unittest.TestCase類
 6 
 7     @classmethod                           #使用 @classmethod  裝飾器函數,把方法變成類方法,可以直接調用方法,不需要實例化類對象就可以調用方法
 8     def setUp(cls):
 9         cls.driver = webdriver.Chrome()
10         cls.driver.maximize_window()
11         cls.driver.implicitly_wait(15)
12         cls.driver.get(r'http://www.baidu.com')
13         t.sleep(2)
14     @classmethod
15     def tearDown(cls):
16         cls.driver.quit()
17 
18     '''以下案例是測試百度首頁鏈接'''
19     def test_baidu_001(self):     #案例001  測試進入百度新聞界面
20         '''測試百度首新聞鏈接'''
21         self.driver.find_element_by_link_text('新聞').click()    #點擊百度頁面,超鏈接【新聞】兩個字
22         t.sleep(2)     #設置強制等待2秒,就是必須等待,用導入的time中的sleep方法,不是全局性,哪里需要設置到哪里,局部的
23         self.driver.back()
24     def test_baidu_002(self):      #案例002  測試進入百度地圖界面
25         '''測試百度首地圖鏈接'''
26         self.driver.find_element_by_link_text('地圖').click()   ##點擊百度頁面,超鏈接【地圖】兩個字
27         t.sleep(2)
28         self.driver.back()
29 
30     '''以下案例是測試百度首頁搜索'''
31     def test_baidu_003(self):
32         '''測試百度首頁搜索功能'''
33         self.driver.find_element_by_id('kw').send_keys('你好朋友')
34         self.driver.back()
35 if __name__ =='__main__':
36     suite =unittest.TestSuite()    #對測試套件這個類進行實例化對象的操作,方便后面調用它里面的方法
37     suite.addTest(page_baidu())   #addTest()是TestSuite()類中的添加測試用例的方法,用addTest()方法添加page_baidu()這個測試類中的所有測試案例
38     unittest.TextTestRunner(verbosity=2).run(suite)   #用TextTestResult生成測試結果,結果是根據測試套件中的案例生成

 一般在將測試類中的所有測試案例放入套件中用makeSuite()方法,他是unittest中的方法。

makeSuite():一次性將整個,測試類文件下所有測試用例到suite中去。代碼:注意!!makeSuite()  這個方法括號中的參數是一個類哦!!!

 1 import unittest                     #導入unittest
 2 import time as t                    #導入time  設置別名 t
 3 from selenium import webdriver      #導入selenium中的webdriver
 4 
 5 class page_baidu(unittest.TestCase):       #定義一個類,並繼承unittest.TestCase類
 6 
 7     @classmethod                           #使用 @classmethod  裝飾器函數,把方法變成類方法,可以直接調用方法,不需要實例化類對象就可以調用方法
 8     def setUp(cls):
 9         cls.driver = webdriver.Chrome()
10         cls.driver.maximize_window()
11         cls.driver.implicitly_wait(15)
12         cls.driver.get(r'http://www.baidu.com')
13         t.sleep(2)
14     @classmethod
15     def tearDown(cls):
16         cls.driver.quit()
17 
18     '''以下案例是測試百度首頁鏈接'''
19     def test_baidu_001(self):     #案例001  測試進入百度新聞界面
20         '''測試百度首新聞鏈接'''
21         self.driver.find_element_by_link_text('新聞').click()    #點擊百度頁面,超鏈接【新聞】兩個字
22         t.sleep(2)     #設置強制等待2秒,就是必須等待,用導入的time中的sleep方法,不是全局性,哪里需要設置到哪里,局部的
23         self.driver.back()
24     def test_baidu_002(self):      #案例002  測試進入百度地圖界面
25         '''測試百度首地圖鏈接'''
26         self.driver.find_element_by_link_text('地圖').click()   ##點擊百度頁面,超鏈接【地圖】兩個字
27         t.sleep(2)
28         self.driver.back()
29 
30     '''以下案例是測試百度首頁搜索'''
31     def test_baidu_003(self):
32         '''測試百度首頁搜索功能'''
33         self.driver.find_element_by_id('kw').send_keys('你好朋友')
34         self.driver.back()
35 if __name__ =='__main__':
36     # suite =unittest.TestSuite()    #對測試套件這個類進行實例化對象的操作,方便后面調用它里面的方法
37     # suite.unittest.makeSuite(page_baidu)  #一次性將整個,測試類文件下所有測試用例到suite中去。
38     suite = unittest.TestSuite(unittest.makeSuite(page_baidu))  #將上面的兩行代碼合並成一行來寫
39     unittest.TextTestRunner(verbosity=2).run(suite)   #用TextTestResult生成測試結果,結果是根據測試套件中的案例生成

我們再看看TestLoader()這個類中提供的幾種創建測試套件(test Suite)的方法:

1、TestLoader().loadTestsFromTestCase(testCaseClass)   :該方法是可以將類中的案例都加載到測試套件中,括號中的參數是類

 1 import unittest                     #導入unittest
 2 import time as t                    #導入time  設置別名 t
 3 from selenium import webdriver      #導入selenium中的webdriver
 4 
 5 class page_baidu(unittest.TestCase):       #定義一個類,並繼承unittest.TestCase類
 6 
 7     @classmethod                           #使用 @classmethod  裝飾器函數,把方法變成類方法,可以直接調用方法,不需要實例化類對象就可以調用方法
 8     def setUp(cls):
 9         cls.driver = webdriver.Chrome()
10         cls.driver.maximize_window()
11         cls.driver.implicitly_wait(15)
12         cls.driver.get(r'http://www.baidu.com')
13         t.sleep(2)
14     @classmethod
15     def tearDown(cls):
16         cls.driver.quit()
17 
18     '''以下案例是測試百度首頁鏈接'''
19     def test_baidu_001(self):     #案例001  測試進入百度新聞界面
20         '''測試百度首新聞鏈接'''
21         self.driver.find_element_by_link_text('新聞').click()    #點擊百度頁面,超鏈接【新聞】兩個字
22         t.sleep(2)     #設置強制等待2秒,就是必須等待,用導入的time中的sleep方法,不是全局性,哪里需要設置到哪里,局部的
23         self.driver.back()
24     def test_baidu_002(self):      #案例002  測試進入百度地圖界面
25         '''測試百度首地圖鏈接'''
26         self.driver.find_element_by_link_text('地圖').click()   ##點擊百度頁面,超鏈接【地圖】兩個字
27         t.sleep(2)
28         self.driver.back()
29 if __name__ =='__main__':
30     suite = unittest.TestLoader().loadTestsFromTestCase(page_baidu)  #TestLoader()這個類提供了loadTestsFromTestCase()方法,參數是類或者子類。
31     unittest.TextTestRunner(verbosity=2).run(suite)   #用TextTestResult生成測試結果,結果是根據測試套件中的案例生成

2、TestLoader().loadTestsFromModule(module, pattern=None)   :該方法是加載一個模塊文件中的所有測試類,一個  .py文件就是一個模塊哦,前面筆記有詳細說過。

我們看下,下面的筆記,筆記中的.py文件的名字是:bokeyuan--unitagin.py     此模塊下面有兩個測試類,第一個類是:page_baidu_lianjie

第二個類是:page_baidu_sousuo     所以加載的是這個模塊下面的兩個類中的所有測試案例方法。記住,括號中的參數是.py文件名,另外記得帶英文引號!!!

看代碼:

 1 import unittest                     #導入unittest
 2 import time as t                    #導入time  設置別名 t
 3 from selenium import webdriver      #導入selenium中的webdriver
 4 
 5 class page_baidu_lianjie(unittest.TestCase):       #定義一個類,並繼承unittest.TestCase類
 6     '''這個類中的方法是測試百度首頁鏈接'''
 7     @classmethod                           #使用 @classmethod  裝飾器函數,把方法變成類方法,可以直接調用方法,不需要實例化類對象就可以調用方法
 8     def setUp(cls):
 9         cls.driver = webdriver.Chrome()
10         cls.driver.maximize_window()
11         cls.driver.implicitly_wait(15)
12         cls.driver.get(r'http://www.baidu.com')
13         t.sleep(2)
14     @classmethod
15     def tearDown(cls):
16         cls.driver.quit()
17 
18     '''以下案例是測試百度首頁鏈接'''
19     def test_baidu_001(self):     #案例001  測試進入百度新聞界面
20         '''測試百度首新聞鏈接'''
21         self.driver.find_element_by_link_text('新聞').click()    #點擊百度頁面,超鏈接【新聞】兩個字
22         t.sleep(2)     #設置強制等待2秒,就是必須等待,用導入的time中的sleep方法,不是全局性,哪里需要設置到哪里,局部的
23         self.driver.back()
24     def test_baidu_002(self):      #案例002  測試進入百度地圖界面
25         '''測試百度首地圖鏈接'''
26         self.driver.find_element_by_link_text('地圖').click()   ##點擊百度頁面,超鏈接【地圖】兩個字
27         t.sleep(2)
28         self.driver.back()
29 
30 class page_baidu_sousuo(unittest.TestCase):       #定義一個類,並繼承unittest.TestCase類
31     '''這個類中的方法是測試百度首頁搜索功能'''
32     @classmethod                           #使用 @classmethod  裝飾器函數,把方法變成類方法,可以直接調用方法,類本身就不在需要實例化類對象就可以調用此方法
33     def setUp(cls):
34         cls.driver = webdriver.Chrome()
35         cls.driver.maximize_window()
36         cls.driver.implicitly_wait(15)
37         cls.driver.get(r'http://www.baidu.com')
38         t.sleep(2)
39     @classmethod
40     def tearDown(cls):
41         cls.driver.quit()
42 
43     '''以下案例是測試百度首頁搜索功能'''
44     def test_baidu_003(self):
45         '''測試百度首頁搜索功能'''
46         self.driver.find_element_by_id('kw').send_keys('你好朋友')
47 
48 if __name__ =='__main__':
49     suite = unittest.TestLoader().loadTestsFromModule('bokeyuan--unitagin.py')   #TestLoader()類中的loadTestsFromModule方法,提供加載模塊中的所有測試類,括號中的參數是模塊文件名稱
50     unittest.TextTestRunner(verbosity=2).run(suite)   #用TextTestResult生成測試結果,結果是根據測試套件中的案例生成

 

代碼越來越長,所以截圖是截取重要部分~~~

接下來我們優化之前的代碼,將測試套件這部分代碼,封裝成方法:

 1 import unittest                     #導入unittest
 2 import time as t                    #導入time  設置別名 t
 3 from selenium import webdriver      #導入selenium中的webdriver
 4 class page_baidu_sousuo(unittest.TestCase):       #定義一個類,並繼承unittest.TestCase類
 5     '''這個類中的方法是測試百度首頁搜索功能'''
 6     @classmethod                           #使用 @classmethod  裝飾器函數,把方法變成類方法,可以直接調用方法,類本身就不在需要實例化類對象就可以調用此方法
 7     def setUp(cls):
 8         cls.driver = webdriver.Chrome()
 9         cls.driver.maximize_window()
10         cls.driver.implicitly_wait(15)
11         cls.driver.get(r'http://www.baidu.com')
12         t.sleep(2)
13     @classmethod
14     def tearDown(cls):
15         cls.driver.quit()
16 
17     '''以下案例是測試百度首頁搜索功能'''
18     def test_baidu_003(self):
19         '''測試百度首頁搜索功能'''
20         self.driver.find_element_by_id('kw').send_keys('你好朋友')
21 
22     @staticmethod   #靜態方法分離測試套件,不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。類.方法().看最后的代碼調用:page_baidu_lianjie.suite()
23     def suite():
24         suite = unittest.TestSuite(unittest.makeSuite(page_baidu_sousuo))   #將測試套件單獨分離出,封裝成方法,直接調用,以后就不用再每次都寫
25         return suite  #將測試套件返回,如果不寫return返回,那么將不會將內容返回給調用方下面的run()
26 
27 if __name__ =='__main__':
28     unittest.TextTestRunner(verbosity=2).run(page_baidu_sousuo.suite())   #run()接收封裝的suite()方法的返回參數,進行測試套件的執行載入,然后生成報告

 

總結:
1、TestSuite類中的addTest()方法來載入單體案例
2、TestSuite類中的addTest()方法來載入類中的整個案例,就是直接寫測試類的類名
3、TestSuite類中的makeSuite()方法,一次性將整個,測試類文件下所有測試用例到suite中去。代碼:注意!!makeSuite()  這個方法括號中的參數是一個類哦!!!
4、利用unittest中的TestLoader()類的loadTestsFromTestCase(testCaseClass)方法   :該方法是可以將類中的案例都加載到測試套件中,括號中的參數是類名
5、利用unittest中的TestLoader()類的loadTestsFromModule(module, pattern=None)方法 :該方法是加載一個模塊文件中的所有測試類,一個 .py文件就是一個模塊哦
6、測試套件可以單獨分離出去,利用靜態函數,將它封裝成一個方法,可以直接類.函數()的調用方式,不需要實例化參數,因為有裝飾器函數@staticmethod
重點,重點!!!----》要使用某個類的方法,需要先實例化一個對象再調用方法。
而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。
下面是兩個裝飾器函數的區別:
@staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
@classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。



 

接下來的筆記就是測試固件的分離以及后續的斷言~~~

-----來自新手的筆記,希望能幫助大初學者,如果有錯誤的筆記,希望大家給予幫助!盡量把代碼的注釋寫精准,方便后續學習,也方便其他初學者參考~~謝謝各位!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM