1、import unitest------套路1,必須導入!! 2、#創建測試類--------------------套路2,測試名自取,最好首字母大寫,必須繼承unitest下的Testcase類!!! class 測試名(unitest.TestCase): 3、def setup(self):#--------------->鈎子方法,所有用例執行前,都會執行這個方法,所以一般存放初始化內容,一般... 4、def test_01(self):#------------->第一條測試用例,注意!!方法名必須為test開頭(如果存在某條用例名不是test開頭,那么使用main()執行時,則不會運行到)
5、def teardown(self):#------------->執行完一條用例后,都會執行這個
#最后:------------------------->這是最簡單的執行測試用例的方法 if __name__=='__main__': unittest.main();#------->運行當前所有的測試用例(以test開頭的)
二、但是每執行一條用例,都會setup(),teardown(),有多少用例,就執行多少次,很明顯很浪費時間
因此!分別把setup(self)、teardown(self)方法改為類方法setupclass(cls)、teardownClass(cls),加上@classmethod修飾,如下面所示
1 class Test_my_unit(unittest.TestCase): 2 @classmethod 3 def setUpClass(cls): 4 print('START') 5 6 def test_01(self): 7 print('第一個測試用例'); 8 9 def test_02(self): 10 print('第二個測試用例') 11 12 def test_03(self): 13 print('第三個測試用例') 14 15 def test_04(self): 16 print('第四個測試用例'); 17 @classmethod 18 def tearDownClass(cls): 19 print('結束');
結果(滿足要求):
3、用例執行順序
根據ASCII碼的順序加載測試用例,數字與字母的順序為:0-9---->A-Z------>a-z。所以以A開頭的測試用例方法會優先執行,以a開頭會后執行
那么~如果要指定用例執行順序的話,就要將命名規范的意思咯
為什么只執行最后一個用例
6、使用testsuit指定測試集
7、通過discover來批量執行用例
#第一個參數:開始查找的目錄:os.getcwd(),說明從當前路徑開始找 #第二個參數:匹配規則:匹配規則為【test*.py】,以名字中含有test的py文件都開始遍歷 #第三個參數:測試模塊的頂層目錄,沒有的話,默認為None
#使用discover()方法,切記測試用例中需要執行的測試方法必須以test開頭,否則無法加載!!!
discovers=unittest.defaultTestLoader.discover(os.getcwd(),pattern='test*.py',top_level_dir=None); suit.addTest(discovers); #unittest.main(suit); #suit = unittest.TestLoader().loadTestsFromTestCase(Testlianxi2); runner=HTMLTestRunner.HTMLTestRunner( stream=re_open, title=u'測試標題', description=u'測試描述' ) runner.run(suit);
疑問
1 如果當前只有一個test類,執行unittest.main();時,就執行test下的所有test開頭的用例,若一個py文件中,含有多個test類,執行unittest.main();時,則按順序依次執行兩個test類下的所有testcase
2、如果用例名稱不規范時(或者只需要運行指定的用例時),則需要使用suit來指定運行
8、跳過用例(python3.1以后支持)
①、想要無條件跳過用例,只需要在該用例的方法上安上裝飾器
@unittest.skip('跳過沒商量') def haha_02(self): #第一條測試用例,檢查對象的字段是否正確 self.assertEqual('this is test_string',self.test_string);
②、判斷條件,如果條件為真,那么執行,否則則跳過用例
@unittest.skipIf(False,'有條件')--------->執行 def haha_02(self): #第一條測試用例,檢查對象的字段是否正確 self.assertEqual('this is test_string',self.test_string); @unittest.skipIf(True,'有條件')---------->不執行 def haha_02(self): #第一條測試用例,檢查對象的字段是否正確 self.assertEqual('this is test_string',self.test_string);
例子如下
lass DemoTest(unittest.TestCase): status = 200 def setUp(self): self.url = 'http://www.cnblogs.com/imyalost/' @unittest.skip(u"無條件跳過該測試") def test_blog1(self): # 無條件跳過 r1 = requests.get(self.url) @unittest.skipIf(status > 200, u"狀態碼大於200,就跳過該測試") def test_blog2(self): # 如果斷言結果為真,則繼續執行,否則跳過測試 r2 = requests.get(self.url) status2 = r2.status_code self.assertTrue(status2 > self.status) @unittest.skipUnless(status == 404, u"狀態碼為200,則跳過") def test_blog3(self): # 除非結果為真,否則跳過該測試 r3 = requests.get(self.url) status3 = r3.status_code self.assertTrue(status3 > self.status) @unittest.expectedFailure def test_blog4(self): # 將測試用例標記為“預期失敗”,如果測試執行時失敗,則測試結果不計為失敗 r4 = requests.get(self.url+'/test4') status4 = r4.status_code self.assertTrue(status4 ==self.status) def tearDown(self): pass if __name__ == '__main__': unittest.main()