【Python】幾種測試框架對比-unittest

Python中有一個自帶的單元測試框架是unittest模塊,用它來作單元測試,它裏面封裝好了一些校驗返回的結果方法和一些用例執行前的初始化操做。html

在說unittest以前,先說幾個概念:python

TestCase 也就是測試用例api

TestSuite 多個測試用例集合在一塊兒,就是TestSuite框架

TestLoader是用來加載TestCase到TestSuite中的單元測試

TestRunner是來執行測試用例的,測試的結果會保存到TestResult實例中,包括運行了多少測試用例,成功了多少,失敗了多少等信息測試

下面寫一個簡單的單元測試用例ui

複製代碼
import unittest

class MyTest(unittest.TestCase):  # 繼承unittest.TestCase
    def tearDown(self):
        # 每一個測試用例執行以後作操做
        print('111')

    def setUp(self):
        # 每一個測試用例執行以前作操做
        print('22222')

    @classmethod
    def tearDownClass(self):
    # 必須使用 @ classmethod裝飾器, 全部test運行完後運行一次
         print('4444444')
    @classmethod
    def setUpClass(self):
    # 必須使用@classmethod 裝飾器,全部test運行前運行一次
        print('33333')

    def test_a_run(self):
        self.assertEqual(1, 1)  # 測試用例
        
    def test_b_run(self):
        self.assertEqual(2, 2)  # 測試用例
        
if __name__ == '__main__':
    unittest.main()#運行全部的測試用例
複製代碼

下面是一些經常使用的斷言,也就是校驗結果spa

複製代碼
        assertEqual(a, b)     a == b      
        assertNotEqual(a, b)     a != b      
        assertTrue(x)     bool(x) is True      
        assertFalse(x)     bool(x) is False      
        assertIsNone(x)     x is None     
        assertIsNotNone(x)     x is not None   
        assertIn(a, b)     a in b    
        assertNotIn(a, b)     a not in b
複製代碼

那如何生成一個測試報告呢,須要加入另一個模塊了,HTMLTestRunner,這個模塊須要本身安裝,使用執行測試用例就會生成一個html的測試報告,裏面會有每一個測試用例的執行結果,代碼以下:code

複製代碼
        import HTMLTestRunner        
        import unittest
        class MyTest(unittest.TestCase):#繼承unittest.TestCase
            def tearDown(self):
                #每一個測試用例執行以後作操做
                print('111')
            def setUp(self):
                #每一個測試用例執行以前作操做
                print(22222)
            def test_run(self):
                # self.assertEqual(1,1)
                self.assertIs(1,1)
                #測試用例
            def test_run2(self):
                # self.assertEqual(1,1)
                self.assertIs(1,1)
                #測試用例
            def test_run3(self):
                # self.assertEqual(1,1)
                self.assertIs(1,1)
                #測試用例
            def test_run1(self):
                # self.assertEqual(1,1)
                self.assertIs(1,1)
                #測試用例
        if __name__ == '__main__':
            test_suite = unittest.TestSuite()#建立一個測試集合
            test_suite.addTest(MyTest('test_run1'))#測試套件中添加測試用例
            #test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加全部的測試方法
            fp = open('res.html','wb')#打開一個保存結果的html文件
            runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='api測試報告',description='測試狀況')
            #生成執行用例的對象
            runner.run(test_suite)
            #執行測試套件
複製代碼

若是咱們有不少個模塊,每一個模塊下面都寫了不少python文件,每一個python文件裏面都有測試用例,那怎麼把這個目錄下的用例都執行了呢,就要先找到這個目錄下的全部python文件,而後找到裏面的測試用例,逐個執行,代碼以下:xml

複製代碼
        import unittest,HTMLTestRunner
        suite = unittest.TestSuite()#建立測試套件
        all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
        #找到某個目錄下全部的以test開頭的Python文件裏面的測試用例
        for case in all_cases:
            suite.addTests(case)#把全部的測試用例添加進來
        fp = open('res.html','wb')
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='全部測試狀況')
        runner.run(suite)
        #運行測試
複製代碼

咱們在後續進行持續集成的時候,要讓代碼自動運行,就會用到Jenkins了,可是上面產生的測試報告都是html格式的,Jenkins不認識,就在Jenkins裏面顯示不出來。那我們就要產生一些Jenkins認識的測試報告,Jenkins認識xml格式的報告,那我們就產生xml格式的唄,就須要用一個新的模塊,xmlrunner,安裝直接 pip install xmlrunner便可,代碼以下:

複製代碼
import unittest
import xmlrunner
#導入這個模塊
class My(unittest.TestCase):
 
    def test1(self,a,b,c):
        self.assertEqual(a+b,c)
 
if __name__=='__main__':
    test_suite = unittest.TestSuite()
    test_suite.addTest(unittest.makeSuite(My))
    runner = xmlrunner.XMLTestRunner(output='report')#指定報告放的目錄
    runner.run(test_suite)
複製代碼

而後我們運行,能夠看到在report目錄下已經產生了xml格式的報告了,並且還自動把日期加上了

 

本文摘自:http://www.javashuo.com/article/p-nbacouih-q.html

相關文章
相關標籤/搜索