1. 程式人生 > >重拾Python學習(七)----------錯誤、除錯和測試

重拾Python學習(七)----------錯誤、除錯和測試

本文參考:廖雪峰的官方網站:https://www.liaoxuefeng.com

錯誤處理

Python內建的try...except...finally用來處理錯誤
raise語句丟擲一個錯誤

try:
    print('try...')
    r = 10 / int('2')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
else: print('no error!') finally: print('finally...') print('END')

如果沒有錯誤發生,可以在except語句塊後面加一個else,當沒有錯誤發生時,會自動執行else語句

與Java的錯誤處理機制try/catch非常類似

除錯

logging

logging.info()就可以輸出一段文字

import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)

允許你指定記錄資訊的級別,有debug

infowarningerror等幾個級別,當我們指定level=INFO時,logging.debug就不起作用了

import logging
logging.basicConfig(level=logging.INFO)
pdb

Python的偵錯程式pdb,讓程式以單步方式執行

# err.py
s = '0'
n = int(s)
print(10 / n)
$ python -m pdb err.py

> /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>()
->
s = '0'

與C語言的gdb除錯非常類似

單元測試

引入Python自帶的unittest模組

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    def test_init(self):
        d = Dict(a=1, b='test')
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')

    def test_attr(self):
        d = Dict()
        d.key = 'value'
        self.assertTrue('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

編寫一個測試類,從unittest.TestCase繼承。以test開頭的方法就是測試方法,對每一類測試都需要編寫一個test_xxx()方法,最常用的斷言就是assertEqual()

執行單元測試:

if __name__ == '__main__':
    unittest.main()

或者在命令列通過引數-m unittest直接執行單元測試:

$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK

單元測試中編寫兩個特殊的setUp()tearDown()方法。這兩個方法會分別在每呼叫一個測試方法的前後分別被執行。