电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

TestCase:一個TestCase實例就是一個測試用例,一個測試用例就是一個完整的測試流程,包括測試前環境的搭建,測試代碼的執行,以及測試后環境的還原或者銷毀。元測試的本質也就在這里,一個測試用例是一個完整的測試單元,可以對某一具體問題進行檢查驗證。 TestSuite:多個測試用例集合在一起就是TestSuite,TestSuite也可以嵌套TestSuite。 TestLoader:TestLoader的作用是將Testcase加載到TestSuite中。 TextTestRunner:TextTestRunner是用來執行測試用例的,其中的run(test)會執行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()

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

...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)

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

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

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

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

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

修改our_testcase.py中主函數。

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

執行結果如下。

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)

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

3、組織TestSuite

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

還有一個問題是,我們現在只有一個測試文件,我們直接執行該文件即可,但如果有多個測試文件,怎么進行組織,總不能一個個文件執行吧,答案也在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)

執行結果如下。

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)

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

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

# 直接用addTest方法添加單個TestCasesuite.addTest(TestMathFunc('test_multi'))# 使用loadTestFromName,傳入模塊名.TestCase名,下面倆方法效果相同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、輸出文件

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

修改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、測試前后的處理

在之前的測試中,可能會存在這樣的問題:如果要在測試之前準備環境,測試完成之后做一些清理怎么辦?這里需要用到的是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)

執行結果:

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)

可以發現setUp()和tearDown()在每個case前后都執行了一次。如果要在所有case執行之前和所有case執行之后準備和清理環境,我們可以使用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不執行,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)

執行結果:

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)

結果顯示為,總共執行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的詳細內容,更多關于python 單元測試框架unitest的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 北京浩云律师事务所-法律顾问_企业法务_律师顾问_公司顾问 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 三轴曲线机-端子插拔力试验机|华杰仪器 | 福兰德PVC地板|PVC塑胶地板|PVC运动地板|PVC商用地板-中国弹性地板系统专业解决方案领先供应商! 福建成考网-福建成人高考网 | 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 四川实木门_成都实木门 - 蓬溪聚成门业有限公司| Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 2025第九届世界无人机大会| 富森高压水枪-柴油驱动-养殖场高压清洗机-山东龙腾环保科技有限公司 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 立刷【微电签pos机】-嘉联支付立刷运营中心 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 天然气分析仪-液化气二甲醚分析仪|传昊仪器 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 分光色差仪,测色仪,反透射灯箱,爱色丽分光光度仪,美能达色差仪维修_苏州欣美和仪器有限公司 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 证券新闻,热播美式保罗1984第二部_腾讯1080p-仁爱影院 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 英语词典_成语词典_日语词典_法语词典_在线词典网 | 东莞画册设计_logo/vi设计_品牌包装设计 - 华略品牌设计公司 | 数显恒温培养摇床-卧式/台式恒温培养摇床|朗越仪器 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 |