はじめに
この記事はpytestの利用が中心に書かれていますが、Pythonを使ったプログラミング全般に応用できる内容になっています。ぜひ最後までお付き合いください。
あらすじ
pytestやunittestなどのテストをしていて、テストコードのデバッグが必要になったとします。それでステップ実行してオブジェクトの中身を逐次網羅的に確認していくとします。
そんな時、自分のコードだけのステップ実行では問題が解決しないことがあります。そうすると、インストールしたライブラリの中までデバッグしたい場合があります。しかし、デフォルトでは自分のコード以外はステップ実行の範囲外となって、そこで起きているエラーしか表示されません。何故エラーなのか分からなくて困ってしまいます。
以下の設定をすれば、pip
などでインストールしたライブラリ内にブレークポイントを設定することもできます。
ただし、C言語で実装されたライブラリは本記事の末尾で紹介する参考ページのような方法が必要です。
通常のデバッグの場合
デバッグテストではなく、通常のデバッグのときには、
VSCodeでライブラリの中身まで入ってデバッグする設定をご覧いただくといいと思います。
普段の設定
普段は、vscodeでデバッグしているとき、launch.json
は以下の設定になっていることが多いと思います。
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}
デバッグテストで他者のライブラリに潜る設定
"request"が"test"になっている構成があると、デバッグテストのときに使用されます。
また、この構成は、最初の1つだけが読み込まれます。
以降に同様の構成があると無視されます。
この構成にjustMyCode
があり、「自分のコードだけ」か切り替えることが出来ます。
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
},
{
"name": "Debug Tests",
"type": "python",
"request": "test",
"console": "integratedTerminal",
+ "justMyCode": false
}
]
}
もちろん、元に戻すときには、追加した行を消すだけでOKです。
C言語で実装されたライブラリの場合
混合モード デバッグ機能と言って、Python と C++ を同時にデバッグする方法がVisual Studioで提供されています。
VScodeでも、Python と OpenCV を混合でデバッグ(ステップ実行)する方法を参考にして各種ライブラリをデバッグすることが可能です。
Excelsior!