python之使用單元測試框架unittest執行自動化測試

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

單元測試框架即一堆工具的集合。python

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

TestCase 也就是測試用例sql

TestSuite 多個測試用例集合在一塊兒,就是TestSuite瀏覽器

TestLoader是用來加載TestCase到TestSuite中的app

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

unittest單元測試 --- 「代碼驅動」(用例是用代碼寫的),也支持「數據驅動」,將數據存在文件裏去取數據
atp-根據excel,用例寫在Excel裏的,屬於「數據驅動」
工具

 

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

import unittest #導入unittest


def calc(a,b): return a/b class TestCalc(unittest.TestCase): # 繼承unittest.TestCase
 @classmethod def setUpClass(cls): #必須使用 @ classmethod裝飾器, 全部test運行以前運行一次
        print('我是setupClass') @classmethod def tearDownClass(cls): #必須使用 @ classmethod裝飾器, 全部test運行結束後運行一次
        print('我是tearDownClass') def setUp(self):#每條用例執行以前都會先執行它
        print('我是setup') def tearDown(self):#每條用例執行以後都會執行它
        print('我是teardown') def test_calc1(self): #下面的三引號/雙引號中顯示的是描述信息
        '''測試正常的'''
        # result = calc(2,1)
        # self.assertEqual(2,result,'除法運算不正確')
        print('calc1') def test_calc2(self): print('calc2') "測試異常的"
        # result = calc(2, 2)
        # self.assertEqual(1,2,'結果不正確')

    def test_mysql(self): '''測試mysql'''
        print('test_mysql') def test_login(self): '''測試登陸'''
        print('print test_login') def test_abc(self): print('abc') def test_zbc(self): print('zbc') def test_fail(self): self.assertEqual(1,2,msg='測試失敗的') #msg表示若是代碼執行失敗,則打印的信息
 unittest.main() #運行當前文件裏面的全部測試用例 #執行順序:執行全部以test開頭的方法/用例,且按照方法/用例名稱A-Z順序執行,而不是按照書寫順序

 

#以上代碼運行結果以下:
我是setupClass ...F... ====================================================================== 我是setup FAIL: test_fail (__main__.TestCalc) abc 我是teardown 我是setup calc1 我是teardown ---------------------------------------------------------------------- 我是setup calc2 Traceback (most recent call last): 我是teardown File "E:/Python學習/pycharm/python腳本/day12/單元測試unittest.py", line 58, in test_fail 我是setup 我是teardown self.assertEqual(1,2,msg='測試失敗的') #msg表示若是代碼執行失敗,則打印的信息
我是setup AssertionError: 1 != 2 : 測試失敗的 print test_login 我是teardown 我是setup ---------------------------------------------------------------------- test_mysql Ran 7 tests in 0.001s 我是teardown 我是setup FAILED (failures=1) zbc 我是teardown 我是tearDownClass

 

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

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

HTML TestRunner:
用來產生測試報告的HTML TestRunner放入python安裝目錄下(sys.path目錄),在打開pycharm的External Libraries -> Python 3.6.5有顯示目錄(C:\ProgramData\Anaconda3)
使用的時候直接 import HTML TestRunner便可

代碼以下:

# test_suite = unittest.TestSuite() #建立一個測試集合 # test_suite.addTest(TestCalc('test_zbc')) #測試套件中添加測試用例

if __name__ == '__main__': # 產生很差看的報告:HTMLTestRunner
    f = open('report.html','wb') #打開一個保存結果的HTML文件
    runner = HTMLTestRunner.HTMLTestRunner(stream=f, description='測試報告裏面的描述', title='接口測試報告') #生成執行用的對象
    test_suite = unittest.makeSuite(TestCalc) #把這個類變成一個測試集合
    runner.run(test_suite)#運行用例套件

 

#以上代碼執行結果
...F...我是setupClass 我是tearDownClass <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> Time Elapsed: 0:00:00

 

用瀏覽器打開的測試報告顯示如圖:

 

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

import unittest,HTMLTestRunner suite = unittest.TestSuite()#建立測試套件
        all_cases = unittest.defaultTestLoader.discover(case_path,'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) #運行測試

 

還能夠用BeautifulReport產生好看的測試報告

解壓文件夾->將文件夾和setup.py複製到day12(當前要使用的目錄)中 -》運行setup.py -》運行成功以後(運行結果顯示success)把day12中的BeautifulReport文件夾刪除
使用的時候直接 import BeautifulReport便可
以上方法不行的話,將BeautifulReport解壓後的文件夾放入pycharm的External Libraries -> site-packages目錄下
使用BeautifulReport,執行代碼以下:

import BeautifulReport as bf #產生好看的報告
test_suite = unittest.makeSuite(TestCalc) #把這個類變成一個測試集合
runner = bf.BeautifulReport(test_suite) runner.report(filename='new_report.html',description='描述') #文件名必須是html格式的
#以上代碼執行結果以下:
我是setupClass ...F...我是tearDownClass 測試已所有完成, 可前往E:\Python學習\pycharm\python腳本\day12查詢測試報告

用瀏覽器打開的測試報告顯示如圖:

 用BeautifulReport執行多個python文件裏的多個測試用例,代碼以下:

import unittest import BeautifulReport import time tests = unittest.defaultTestLoader.discover(case_path,'*.py') #找指定路徑下以.py結尾的文件
runner = BeautifulReport.BeautifulReport(tests)#運行找到的全部用例
today = time.strftime('%Y-%m-%d%H%M%S') file_name = '%s-report.html'%today #報告文件名
runner.report('utp自動化測試報告-%s'%today,filename=file_name,log_path=report_path)#產生報告

 

咱們在後續進行持續集成的時候,要讓代碼自動運行,就會用到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格式的報告了,並且還自動把日期加上了

相關文章
相關標籤/搜索