Python单元测试框架之unittest+requests+ddt+excel接口自动化测试
unitetest是python里單元測試框架,是基于 java 的 junit 測試框架?相當于是一個 python 版的 junit,除了 unittest,還有一個 pytest 框架
unittest.TestCase:TestCase類,所有測試用例類繼承的基本類
一個TestCase的實例就是一個測試用例。一個測試用例要包括測試前準備環境的搭建(setUp),執行測試代碼(run),以及測試后環境的還原(tearDown)。一個測試用例是一個完整的測試單元,通過運行這個測試單元,可以對某一個功能進行驗證
?
unittest.main():使用她可以方便的將一個單元測試模塊變為可直接運行的測試腳本,main()方法使用TestLoader類來搜索所有包含在該模塊中以“test”命名開頭的測試方法,并自動執行他們。執行方法的默認順序是:根據ASCII碼的順序加載測試用例,數字與字母的順序為:0-9,A-Z,a-z。所以以A開頭的測試用例方法會優先執行,以a開頭會后執行
?
一、setUp()和tearDown()函數
? ? setUp()函數是在眾多函數或說是在一個類里最先被調用的函數,每執行完一個函數都要從setUp()調用開始后再執行下一個函數,有幾個函數幾次,與位置無關,隨便放在那里都是他先被調用。
? ? ?tearDown()函數是在眾多函數執行完后他才被執行,不管這個類里面有多少函數,他總是最后一個被執行,與位置無關,放在那里都行,最后不管測試函數是否執行成功都執行tearDown()方法;如果setUp()方法失敗,則認為這個測試項目失敗,不會執行測試函數也不執行tearDown()方法。
1、setUp()和tearDown()方法都是非必要條件,如果沒有也可以寫pass
2、setUp()和tearDown()方法每個測試用例都會執行,先執行前置setUp,然后執行的用例(test*),最后執行的后置tearDown
3、setUp():setUp()方法用于測試用例執行前初始化工作。如測試用例中需要訪問數據庫,可以在setUp中建立數據庫連接并進行初始化。如測試用例需要登錄web,可以先實例化瀏覽器
4、tearDown():tearDown()方法用于測試用例執行之后的善后工作。如關閉數據庫連接、關閉瀏覽器
5、未加裝飾器,先執行前置setUp,再執行test開頭的test01,最后執行后置tearDown,繼續循環所有用例;加了裝飾器@classmethod,先執行setUp,再執行test開頭的所有用例,最后執行tearDown
#未加裝飾器,先執行前置setUp,再執行test開頭的測試用例,最后執行后置tearDown,繼續循環所有用例import unittest class Test(unittest.TestCase): #繼承unittest.TestCase這個類def setUp(self): #測試用例執行前運行print('setUp__')def tearDown(self): #測試用例結束后運行print('tearDown')def testMinus(self): #測試用例名稱以test開頭'''這里是減法'''print('這里是減法') result=6-5 hope=1 self.assertEqual(result,hope) def testDivide(self): '''這里是除法'''print('這里是除法')result=7/2hope=3.5self.assertEqual(result,hope) if __name__ == '__main__':unittest.main()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py setUp__ 這里是除法 tearDown setUp__ 這里是減法 tearDown .. ---------------------------------------------------------------------- Ran 2 tests in 0.000sOKProcess finished with exit code 0 #加了裝飾器@classmethod,先執行setUp,再執行test開頭的所有用例,最后執行tearDownimport unittest class Test(unittest.TestCase): @classmethod def setUpClass(cls): print('setUp__') @classmethod def tearDownClass(cls): print('tearDown') def test_003(self): ''這里是test_003''' print('這里是減法') result=6-5 hope=1 self.assertEqual(result,hope) def test_004(self): ''這里是test_004''' print('這里是除法') result=7/2 hope=3.5 self.assertEqual(result,hope) if __name__ == '__main__': unittest.main() C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py setUp__ .. 這里是減法 這里是除法 tearDown ---------------------------------------------------------------------- Ran 2 tests in 0.001sOKProcess finished with exit code 0?
二、unittest.defaultTestLoader(): defaultTestLoader()類
通過該類下discover()方法將測試目錄匹配查找測試用例文件(test*.py),將查找的測試用例組裝到測試套件TestSuite,再返回一個TestSuite實例,因此可以直接通過run()方法執行discover
discover方法來加載用例,discover加載到的用例是一個list集合,需要重新寫入到一個list對象testcase里,用TextTestRunner這里類的run方法去執行,discover方法里面有三個參數:
case_dir:這個是待執行用例的目錄
pattern:這個是匹配腳本名稱的規則,test*.py意思是匹配test開頭的所有腳本。
top_level_dir:這個是頂層目錄的名稱,一般默認等于None就行了
# 測試用例路徑(當前文件目錄) case_path = os.path.dirname(os.path.realpath(__file__)) #加載test.py文件,TestCase到TestSuite集合中,返回一個TestSuite實例 discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None) print(discover) <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]> class Test(unittest.TestCase):def setUp(self):print('數據準備階段')def tearDown(self):print('數據清理結束')def test01(self):print('輸出test01')def test02(self):print('輸出test02') if __name__=='__main__':# 測試用例路徑case_path = os.path.dirname(os.path.realpath(__file__))#加載test.py文件,TestCase到TestSuite集合中,返回一個TestSuite實例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#實例化runnerrunner=unittest.TextTestRunner()#調用實例run方法runner.run(discover)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py .. <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]> ---------------------------------------------------------------------- 數據準備階段 Ran 2 tests in 0.001s 輸出test01數據清理結束 OK 數據準備階段 輸出test02 數據清理結束Process finished with exit code 0 ?三、unittest.TestSuite():unittest框架的TestSuite()類
用來創建測試套件,多個測試用例test case集合就是TestSuite,TestSuite可以嵌套TestSuite
對于某一個功能模塊的驗證可能需要多個測試用例,多個測試用例集合在一起執行驗證某一個功能,這樣就是一個TestSuite。通過addTest()方法將 TestCase 加載到 TestSuite()中,最終將傳遞給testRunner進行測試執行
?
四、unittest.TextTestRunner():unittest框架的TextTestRunner()類
通過該類下面的run()方法來運行suite所組裝的測試用例,入參為suite測試套件
runner=unittest.TextTestRunner()
runner.run(all_case())
class Test(unittest.TestCase):def setUp(self):print('數據準備階段')def tearDown(self):print('數據清理結束')def test01(self):print('輸出test01')def test02(self):print('輸出test02') if __name__=='__main__':# 測試用例路徑case_path = os.path.dirname(os.path.realpath(__file__))#加載test.py文件,TestCase到TestSuite集合中,返回一個TestSuite實例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#實例化runnerrunner=unittest.TextTestRunner()#調用實例run方法runner.run(discover)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py .. <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]> ---------------------------------------------------------------------- 數據準備階段 Ran 2 tests in 0.001s 輸出test01數據清理結束 OK 數據準備階段 輸出test02 數據清理結束Process finished with exit code 0?
五、生成html報告,report_path是存放測試報告的地址
stream:測試報告寫入文件的存儲區域
title:測試報告的主題
description:測試報告的描述
?
#實例化runner runner=unittest.TextTestRunner()#測試報告存放地址 report_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"result.html") #打開 fp = open(report_path, "wb") #寫入 runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title="自動化測試報告",description="用例執行情況:") #調用實例run方法 runner.run(discover) #關閉 fp.close() import unittest,os import HTMLTestRunner class Test(unittest.TestCase):def setUp(self):print('setup數據準備階段——————')def tearDown(self):print('teardown數據清理收尾階段————')def test01(self):print('執行test01測試用例')def test02(self):print('執行test02測試用例') if __name__=='__main__':#測試用例路徑case_path = os.path.dirname(os.path.realpath(__file__))#加載test.py文件,TestCase到TestSuite集合中,返回一個TestSuite實例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#實例化runnerrunner=unittest.TextTestRunner()#測試報告存放地址report_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"result.html")#打開fp = open(report_path, "wb")#寫入runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title="自動化測試報告",description="用例執行情況:")#調用實例run方法runner.run(discover)#關閉fp.close()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py .. setup數據準備階段—————— 執行test01測試用例 ---------------------------------------------------------------------- teardown數據清理收尾階段———— Ran 2 tests in 0.002s setup數據準備階段——————執行test02測試用例 OK teardown數據清理收尾階段————Process finished with exit code 0C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py ..<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]> <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> Time Elapsed: 0:00:00.001000Process finished with exit code 0 參考代碼# coding:utf-8 import unittest import os import HTMLTestRunner# python2.7要是報編碼問題,就加這三行,python3不用加import sys reload(sys) sys.setdefaultencoding('utf8')# 用例路徑 case_path = os.path.join(os.getcwd(), "case") # 報告存放路徑 report_path = os.path.join(os.getcwd(), "report") def all_case():discover = unittest.defaultTestLoader.discover(case_path,pattern="test*.py",top_level_dir=None)print(discover)return discoverif __name__ == "__main__":# runner = unittest.TextTestRunner()# runner.run(all_case())# html報告文件路徑report_abspath = os.path.join(report_path, "result.html")fp = open(report_abspath, "wb")runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自動化測試報告,測試結果如下:',description=u'用例執行情況:')# 調用add_case函數返回值runner.run(all_case())fp.close()?
六、unittest.skip():裝飾器
當運行用例時,有些用例可能不想執行等,可用裝飾器暫時屏蔽該條測試用例。一種常見的用法就是比如說想調試某一個測試用例,想先屏蔽其他用例就可以用裝飾器屏蔽
@unittest.skip(reason): skip(reason)裝飾器:無條件跳過裝飾的測試,并說明跳過測試的原因
@unittest.skipIf(reason): skipIf(condition,reason)裝飾器:條件為真時,跳過裝飾的測試,并說明跳過測試的原因
@unittest.skipUnless(reason): skipUnless(condition,reason)裝飾器:條件為假時,跳過裝飾的測試,并說明跳過測試的原因。
@unittest.expectedFailure(): expectedFailure()測試標記為失敗
?
?
七、斷言
assertEqual(self, first, second, msg="失敗原因")?
unittest 常用的斷言方法?
1.assertEqual(self, first, second, msg=None)?
--判斷兩個參數相等:first == second?
2.assertNotEqual(self, first, second, msg=None)?
--判斷兩個參數不相等:first != second?
3.assertIn(self, member, container, msg=None)?
--判斷是字符串是否包含:member in container?
4.assertNotIn(self, member, container, msg=None)?
--判斷是字符串是否不包含:member not in container?
5.assertTrue(self, expr, msg=None)?
--判斷是否為真:expr is True?
6.assertFalse(self, expr, msg=None)?
--判斷是否為假:expr is False?
7.assertIsNone(self, obj, msg=None)?
--判斷是否為 None:obj is None?
8.assertIsNotNone(self, obj, msg=None) --判斷是否不為 None:obj is not None?
?
?
?
八、數據驅動DDT
?
?
總結
以上是生活随笔為你收集整理的Python单元测试框架之unittest+requests+ddt+excel接口自动化测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm+pyqt5配置
- 下一篇: 1g等于多少mb计算机网络,手机流量1G