Java 見習いのもりもとです。
アリエルのスタート地点 を知ってから、いつもどぎまぎしながら開発しています。
アリエルのスタート地点は、Javaと聞いて、ふっと鼻で笑える地点です。
私にとっては、スタート地点がまだまだ遠そうなのでしばらくは Python の話題でお茶を濁そうと思います。ちょうど良い機会なので Pythonic なテストツール pytest についてチュートリアルのような記事を何回かに分けて書きます。
pytest は、設定より規約 を設計原則とするツールで、xUnit スタイルではない funcarg という関数の引数をフックしてリソースインジェクションを行う仕組みを提供するなど、ユニークなテストツールです。さらに単体テスト、機能テスト、システムテストといった全てのテストフェーズにおいても利用できると、その応用範囲の広さも喧伝しています。ドキュメントも翻訳されているので参考にしてください。
さて、先日、社内のアルバイトの方が Python で作成したツールを紹介されていました。おそらく Python プログラミングにまだ慣れていないのだと推測しますが、コーディングスタイルに一貫性が見られませんでした。私も若い頃、先輩から「コードに統合性がない」とレビューでよく指摘されたものです。
Python では PEP 8 (翻訳) というデファクトのコーディングスタイルが提案されていて、広くよく守られているようです。とは言え、まだ Python に慣れないプログラマーが意識しながらコーディングするのはちょっと大変です。そんなときに便利なのが pep8 というチェックツールです。
先に必要なツールを pip を使ってインストールしておきます。
$ pip install pep8 pytest pytest - pep8
インストールが完了したら pep8 をコマンドラインから使ってみましょう。以下のサンプルプログラムのコーディングスタイルをチェックします。
import sys, os
class A(object): pass
def func(x, y = 2):
return x, y
def main():
l = [1,2, 3, 4, 5]
d = {'a': 1, 'b':2}
if __name__ == "__main__":
main()
$ pep8 ugly_sample . py
ugly_sample . py : 6 : 11 : E401 multiple imports on one line
ugly_sample . py : 9 : 16 : E701 multiple statements on one line ( colon )
ugly_sample . py : 12 : 14 : E251 no spaces around keyword / parameter equals
ugly_sample . py : 12 : 16 : E251 no spaces around keyword / parameter equals
ugly_sample . py : 15 : 1 : E302 expected 2 blank lines , found 1
ugly_sample . py : 16 : 11 : E231 missing whitespace after ','
ugly_sample . py : 17 : 21 : E231 missing whitespace after ':'
たくさんエラーが検出されましたね。エラー出力に従って修正していくだけでも見た目 の良いプログラムになります。慣れた人ならこの出力から該当行をみて修正できますが、もっと分かりやすいエラー表示をしてくれるのが pytest-pep8 プラグインです。以下のように “–pep8” オプションを付けて実行します。
$ py.test --pep8 ugly_sample.py
============================= test session starts ==============================
platform darwin -- Python 2.7.3 -- pytest-2.2.4
collected 1 items
ugly_sample.py F
=================================== FAILURES ===================================
__________________________________ PEP8-check __________________________________
/private/tmp/ugly_sample.py:6:11: E401 multiple imports on one line
import sys, os
^
/private/tmp/ugly_sample.py:9:16: E701 multiple statements on one line (colon)
class A(object): pass
^
/private/tmp/ugly_sample.py:12:14: E251 no spaces around keyword / parameter equals
def func(x, y = 2):
^
/private/tmp/ugly_sample.py:12:16: E251 no spaces around keyword / parameter equals
def func(x, y = 2):
^
/private/tmp/ugly_sample.py:15:1: E302 expected 2 blank lines, found 1
def main():
^
/private/tmp/ugly_sample.py:16:11: E231 missing whitespace after ','
l = [1,2, 3, 4, 5]
^
/private/tmp/ugly_sample.py:17:21: E231 missing whitespace after ':'
d = {'a': 1, 'b':2}
^
該当行のどの部分がエラーなのかを指摘してくれているのでさらに分かりやすいですね。また次回に紹介しますが、テストが失敗したときのエラーレポートの見やすさ・分かりやすさも pytest の特徴の1つです。
PEP 8 違反の内容は分かるようになりましたが、ときには完全準拠するのもやや窮屈に感じることがあるかもしれません。そんなときに特定のエラーを無視するようにも設定できます。
pytest のオプション指定やプラグイン設定などは INI ファイル形式で設定します。以下のようにカレントディレクトリに pytest.ini を設定します。addopts は py.test に渡すオプションをデフォルトで設定するためのパラメーターです。
$ vi pytest . ini
[ pytest ]
addopts = -- pep8
pep8ignore = E302 E701
今回はオプション無しで py.test を実行すると、E302 と E701 を無視したエラーレポートが表示されます。
まとめ
py.test で通常のテストを実行するとき、pytest-pep8 プラグインもインストールしておいて、ついでに PEP 8 のコーディングスタイルをチェックするのはとても簡単そうだ と思ったでしょうか。テストは面倒だと、億劫になってやらなくなってしまうので、この簡単にできるようにする仕組みも重要です。
Python コードはなるべく PEP 8 に従ってコーディングしよう
pytest という Pythnic なテストツールを使ってみよう
pytest-pep8 プラグインを使って pep8 テストを実行してみよう
次回は pytest を使って実際にテストを書くことについて紹介します。
関連文書:
最近のコメント