unitest框架--認識與基本使用


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()

 


免責聲明!

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



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