Python学習ノート(3)デバッグテスト
5675 ワード
中国語学習サイト:廖雪峰の公式サイトhttps://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
実行ロジック:tryを先に実行し、異常に遭遇するとtryを飛び出し、exceptが異常をキャプチャするとexceptブロックを実行し、最後にfinnally(異常の有無にかかわらず) を実行する Pythonのエラーもclassで、すべてのエラータイプはBaseExceptionから継承され、exceptは指定したタイプのエラーだけでなく、すべてのサブクラスのエラーもキャプチャされます.例えば raiseはエラータイプを放出します.raise文はパラメータを持たないと、現在のエラーをそのまま投げ出します. 一般的なエラー・タイプと継承関係については、次を参照してください.https://docs.python.org/3/library/exceptions.html#exception-hierarchy
print assert、使用assert式、式がfalseの時の出力、pyファイルを実行する時に-Oオプションを加えてすべての断言出力 を遮蔽することができます log、使用方法 import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='myapp.log',filemode='w')#logレベルを設定、出力フォーマット、出力ファイル名、デフォルトはスクリーンloggingに出力.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') pdb pdb:python 3-m pdb errを起動する.py n:単一ステップ実行 l:現在のコードを表示 p変数名:表示変数 q:デバッグを終了 c: の実行を続行コードのpdb.set_trace()設定ブレークポイント
手順:はunittestからテストクラスを作成した.TestCase継承 ユニットテスト関数を記述し、testで始まる方法がテスト方法であり、testで始まる方法がテスト方法とはみなされず、テスト時に実行されない. setup()およびtearDown()関数を記述します.この2つのメソッドは、1つのテストメソッドが呼び出されるたびにそれぞれ実行されます.
setuup()とtearDown()の方法は何に使いますか?テストでデータベースを起動する必要があると想定すると、setup()メソッドでデータベースに接続し、tearDown()メソッドでデータベースを閉じることができます.これにより、テストメソッドごとに同じコードを繰り返す必要がなくなります.ユニットテスト、 メソッド1:pyファイルの最後にunittestを実行します.main(), メソッド2(推奨):python 3-m unittest mydict_test
pythonは、注釈にサンプルコードを記述し、注釈のコードを自動的にテストすることをサポートします. は>>>によって注釈のサンプルコードを判断し、注釈の出力とテストの出力が完全に一致しているかどうかを比較します(エラーを報告しても、エラー情報は完全に同じで、1文字も悪くないはずです).完全に一致しないと、エラーが報告され、完全に一致していると、何も出力されません.
3.デバッグとテスト
try except finally
try:
foo()
except ValueError as e:
print('ValueError')
except UnicodeError as e: # except UnicodeError, UnicodeError ValueError , , except 。
print('UnicodeError')
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
デバッグ方法
ユニットテスト
手順:
setuup()とtearDown()の方法は何に使いますか?テストでデータベースを起動する必要があると想定すると、setup()メソッドでデータベースに接続し、tearDown()メソッドでデータベースを閉じることができます.これにより、テストメソッドごとに同じコードを繰り返す必要がなくなります.
import unittest
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')
if __name__ == '__main__':
unittest.main()
ドキュメントテスト
# mydict2.py
class Dict(dict):
'''
Simple dict but also support access as x.y style.
>>> d1 = Dict()
>>> d1['x'] = 100
>>> d1.x
100
>>> d1.y = 200
>>> d1['y']
200
>>> d2 = Dict(a=1, b=2, c='3')
>>> d2.c
'3'
>>> d2['empty']
Traceback (most recent call last):
...
KeyError: 'empty'
>>> d2.empty
Traceback (most recent call last):
...
AttributeError: 'Dict' object has no attribute 'empty'
'''
def __init__(self, **kw):
super(Dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
if __name__=='__main__':
import doctest
doctest.testmod()