python單元測試框架unittest基本用法案例
unittest是python單元測試框架,類似于JUnit框架
意義:
- 靈活的組織ui接口測試自動化用例
- 讓用例高效的執(zhí)行
- 方便驗證測試用例的結(jié)果
- 集成html形式測試報告
- 一個class繼承unittest.TestCase類,即是一個個具體的TestCase(類方法名稱必須以test開頭,否則不能被unittest識別)
- 每一個用例執(zhí)行的結(jié)果的標識,成功是. ,失敗為F,出錯是E
- 每一個測試以test01、test02…依次寫下去,unittest才可按照編號執(zhí)行
- versity參數(shù)控制輸出結(jié)果,0是簡單報告、1是一般報告、2是詳情報告。
- 用setUp()、terUpClass()以及tearDownClass()可以在用例執(zhí)行前布置環(huán)境,以及在用例執(zhí)行后清理環(huán)境。
- 參數(shù)中加stream,可以講報告輸出到文件:可以用HTMLTestRunner輸出html報告。
- 多個單元的測試用例集合在一起,就是TestSuite。
案例1
from selenium import webdriver import requests def test01(): ''' 用例1 :return: ''' url = "http://www.ynhousedata.cn/house/assessment/assess_public?token=9a5008072cfd7336350306fdd9ea9485×tamp=2022-04-22 09:20:33&layer=1&total_layer=8&total_area=120&pre_id=4450" re = requests.get(url) print(re.status_code, re.text, re.headers, re.encoding) def test02(): ''' 用例1 :return: ''' driver = webdriver.Chrome() driver.get('https://www.baidu.com/') search = input('輸入搜索內(nèi)容\n') driver.find_element_by_xpath('//*[@id="kw"]').send_keys(search) driver.find_element_by_xpath('//*[@id="su"]').click() test01() test02()
以上測試,一旦test01出錯,后邊的代碼無法執(zhí)行,而且測試報告,不便于查閱。
import unittest class TestCases(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print('所有用例的前置') @classmethod def tearDownClass(cls) -> None: print('所有用例的后置') def setUp(self) -> None: print('每個用例前置') def tearDown(self) -> None: print('每個用例的后置') def test01(self): print('執(zhí)行用例1') def test02(self): print('執(zhí)行用例2') if __name__ == '__main__': unittest.main()
運行結(jié)果
Ran 2 tests in 0.001s
OK
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
每個用例前置
執(zhí)行用例2
每個用例的后置
所有用例的后置Process finished with exit code 0
若某個類下用例非常多,但又只想執(zhí)行某一個,可以用以下方法
if __name__ == '__main__': # 創(chuàng)建套件對象 suit = unittest.TestSuite() # 添加指定用例 suit.addTest(TestCases("test02")) run = unittest.TextTestRunner() run.run(suit)
運行結(jié)果
所有用例的前置
每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 1 test in 0.000sOK
<unittest.runner.TextTestResult run=1 errors=0 failures=0>
若某個類下用例非常多,以下運行方式可以執(zhí)行多個用例
if __name__ == '__main__': # 創(chuàng)建套件對象 suit = unittest.TestSuite() # 添加指定用例,多條 suit.addTests([TestCases("test01"), TestCases("test02")]) run = unittest.TextTestRunner() run.run(suit)
運行結(jié)果
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 2 tests in 0.000sOK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
當一個py文件下有多個類,需要執(zhí)行某個類的時候,可以用以下方法執(zhí)行
if __name__ == '__main__': # 創(chuàng)建套件對象 suit = unittest.TestSuite() # 加載類 load = unittest.TestLoader() suit.addTest(load.loadTestsFromTestCase(TestCases)) #TestCases為 run = unittest.TextTestRunner() run.run(suit)
運行結(jié)果
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 2 tests in 0.000sOK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>
當有多個測試類的時候,可以用以下方法執(zhí)行
from selenium import webdriver import requests import unittest class TestCases1(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print('所有用例的前置') @classmethod def tearDownClass(cls) -> None: print('所有用例的后置') def setUp(self) -> None: print('每個用例前置') def tearDown(self) -> None: print('每個用例的后置') def test01(self): print('執(zhí)行用例1') def test02(self): print('執(zhí)行用例2') class TestCases2(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print('所有用例的前置') @classmethod def tearDownClass(cls) -> None: print('所有用例的后置') def setUp(self) -> None: print('每個用例前置') def tearDown(self) -> None: print('每個用例的后置') def test04(self): print('執(zhí)行用例4') def test03(self): print('執(zhí)行用例3') if __name__ == '__main__': # 創(chuàng)建類加載對象 load = unittest.TestLoader() # 分別加載兩個類 suit1 = load.loadTestsFromTestCase(TestCases1) suit2 = load.loadTestsFromTestCase(TestCases2) # 放在套件里 suits = unittest.TestSuite([suit1, suit2]) run = unittest.TextTestRunner() run.run(suits)
運行結(jié)果
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置
所有用例的前置
每個用例前置
執(zhí)行用例3
每個用例的后置
.每個用例前置
執(zhí)行用例4
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 4 tests in 0.000sOK
<unittest.runner.TextTestResult run=4 errors=0 failures=0>
當需要執(zhí)行多個py文件下的類的用例的時候可以用以下方法
文件結(jié)構(gòu)
? unitTest pwd
/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest,假設(shè)main.py執(zhí)行testCase文件夾下的test*.py里的類
? unitTest tree
.
├── unitTest.md
├── __init__.py
├── main.py
└── testCase
├── test01.py
└── test02.py1 directory, 5 files
test01.py
import unittest class TestCases1(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print('所有用例的前置') @classmethod def tearDownClass(cls) -> None: print('所有用例的后置') def setUp(self) -> None: print('每個用例前置') def tearDown(self) -> None: print('每個用例的后置') def test01(self): print('執(zhí)行用例1') def test02(self): print('執(zhí)行用例2')
test02.py
import unittest class TestCases2(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print('所有用例的前置') @classmethod def tearDownClass(cls) -> None: print('所有用例的后置') def setUp(self) -> None: print('每個用例前置') def tearDown(self) -> None: print('每個用例的后置') def test04(self): print('執(zhí)行用例4') def test03(self): print('執(zhí)行用例3')
main.py
# -*- coding: utf-8 -*- # @File : main.py # @Author : 李東 # @Time : 2022/04/25 10:42:20 import unittest test_dir = "/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest" report_path = dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py") # 創(chuàng)建套件 suit = unittest.TestSuite() # 添加套件用例 suit.addTest(dis) run = unittest.TextTestRunner() run.run(suit)
運行如下:
所有用例的前置
每個用例前置
執(zhí)行用例1
每個用例的后置
.每個用例前置
執(zhí)行用例2
每個用例的后置
.所有用例的后置
所有用例的前置
每個用例前置
執(zhí)行用例3
每個用例的后置
.每個用例前置
執(zhí)行用例4
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 4 tests in 0.000sOK
<unittest.runner.TextTestResult run=4 errors=0 failures=0>
2、生成測試報告
進入網(wǎng)站,下載HTMLTestRunner文件
下載后修改文件,建議全部修改,如果報錯,將不需要修改的地方還原即可。
94行,import StringI0 ||| import io 118行,self.fp.write(s) ||| self.fp.write(bytes(s,'UTF-8')) 539行,self.outputBuffer = StringI0.StringI0() ||| self.outputBuffer = io.BytesI0() 631行,print >>sys .stderr, '\nTime ELapsed: %s' % (self.stopTime-seLf.startTime) ||| print('\nTime Elapsed: %s' % (self.stopTime-self.startTime)) 642行,if not rmap.has_key(cls): ||| if not cls in rmap: 766行,uo = o.decode('latin-1') ||| uo = o 768行,uo = o ||| Uo = o.decode('utf-8') 772行,ue = e.decode('latin-1') ||| ue=e 774行,ue = e ||| ue = e.decode('utf-8')
修改完成之后,將文件放入到python環(huán)境的lib目錄下(windows)。mac 用戶可以放在****/lib/python3.9/site-packages目錄下。
創(chuàng)建報告存放的文件夾report,報告目錄結(jié)構(gòu)如下
main.py定義如下
import unittest import HTMLTestRunner test_dir = "/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest/testCase" # 報告存放的位置 report_path = "/Users/lidong/Desktop/zhouyu/BILIBILI/筆記/unitTest/report/" # 打開目錄,生成html文件 file = open(report_path+'result.html', 'wb') # 文件格式生成 run = HTMLTestRunner.HTMLTestRunner(stream=file, title='這是報告標題', description='這是報告描述') # 加載用 dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py") # 運行用例 run.run(dis)
6、運行main.py之后,會在report目錄下生成html報告
7、 使用瀏覽器打開,可以看到如下報告
斷言基本操作
import unittest import requests class Tess(unittest.TestCase): def setUp(self): res = requests.get('http://www.baidi.com') return res.status_code def test1(self): # 判斷獲取的狀態(tài)是否等于200 self.assertEqual(self.setUp(), 200) if __name__ == '__main__': unittest.main()
數(shù)據(jù)驅(qū)動 ddt data
import unittest from ddt import ddt, data @ddt class TestCases2(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print('所有用例的前置') @classmethod def tearDownClass(cls) -> None: print('所有用例的后置') def setUp(self) -> None: print('每個用例前置') def tearDown(self) -> None: print('每個用例的后置') @data('username01', 'username02') def test04(self, username): """冒煙用例""" print('執(zhí)行用例4,',username,'登陸成功') def test03(self): """爆炸用例""" print('執(zhí)行用例3') if __name__ == '__main__': # 創(chuàng)建類加載對象 load = unittest.TestLoader() # 分別加載兩個類 suit2 = load.loadTestsFromTestCase(TestCases2) # 放在套件里 suits = unittest.TestSuite([suit2]) run = unittest.TextTestRunner() run.run(suits)
運行結(jié)果
所有用例的前置
每個用例前置
執(zhí)行用例3
每個用例的后置
.每個用例前置
執(zhí)行用例4, username01 登陸成功
每個用例的后置
.每個用例前置
執(zhí)行用例4, username02 登陸成功
每個用例的后置
.所有用例的后置----------------------------------------------------------------------
Ran 3 tests in 0.000sOK
<unittest.runner.TextTestResult run=3 errors=0 failures=0>
鞏固
# -*- coding: utf-8 -*-, # @File : test_module.py, # @Author : lidong, # @IDEA: PyCharm # @Time : 2022/4/25 16:57 import unittest class TestStringMethods(unittest.TestCase): a = 67 # 跳過被此裝飾器裝飾的測試。 reason 為測試被跳過的原因。 @unittest.skip('取消測試') def test_upper(self): print('test_upper') # 當condition為真時,跳過被裝飾的測試。 @unittest.skipIf(a>5, '取消測試') def test_upper2(self): print('test_upper2') # 跳過被裝飾的測試,condition 為假 @unittest.skipUnless(a > 88, '跳過被裝飾的測試') def test_upper3(self): print('test_upper3') def test_upper5(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('Foo'.isupper()) def test_split(self): s = 'hello world' self.assertEqual(s.split(), ['hello', 'world']) # check that s.split fails when the separator is not a string with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()
運行
=============================================================================== [SKIPPED] 取消測試 unitTest.testCase.test_module.TestStringMethods.test_upper unitTest.testCase.test_module.TestStringMethods.test_upper2 =============================================================================== [SKIPPED] 跳過被裝飾的測試 unitTest.testCase.test_module.TestStringMethods.test_upper3 ------------------------------------------------------------------------------- Ran 6 tests in 0.093s PASSED (skips=3, successes=3) Process finished with exit code 0 Skipped: 取消測試 Skipped: 取消測試 Skipped: 跳過被裝飾的測試
總結(jié)
到此這篇關(guān)于python單元測試框架unittest基本用法的文章就介紹到這了,更多相關(guān)python unittest用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python創(chuàng)建屬于自己的單詞詞庫 便于背單詞
這篇文章主要為大家詳細介紹了python創(chuàng)建屬于自己的單詞詞庫,便于背單詞,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07Python實現(xiàn)Excel做表自動化的最全方法合集
Microsoft?Excel?是一款強大的辦公工具,廣泛用于數(shù)據(jù)分析、報告制作、預(yù)算管理等各種任務(wù),本文將深入探討如何使用?Python?進行?Excel?表格的自動化,需要的可以參考下2024-02-02Python 利用Entrez庫篩選下載PubMed文獻摘要的示例
這篇文章主要介紹了Python 利用Entrez庫篩選下載PubMed文獻摘要的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11在Python中使用MongoEngine操作數(shù)據(jù)庫教程實例
這篇文章主要介紹了在Python中使用MongoEngine操作數(shù)據(jù)庫教程實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12Windows系統(tǒng)下cython_bbox庫的正確安裝步驟
Cython-bbox一般無法直接通過pip直接安裝,那么如何安裝呢?下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下cython_bbox庫的正確安裝步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-05-05python使用pandas讀xlsx文件的實現(xiàn)
這篇文章主要介紹了python使用pandas讀xlsx文件的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05