Python Unittest原理及基本使用方法
基本使用步驟:
1、import unittest
2、新建一個(gè)Class繼承unittest.TestCase
3、定義一個(gè)以test開頭的函數(shù)作為測(cè)試用例【必須以test開頭】
4、執(zhí)行測(cè)試用例前都會(huì)先調(diào)用Setup函數(shù)【每個(gè)測(cè)試用例調(diào)用一次】或者setupClass函數(shù)【所有測(cè)試用例僅調(diào)用一次】
5、執(zhí)行完測(cè)試用例后都會(huì)調(diào)用tearDown函數(shù)【多次】和tearDownClass函數(shù)【僅一次】
PS:
1、不能重寫init()
2、函數(shù)必須以test開頭才能作為測(cè)試用例
3、setupClass()和tearDownClass()必須用@classmethod修飾
# -*- encoding=utf-8 -*-
import unittest
class Demo1(unittest.TestCase):
def setUp(self):
print '調(diào)用 setup 函數(shù)'
@classmethod
def setUpClass(cls):
print '調(diào)用 setupClass 函數(shù)'
def tearDown(self):
print '調(diào)用 tearDown 函數(shù)'
@classmethod
def tearDownClass(cls):
print '調(diào)用 tearDownClass 函數(shù)'
@staticmethod
def test_add():
print '3 + 5 = {}'.format(3 + 5)
@staticmethod
def test_sub():
print '3 - 5 = {}'.format(3 - 5)
if __name__ == '__main__':
unittest.main()
運(yùn)行結(jié)果
調(diào)用 setupClass 函數(shù)
調(diào)用 setup 函數(shù)
3 + 5 = 8
調(diào)用 tearDown 函數(shù)
調(diào)用 setup 函數(shù)
3 - 5 = -2
調(diào)用 tearDown 函數(shù)
調(diào)用 tearDownClass 函數(shù)
Ran 2 tests in 0.012s
OK
TestSuite【測(cè)試組】添加測(cè)試用例進(jìn)行測(cè)試
# -*- encoding=utf-8 -*-
class Class1(object):
def __init__(self):
print '調(diào)用 Class1 初始化函數(shù)'
self.name = '未定義姓名'
self.age = '未定義年齡'
def set_name(self, name):
self.name = name
def set_age(self, age):
self.age = age
def print_name(self):
print 'Class1 的姓名是:{}'.format(self.name)
def print_age(self):
print 'Class1 的年齡是:{}'.format(self.age)
if __name__ == '__main__':
pass
# -*- encoding=utf-8 -*-
import unittest
from Class1 import Class1
class CallClass1(unittest.TestCase):
def setUp(self):
self.class1 = Class1()
pass
def tearDown(self):
self.class1 = None
pass
def test_set_name(self):
self.class1.set_name('設(shè)置了名字')
self.class1.print_name()
def test_print_name(self):
self.class1.print_name()
if __name__ == '__main__':
unittest.main()
# -*- encoding=utf-8 -*-
import unittest
from Test_Demo2 import CallClass1
if __name__ == '__main__':
testSuite = unittest.TestSuite()
testSuite.addTest(CallClass1('test_set_name'))
testSuite.addTests(
[CallClass1('test_set_name'), CallClass1('test_print_name')])
textTestRunner = unittest.TextTestRunner()
textTestRunner.run(testSuite)
運(yùn)行結(jié)果
調(diào)用 Class1 初始化函數(shù)
Class1 的姓名是:設(shè)置了名字
調(diào)用 Class1 初始化函數(shù)
Class1 的姓名是:設(shè)置了名字
調(diào)用 Class1 初始化函數(shù)
Class1 的姓名是:未定義姓名
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Process finished with exit code 0
記錄測(cè)試報(bào)告到txt文件
# -*- encoding=utf-8 -*-
import unittest
from Test_Demo2 import CallClass1
if __name__ == '__main__':
testSuite = unittest.TestSuite()
testSuite.addTest(CallClass1('test_set_name'))
testSuite.addTests(
[CallClass1('test_set_name'), CallClass1('test_print_name')])
# textTestRunner = unittest.TextTestRunner()
# textTestRunner.run(testSuite)
# 將測(cè)試結(jié)果輸出到測(cè)試報(bào)告中
with open('UnittestTextReport.txt', 'w') as f:
runner = unittest.TextTestRunner(stream=f, verbosity=2)
runner.run(testSuite)
記錄測(cè)試報(bào)告到html文件
# 將測(cè)試結(jié)果輸出到測(cè)試報(bào)告html中
with open('HTMLReport.html', 'w') as f:
runner = HTMLTestRunner(stream=f,
title='MathFunc Test Report',
description='generated by HTMLTestRunner.',
verbosity=2
)
runner.run(suite)
斷言
當(dāng)斷言為真時(shí),會(huì)執(zhí)行斷言之后的代碼如(在斷言之后打印成功提示信息)
若斷言為假,則之后的代碼不會(huì)被執(zhí)行,打應(yīng)錯(cuò)誤信息,之后提示信息不會(huì)被執(zhí)行;unittest中提示F,失敗,若捕獲到異常,則為E,代表錯(cuò)誤;
補(bǔ)充:若斷言為假,則當(dāng)前函數(shù)def,停止運(yùn)行,但會(huì)運(yùn)行之后的def函數(shù)
重點(diǎn):try語句塊中不要使用assert一起使用,assert斷言為假時(shí),會(huì)拋出異常,測(cè)試用例為失敗,如果放到try中,則會(huì)捕獲到異常,測(cè)試用例永遠(yuǎn)標(biāo)記為通過
斷言結(jié)果:
. 表示通過 或者 pass
F False, 表示斷言沒有通過
E Error, 表示程序內(nèi)部發(fā)生了錯(cuò)誤。
查找當(dāng)前目錄下所有的測(cè)試用例【默認(rèn)以test開頭的py文件,可以自己配置】
# -*- encoding=utf-8 -*- import unittest import os if __name__ == '__main__': loader = unittest.defaultTestLoader.discover(os.getcwd()) # tests = unittest.defaultTestLoader.discover( # start_dir='.', # => 指定查找的目錄 # pattern='test*.py' # => 指定查找規(guī)則 # ) runner = unittest.TextTestRunner() runner.run(loader)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python 測(cè)試框架unittest和pytest的優(yōu)劣
- Python自動(dòng)化之UnitTest框架實(shí)戰(zhàn)記錄
- Python unittest單元測(cè)試框架實(shí)現(xiàn)參數(shù)化
- Python基于paramunittest模塊實(shí)現(xiàn)excl參數(shù)化
- Python unittest單元測(cè)試框架及斷言方法
- Python unittest框架操作實(shí)例解析
- Python unittest 自動(dòng)識(shí)別并執(zhí)行測(cè)試用例方式
- Python unittest工作原理和使用過程解析
相關(guān)文章
利用OpenCV+Tensorflow實(shí)現(xiàn)的手勢(shì)識(shí)別
這幾天沒事,想著再學(xué)點(diǎn)一些視覺識(shí)別方向的東西,因?yàn)橹白隽蓑?yàn)證碼識(shí)別,有了機(jī)器學(xué)習(xí)的信心,因此這次打算做個(gè)手勢(shì)識(shí)別,下面這篇文章主要給大家介紹了關(guān)于利用OpenCV+Tensorflow實(shí)現(xiàn)的手勢(shì)識(shí)別的相關(guān)資料,需要的朋友可以參考下2022-11-11
Python深度學(xué)習(xí)pyTorch權(quán)重衰減與L2范數(shù)正則化解析
這篇文章主要介紹了Python深度學(xué)習(xí)中的pyTorch權(quán)重衰減與L2范數(shù)正則化的詳細(xì)解析,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下2021-09-09
cmd運(yùn)行python文件時(shí)對(duì)結(jié)果進(jìn)行保存的方法
今天小編就為大家分享一篇cmd運(yùn)行python文件時(shí)對(duì)結(jié)果進(jìn)行保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
python實(shí)現(xiàn)批量提取指定文件夾下同類型文件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量提取指定文件夾下同類型文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Python實(shí)現(xiàn)解析參數(shù)的三種方法詳解
這篇文章主要介紹了python解析參數(shù)的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-07-07
pymongo如何通過oplog獲取數(shù)據(jù)(mongodb)
使用MongoDB的oplog(操作日志)進(jìn)行數(shù)據(jù)同步是高級(jí)的用法,主要用于復(fù)制和故障恢復(fù),這篇文章主要介紹了pymongo通過oplog獲取數(shù)據(jù)(mongodb),需要的朋友可以參考下2023-09-09
Python 如何修改程序默認(rèn)時(shí)區(qū)
這篇文章主要介紹了Python 如何修改程序默認(rèn)時(shí)區(qū),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Python接口自動(dòng)化淺析如何處理動(dòng)態(tài)數(shù)據(jù)
本文是python接口自動(dòng)化系列文章,主要介紹了接口自動(dòng)化過程中,動(dòng)態(tài)數(shù)據(jù)如何生成、動(dòng)態(tài)數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)進(jìn)行對(duì)比并替換,有需要的朋友可以參考下2021-08-08

