Python学習ノート(3)デバッグテスト

5675 ワード

中国語学習サイト:廖雪峰の公式サイトhttps://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

3.デバッグとテスト


try except finally

  • 実行ロジック:tryを先に実行し、異常に遭遇するとtryを飛び出し、exceptが異常をキャプチャするとexceptブロックを実行し、最後にfinnally(異常の有無にかかわらず)
  • を実行する
  • Pythonのエラーもclassで、すべてのエラータイプはBaseExceptionから継承され、exceptは指定したタイプのエラーだけでなく、すべてのサブクラスのエラーもキャプチャされます.例えば
  • try:
        foo()
    except ValueError as e:
        print('ValueError')
    except UnicodeError as e: # except UnicodeError, UnicodeError ValueError , , except 。
        print('UnicodeError')
    
  • raiseはエラータイプを放出します.raise文はパラメータを持たないと、現在のエラーをそのまま投げ出します.
  • 一般的なエラー・タイプと継承関係については、次を参照してください.https://docs.python.org/3/library/exceptions.html#exception-hierarchy
  • 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
    

    デバッグ方法

  • 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
  • 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()
    

    ドキュメントテスト

  • pythonは、注釈にサンプルコードを記述し、注釈のコードを自動的にテストすることをサポートします.
  • は>>>によって注釈のサンプルコードを判断し、注釈の出力とテストの出力が完全に一致しているかどうかを比較します(エラーを報告しても、エラー情報は完全に同じで、1文字も悪くないはずです).完全に一致しないと、エラーが報告され、完全に一致していると、何も出力されません.
  • # 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()