日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

全面介紹python中很常用的單元測試框架unitest

瀏覽:125日期:2022-07-02 11:40:08
1、unitest主要功能模塊介紹

unitest主要包含TestCase、TestSuite、TestLoader、TextTestRunner、TextTestResult這幾個功能模塊。

TestCase:一個TestCase實例就是一個測試用例,一個測試用例就是一個完整的測試流程,包括測試前環(huán)境的搭建,測試代碼的執(zhí)行,以及測試后環(huán)境的還原或者銷毀。元測試的本質(zhì)也就在這里,一個測試用例是一個完整的測試單元,可以對某一具體問題進行檢查驗證。 TestSuite:多個測試用例集合在一起就是TestSuite,TestSuite也可以嵌套TestSuite。 TestLoader:TestLoader的作用是將Testcase加載到TestSuite中。 TextTestRunner:TextTestRunner是用來執(zhí)行測試用例的,其中的run(test)會執(zhí)行TestSuite/TestCase中的run(result)方法。 TextTestResult:TextTestResult用來保存測試結果,其中包括運行了多少測試用例,成功了多少,失敗了多少等信息。

整個流程為:寫好TestCase,然后由TestLoader加載TestCase到TestSuite,然后由TextTestRunner來運行TestSuite,運行的結果保存在TextTestResult中。

2、實例介紹

首先準備幾個待測的方法,寫在test_func.py中。

def add(a, b): return a + bdef multi(a, b): return a * bdef lower_str(string): return string.lower()def square(x): return x ** 2

準備好幾個待測的方法之后,為這些方法寫一個測試用例,寫入our_testcase.py中。

import unittestfrom test_func import *class TestFunc(unittest.TestCase): '''Test test_func.py''' def test_add(self): '''Test func add''' self.assertEqual(3, add(1, 2)) self.assertNotEqual(3, add(1, 3)) def test_multi(self): '''Test func multi''' self.assertEqual(6, multi(2, 3)) self.assertNotEqual(8, multi(3, 3)) def test_lower_str(self): '''Test func lower_str''' self.assertEqual('abc', lower_str('ABC')) self.assertNotEqual('Dce', lower_str('DCE')) def test_square(self): '''Test func square''' self.assertEqual(17, square(4)) # 這里故意設計一個會出錯的用例,測試4的平方等于17,實際上并不等于。 self.assertNotEqual(35, square(6))if __name__ == ’__main__’: unittest.main()

這里寫好之后,進入命令行終端,執(zhí)行python our_testcase.py,執(zhí)行結果如下。

...F======================================================================FAIL: test_square (__main__.TestFunc)Test func square----------------------------------------------------------------------Traceback (most recent call last): File 'our_testcase.py', line 27, in test_square self.assertEqual(17, square(4))AssertionError: 17 != 16----------------------------------------------------------------------Ran 4 tests in 0.000sFAILED (failures=1)

這里分析一下這個執(zhí)行結果。首先能夠看到一共運行了4個測試用例,失敗了1個,并且給出了失敗原因,AssertionError: 17 != 16,這是我們故意留下的錯誤漏洞,被測試用例測試出來了。

第一行...F中,一個點.代表測試成功,F(xiàn)代表失敗,我們的測試結果中,前三個成功了,第四個失敗了,總共是四個測試,其余的符號中E代表出錯,S代表跳過。

特別說明的一點是,測試的執(zhí)行順序跟方法的順序沒有關系,四個測試是隨機先后執(zhí)行的。

每個測試方法編寫的時候,都要以test開頭,比如test_square,否則是不被unitest識別的。

在unitest.main()中加上verbosity參數(shù)可以控制輸出的錯誤報告的詳細程序,默認是1,如果設為0,則不輸出每一用例的執(zhí)行結果,即上面的第一行的執(zhí)行結果內(nèi)容。如果設為2,則輸出詳細的執(zhí)行結果。

修改our_testcase.py中主函數(shù)。

if __name__ == ’__main__’: unittest.main(verbosity=2)

執(zhí)行結果如下。

test_add (__main__.TestFunc)Test func add ... oktest_lower_str (__main__.TestFunc)Test func lower_str ... oktest_multi (__main__.TestFunc)Test func multi ... oktest_square (__main__.TestFunc)Test func square ... FAIL======================================================================FAIL: test_square (__main__.TestFunc)Test func square----------------------------------------------------------------------Traceback (most recent call last): File 'our_testcase.py', line 27, in test_square self.assertEqual(17, square(4))AssertionError: 17 != 16----------------------------------------------------------------------Ran 4 tests in 0.000sFAILED (failures=1)

可以看到,每一個用例的詳細執(zhí)行情況以及用例名,用例描述均被輸出了出來,在測試方法下加代碼示例中的'''Doc String''',在用例執(zhí)行時,會將該字符串作為此用例的描述,加合適的注釋能夠使輸出的測試報告更加便于閱讀。

3、組織TestSuite

按照上面的測試方法,我們無法控制用例執(zhí)行的順序,這樣顯然是不合理的,因為在一些測試過程中,我們肯定需要控制先測試某些用例,再測試某些用例,這些用例有先后的因果關系。在這里,我們就需要用到TestSuite。我們添加到TestSuite中的case是會按照添加的順序執(zhí)行的。

還有一個問題是,我們現(xiàn)在只有一個測試文件,我們直接執(zhí)行該文件即可,但如果有多個測試文件,怎么進行組織,總不能一個個文件執(zhí)行吧,答案也在TestSuite中。

新建一個文件,test_suite.py。

import unittestfrom our_testcase import TestFuncif __name__ == ’__main__’: suite = unittest.TestSuite() tests = [TestFunc('test_square'), TestFunc('test_lower_str'), TestFunc('test_multi')] suite.addTests(tests) runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)

執(zhí)行結果如下。

test_square (our_testcase.TestFunc)Test func square ... FAILtest_lower_str (our_testcase.TestFunc)Test func lower_str ... oktest_multi (our_testcase.TestFunc)Test func multi ... ok======================================================================FAIL: test_square (our_testcase.TestFunc)Test func square----------------------------------------------------------------------Traceback (most recent call last): File '/Users/luyuze/projects/test/our_testcase.py', line 27, in test_square self.assertEqual(17, square(4))AssertionError: 17 != 16----------------------------------------------------------------------Ran 3 tests in 0.000sFAILED (failures=1)

這樣,用例執(zhí)行的順序就是按照我們添加進去的順序來執(zhí)行的了。

上面使用的是TestSuite的addTests()方法,并直接傳入TestCase列表,也有一些其他的方法可以向TestSuite中添加用例。

# 直接用addTest方法添加單個TestCasesuite.addTest(TestMathFunc('test_multi'))# 使用loadTestFromName,傳入模塊名.TestCase名,下面?zhèn)z方法效果相同suite.addTests(unittest.TestLoader().loadTestsFromName(’our_testcase.TestFunc’))suite.addTests(unittest.TestLoader().loadTestsFromNames([’our_testcase.TestFunc’]))# loadTestsFromTestCase(),傳入TestCasesuite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFunc))

用TestLoader的方法是無法對case進行排序的,同時,suite中也可以套suite。

4、輸出文件

用例組織好了,但是結果只能輸出到控制臺,這樣沒辦法查看之前的執(zhí)行記錄,我們想將結果輸出到文件。

修改test_suite.py。

import unittestfrom our_testcase import TestFuncif __name__ == ’__main__’: suite = unittest.TestSuite() tests = [TestFunc('test_square'), TestFunc('test_lower_str'), TestFunc('test_multi')] suite.addTests(tests) with open(’UnitestTextReport.txt’, ’a’) as f: runner = unittest.TextTestRunner(stream=f, verbosity=2) runner.run(suite)5、測試前后的處理

在之前的測試中,可能會存在這樣的問題:如果要在測試之前準備環(huán)境,測試完成之后做一些清理怎么辦?這里需要用到的是setUp()和tearDown()。

修改our_testcase.py。

import unittestfrom test_func import *class TestFunc(unittest.TestCase): '''Test test_func.py''' def setUp(self): print('do something before testcase') def test_add(self): '''Test func add''' self.assertEqual(3, add(1, 2)) self.assertNotEqual(3, add(1, 3)) def test_multi(self): '''Test func multi''' self.assertEqual(6, multi(2, 3)) self.assertNotEqual(8, multi(3, 3)) def test_lower_str(self): '''Test func lower_str''' self.assertEqual('abc', lower_str('ABC')) self.assertNotEqual('Dce', lower_str('DCE')) def test_square(self): '''Test func square''' self.assertEqual(17, square(4)) self.assertNotEqual(35, square(6)) def tearDownClass(self): print('do something after testcase')if __name__ == ’__main__’: unittest.main(verbosity=2)

執(zhí)行結果:

test_add (__main__.TestFunc)Test func add ... do something before testcasedo something after testcaseoktest_lower_str (__main__.TestFunc)Test func lower_str ... do something before testcasedo something after testcaseoktest_multi (__main__.TestFunc)Test func multi ... do something before testcasedo something after testcaseoktest_square (__main__.TestFunc)Test func square ... do something before testcasedo something after testcaseFAIL======================================================================FAIL: test_square (__main__.TestFunc)Test func square----------------------------------------------------------------------Traceback (most recent call last): File 'our_testcase.py', line 30, in test_square self.assertEqual(17, square(4))AssertionError: 17 != 16----------------------------------------------------------------------Ran 4 tests in 0.001sFAILED (failures=1)

可以發(fā)現(xiàn)setUp()和tearDown()在每個case前后都執(zhí)行了一次。如果要在所有case執(zhí)行之前和所有case執(zhí)行之后準備和清理環(huán)境,我們可以使用setUpClass() 與 tearDownClass()。

class TestFunc(unittest.TestCase): '''Test test_func.py''' @classmethod def setUpClass(cls): print 'This setUpClass() method only called once.' @classmethod def tearDownClass(cls): print 'This tearDownClass() method only called once too.'6、跳過case

如果我們臨時想要跳過某個case不執(zhí)行,unitest也有相應的方法。

1、skip裝飾器

# -*- coding: utf-8 -*-import unittestfrom test_func import *class TestFunc(unittest.TestCase): '''Test test_func.py''' @unittest.skip(’do not run this case’) def test_add(self): '''Test func add''' self.assertEqual(3, add(1, 2)) self.assertNotEqual(3, add(1, 3)) def test_multi(self): '''Test func multi''' self.assertEqual(6, multi(2, 3)) self.assertNotEqual(8, multi(3, 3)) def test_lower_str(self): '''Test func lower_str''' self.assertEqual('abc', lower_str('ABC')) self.assertNotEqual('Dce', lower_str('DCE')) def test_square(self): '''Test func square''' self.assertEqual(17, square(4)) self.assertNotEqual(35, square(6))if __name__ == ’__main__’: unittest.main(verbosity=2)

執(zhí)行結果:

test_add (__main__.TestFunc)Test func add ... skipped ’do not run this case’test_lower_str (__main__.TestFunc)Test func lower_str ... oktest_multi (__main__.TestFunc)Test func multi ... oktest_square (__main__.TestFunc)Test func square ... FAIL======================================================================FAIL: test_square (__main__.TestFunc)Test func square----------------------------------------------------------------------Traceback (most recent call last): File 'our_testcase.py', line 28, in test_square self.assertEqual(17, square(4))AssertionError: 17 != 16----------------------------------------------------------------------Ran 4 tests in 0.000sFAILED (failures=1, skipped=1)

結果顯示為,總共執(zhí)行4個測試,1個失敗,1個被跳過。

skip裝飾器一共有三個 unittest.skip(reason)、unittest.skipIf(condition, reason)、unittest.skipUnless(condition, reason),skip無條件跳過,skipIf當condition為True時跳過,skipUnless當condition為False時跳過。

2、TestCase.skipTest()方法

class TestFunc(unittest.TestCase): '''Test test_func.py''' def test_add(self): '''Test func add''' self.skipTest('do not run this case') self.assertEqual(3, add(1, 2)) self.assertNotEqual(3, add(1, 3))

效果與第一種是一樣的。

以上就是全面介紹python中很常用的單元測試框架unitest的詳細內(nèi)容,更多關于python 單元測試框架unitest的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆视频在线观看免费网站黄| 亚洲一区欧美| 美女国产精品久久久| 亚洲电影有码| 欧美一区在线观看视频| 成人免费网站www网站高清| 日韩黄色免费网站| 91精品国产乱码久久久久久久 | 亚洲制服一区| 国产精品高清一区二区| 最新亚洲一区| 黄色在线网站噜噜噜| 国产欧美久久一区二区三区| 性欧美长视频| 在线一区免费| 偷拍欧美精品| 久久中文亚洲字幕| 99精品视频在线| 日韩在线二区| 高清久久一区| sm捆绑调教国产免费网站在线观看 | 欧美日韩在线观看视频小说| 国产精品一国产精品k频道56| 婷婷视频一区二区三区| 亚洲久久一区| 奇米色欧美一区二区三区| 亚洲精品观看| 91精品在线免费视频| 国产精品视频一区二区三区 | 国产经典一区| 精品视频一区二区三区在线观看 | 精品一区二区三区中文字幕| 日韩国产在线一| 综合国产精品| 国产欧美激情| 国产精品久久久久久久久久10秀| 日韩伦理在线一区| 精品91久久久久| 日韩三级一区| 国产欧美日韩一级| 欧美激情91| 久久久成人网| 视频一区二区三区入口| 日韩av不卡一区二区| 色爱综合网欧美| 欧美1区2区3区| 91精品丝袜国产高跟在线| 伊人网在线播放| 久久亚洲精品伦理| 精品亚洲二区| 日韩中文字幕av电影| 久久精品系列| 日韩精品一区第一页| 国产aⅴ精品一区二区四区| 蜜臀av免费一区二区三区| 亚州精品视频| 香蕉精品久久| 麻豆国产欧美日韩综合精品二区| 日本美女一区| 国产精品videossex| 国产亚洲欧洲| 欧美三区四区| 国产一区二区三区日韩精品| 欧美一区=区| 精精国产xxxx视频在线野外| 91精品一区| 亚洲一区黄色| 日韩国产欧美| 岛国精品一区| 日本h片久久| 亚洲一区二区成人| 韩日一区二区| 久久99性xxx老妇胖精品| 视频一区视频二区中文字幕| 久久精品导航| 毛片在线网站| www.com.cn成人| 国产毛片一区二区三区| 日韩美女国产精品| 日韩中文字幕一区二区三区| 99国产精品| 久久99伊人| 亚洲午夜久久| 日韩精彩视频在线观看| 蜜臀精品一区二区三区在线观看| 欧美色图国产精品| 亚洲国内欧美| 黄色亚洲免费| 亚洲三级国产| 国产精品一区二区三区美女 | 精品国产a一区二区三区v免费| 欧美aaaaaa午夜精品| 日日摸夜夜添夜夜添国产精品| 在线亚洲激情| 蜜芽一区二区三区| 日韩综合一区二区三区| 日本亚洲视频| 国产欧美日韩在线一区二区| 丁香婷婷久久| 国产亚洲毛片在线| 国产精品一区二区av日韩在线| 精品国产精品国产偷麻豆| 日韩黄色大片| 国产一区白浆| 欧美黄页在线免费观看| 国产精品av久久久久久麻豆网| 视频一区二区中文字幕| 亚洲3区在线| 丝袜av一区| 日韩精品一区二区三区中文在线| 国产精品tv| 亚洲一区二区三区高清不卡| 美女在线视频一区| 亚洲在线网站| 精品久久97| 日本成人在线不卡视频| 久久久精品日韩| 日本午夜精品一区二区三区电影 | 日韩高清中文字幕一区二区| 国产视频久久| 精品国产亚洲一区二区三区在线| 日韩午夜电影| 高清一区二区| 国产亚洲精品美女久久| 亚洲电影在线| 精品日韩视频| 久久精品国产成人一区二区三区 | 亚洲一区欧美二区| 精品72久久久久中文字幕| 国产极品久久久久久久久波多结野| 国内精品福利| 国产字幕视频一区二区| 国产免费av一区二区三区| 欧美影院视频| 青青草91久久久久久久久| 国产日韩亚洲欧美精品| 国产精品夜夜夜| 久久精品免视看国产成人| 久久精品国产成人一区二区三区| 国产精品午夜一区二区三区| 国产激情一区| 日韩精品诱惑一区?区三区| 国产成人精品一区二区三区免费| 日韩激情一区二区| 色在线视频观看| 免费美女久久99| 亚洲三级国产| 国产精品精品国产一区二区| 91精品韩国| 亚洲视频国产精品| 粉嫩av一区二区三区四区五区| 蜜臀91精品国产高清在线观看| 蜜臀a∨国产成人精品| 国产日产高清欧美一区二区三区| 一区二区三区四区在线看| 人人精品久久| 成人黄色av| 日韩精品欧美大片| 亚洲区国产区| 香蕉久久久久久久av网站| 国产在线看片免费视频在线观看| 欧美另类中文字幕| 鲁大师影院一区二区三区| 国产精品久久久久久久久久白浆| 亚洲成人av观看| 久久精品国产久精国产| 久久亚洲影院| 伊人久久大香线蕉av不卡| 久久69成人| 日韩精品免费观看视频| 欧美日韩日本国产亚洲在线| 韩国久久久久久| 久久久久久自在自线| 久久精品国产亚洲aⅴ| 精品国产亚洲一区二区三区在线 | 在线观看免费一区二区| 91精品韩国| 国产精品探花在线观看| 一区二区三区国产盗摄| 久久久久免费av| 精品视频在线观看网站| 欧美亚洲综合视频| 一区二区国产精品| 国产精品视区| 欧美一区三区| 欧美91精品| 欧美一区二区三区激情视频 | 欧美一区二区三区久久精品| 日韩高清不卡一区二区| 欧美一区二区三区免费看| 日韩国产欧美一区二区三区| 美腿丝袜亚洲三区| 99国产精品久久久久久久成人热| 国产探花一区二区| 欧美一区不卡| 欧美视频精品全部免费观看| 久久国产高清| 鲁大师影院一区二区三区| 久久午夜影视| 日韩高清在线一区|