python學習筆記9-單元測試unittest

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

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

TestCase 也就是測試用例api

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

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

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

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

import unittest
from BeautifulReport  import BeautifulReport
def calc(x,y):
    return x+y
class TestCalc(unittest.TestCase):
    def test_pass_case(self):   #用例必定要以test開頭
        print('這個經過用例')
        res=calc(1,2)
        self.assertEqual(3,res)
    def setUp(self):#執行每一個用例前的操做
        print('我是setup..')
    def tearDown(self):#執行每一個用例後的操做
        print('我是teardown')

    @classmethod
    def setUpClass(cls):#執行這個類全部case前的操做
        print('我是setupclass')
    @classmethod
    def tearDownClass(cls):#執行完這個類全部case後的操做
        print('我是teardownclass')

    def test_a(self):
        print('a')

    def test_fail_case(self):
        print('這是失敗的測試用例')
        res=calc(9,8)
        self.assertEqual(98,res)

if __name__=='__main__':
    #unittest.main() #單獨執行這個類中的case

    # suite=unittest.TestSuite()
    # suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCalc))
    # runner = unittest.TextTestRunner(verbosity=2)
    # runner.run(suite)

    suite = unittest.TestSuite()
    suite.addTests(unittest.makeSuite(TestCalc))#這個類裏面的全部測試案例
    result=BeautifulReport(suite)
    result.report(filename='測試報告',description='描述',log_path='.')

一些常見的斷言:3d

        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的測試報告,裏面會有每一個測試用例的執行結果,代碼以下:xml

        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文件,而後找到裏面的測試用例,逐個執行,代碼以下:htm

        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格式的報告了,並且還自動把日期加上了

相關文章
相關標籤/搜索