Python学習記録の:エラー、デバッグ、テスト

2525 ワード

エラー処理

# coding=utf-8
import logging
try:
    print 1 / 0
    # print 1 / int('a')
    # print 1 / 2
except ZeroDivisionError, e:
    logging.exception(e)  #  
    print "exception:", e
except ValueError, e:
    print "exception:", e
    raise SystemError('input error!')  #  
except Exception, e:
    print type(e)
    raise  #  
else:  #  
    print "no error"
finally:
    print "finally"

よくあるエラー・タイプと継承関係は、ここを参照してください.https://docs.python.org/2/library/exceptions.html#exception-hierarchy

デバッグ

  • print
  • を使用
  • 断言
  • assert n != 0, 'n is zero!'  #   True   AssertionError , 
    
  • logging
  • import logging
    logging.basicConfig(level=logging.NOTSET)
    s = '0'
    n = int(s)
    logging.info('n = %d' % n)
    print 10 / n
    

    ロゴはデバグ、info、warning、error...など複数のレベルがある場合、レベルが低いレベルの情報は出力されず、consoleやファイルなどに出力できます.
  • pdb
  • python -m pdb err.py
    

    デバッグモードに入り、lはコードを表示し、nは単一ステップで実行し、p は変数を表示し、qはデバッグを終了する.
  • pdb.set_trace()
  •   import pdb
    
      s = '0'
      n = int(s)
      pdb.set_trace() #  
      print 10 / n
    

    コードを実行すると、プログラムは自動的にpdbにあります.set_trace()は一時停止してpdbデバッグ環境に入り、コマンドpで変数を表示したり、コマンドcで実行を続行したりすることができます.

    ユニットテスト

  • 「テストドライバ開発」(TDD:Test-Driven Development)
  • ユニットテストを作成する場合、unittestからテストクラスを作成する必要があります.TestCase継承.
  • がtestで始まる方法がテスト方法であり、testで始まる方法がテスト方法とみなされず、テスト時に実行されない.
  • assertEquals() :
  • self.assertEquals(abs(-1), 1) #  1 
    
  • もう一つの重要な断言は、d['empty']を介して存在しないkeyにアクセスする場合、KeyError:
  • を投げ出すなど、指定されたタイプのErrorを投げ出すことを期待することである.
    with self.assertRaises(KeyError):
        value = d['empty']
    
  • 実行ユニットテスト(1)最も簡単な実行方法はmydict_test.pyの最後に2行のコードを加えることである:
  • if __name__ == '__main__':
        unittest.main()
    

    テストをスクリプトとして実行(2)コマンドラインでパラメータ-m unittestを介して実行
  • setuUpとtearDownの2つのメソッドは、1つのテストメソッドが呼び出されるたびにそれぞれ実行されます.いくつかのリソースのオン/オフ操作
  • を行うことができる.

    ドキュメントテスト


    ドキュメント内のサンプルコードを直接実行します.ドキュメント注記は、一般的に、関数定義文、クラス定義文の次の行で始まり、複数行の文字列の構文を使用します.
    def abs(n):
        """
         
        """
    

    モジュール内のドキュメントテストコード:
    if __name__ == "__main__":
        import doctest
    
        doctest.testmod()