1. 程式人生 > >python錯誤處理/調試/單元測試/文檔測試

python錯誤處理/調試/單元測試/文檔測試

highlight execption 語句 unittest filename raise 不能 key nbsp

一.錯誤處理

1.錯誤處理

try:
    ...
except Exception1:
    ...
except Exception2:
    ...
finally:
    ...

  

如果在try中發生錯誤,那麽except將捕獲到指定錯誤,然後執行該段語句;而無論有無錯誤finally都會執行.

2.示例代碼:

#-*-coding=utf-8-*-
a = 0
try:
  10 / a
except BaseException:
  print(‘a  is 0‘)
finally:
  print(‘done‘)

  

所有異常的異常都繼承自BaseExecption,所以可以指定BaseExecption來捕獲所有異常

3.拋出錯誤

raise為編程者手動拋出錯誤
格式:
raise 錯誤類型(錯誤信息)
註意,raise語句如果不帶參數,就會把當前錯誤原樣拋出或拋出No active exception to reraise

#-*-coding=utf-8-*-
a = 0
try:
  if a == 0:
      raise ValueError(‘a is 0‘)
  10 / a
except Exception as e:
  print(e)
finally:
  print(‘done‘)

  

二.調試

1.print函數

2.斷言:

assert a != 0, ‘a is 0‘


如果a不等於0,符合預期,否則輸出a is 0

可以使用 -O來關閉assert輸出:

python -O file.py

  

3.日誌記錄:

示例:

import logging
logging.basicConfig(filename=‘log.log‘, level=logging.INFO)

logging.info(‘發生錯誤‘)

  

三.單元測試

1.引入python的unittest模塊

2.編寫測試類,從unittest.TestCase繼承

3.重要的兩種方法:

self.assertEqual(abs(-1), 1) # 斷言函數返回的結果與1相等

  

#斷言是否會引發指定類型的錯誤
with self.assertRaises(KeyError):
    value = d[‘empty‘]

  

4.setUp()在每調用一個方法前被執行

5.tearDown()在每調用一個方法後被執行

6.運行單元測試

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

  

另一種方法是在命令行通過參數-m unittest直接運行單元測試,這樣可以一次運行多個單元測試

7.示例代碼:

import unittest

def say_hello():
    return ‘hello‘

def division(a):
    if a == 0:
        raise ValueError(‘a不能為0‘)
    return 100/a

class Test(unittest.TestCase):
    def setUp(self):
        print(‘測試開始了‘)
    def test_say_hello(self):
        self.assertEqual(say_hello(), ‘hello‘)

    def test_division(self):
        with self.assertRaises(ZeroDivisionError):
            division(0)
    def tearDown(self):
        print(‘測試結束了‘)

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

  

四.文檔測試

文檔註釋中寫入交互命令,即可作為文檔測試

class OK:
    """
    this is test ok

    Example:

    >>> ok = OK()
    >>> ok.my(1,2)
    30
    >>> ok.my(2,-1)
    Traceback (most recent call last):
        ...
    Param is error: -1
    """
    def my(self, a, b):
        return a + b

if __name__ == ‘__main__‘:
    import doctest
    doctest.testmod()

  

python錯誤處理/調試/單元測試/文檔測試