いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Pythonメモ-53 (pytest から pudb 起動) (pytest, pudb, pdbcls, pudb.debugger)

概要

前回、前々回とpudbについて書きました。

devlights.hatenablog.com

devlights.hatenablog.com

pudbのdocument見ると、pytestからpudb起動も出来るとのこと。

Getting Started — pudb 2.0.1.7...1...4 documentation

普段からpytest使っているので、これは期待大。

環境作り

まだpytest入れてなかったので、インストール

$ conda install pytest
Solving environment: done

## Package Plan ##

  environment location: /Users/xxxx/anaconda3/envs/pudb

  added / updated specs: 
    - pytest


The following NEW packages will be INSTALLED:

    attrs:          17.3.0-py36h9f37037_0
    coverage:       4.4.2-py36h8d5022f_0 
    hypothesis:     3.38.5-py36hcba0581_0
    pluggy:         0.6.0-py36hb1d0581_0 
    py:             1.5.2-py36ha69170d_0 
    pympler:        0.5-py36hc2752d1_0   
    pytest:         3.3.0-py36h707cbdc_0 
    zope:           1.0-py36_0           
    zope.interface: 4.4.3-py36h74e83c9_0 

Proceed ([y]/n)? 

Preparing transaction: done
Verifying transaction: done
Executing transaction: done

で、pytestとpudbを連携させるには pytest-pudbモジュールが必要とのこと。

これは、conda 側には存在しなかったので、pipでインストールします。

$ pip install pytest-pudb
Collecting pytest-pudb
  Downloading pytest-pudb-0.5.tar.gz
Requirement already satisfied: pytest>=2.0 in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pytest-pudb)
Requirement already satisfied: pudb in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pytest-pudb)
Requirement already satisfied: py>=1.5.0 in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pytest>=2.0->pytest-pudb)
Requirement already satisfied: six>=1.10.0 in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pytest>=2.0->pytest-pudb)
Requirement already satisfied: setuptools in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pytest>=2.0->pytest-pudb)
Requirement already satisfied: attrs>=17.2.0 in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pytest>=2.0->pytest-pudb)
Requirement already satisfied: pluggy<0.7,>=0.5 in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pytest>=2.0->pytest-pudb)
Requirement already satisfied: urwid>=1.1.1 in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pudb->pytest-pudb)
Requirement already satisfied: pygments>=1.0 in /Users/xxxx/anaconda3/envs/pudb/lib/python3.6/site-packages (from pudb->pytest-pudb)
Building wheels for collected packages: pytest-pudb
  Running setup.py bdist_wheel for pytest-pudb ... done
  Stored in directory: /Users/xxxx/Library/Caches/pip/wheels/95/86/34/64371b05b550e6f506a93ff981be3383bc92b745b7805d63fd
Successfully built pytest-pudb
Installing collected packages: pytest-pudb
Successfully installed pytest-pudb-0.5

これで、環境は出来たはず。

試してみる

てことで、以下のようなドウデモイイサンプルを用意しました。

"""
pudb module sample script.
"""

def main():
    total = 0
    for x in range(10):
        total += x
    return x, total

def test_main():
    results = main()
    assert results == (9, 55)

if __name__ == '__main__':
    main()

assert の部分が明らかにオカシイっていう。とりあえず fail させて pudb 起動するか確認したいってことで。

pytest と pudb を連携させるには、以下のようにコマンド入力します。

$ pytest --pdbcls pudb.debugger:Debugger --pdb --capture=no 

ちょっと長いけど、エイリアスでも切っておけばいいかな。

では、試してみます。

$ pytest --pdbcls pudb.debugger:Debugger --pdb --capture=no pudb_sample.py

実行すると、以下のようにpudbが起動しました。

f:id:gsf_zero1:20180109043251p:plain

バッチリ。pudb最高です。

画面右上に PROCESSING EXCEPTION - hit 'e' to examineって出ています。

その通りに、eをタイプすると、ちゃんとスタックトレースが表示されます。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。