Posted by & filed under 開発.


Java 見習いのもりもとです。

アリエルのスタート地点 を知ってから、いつもどぎまぎしながら開発しています。

アリエルのスタート地点は、Javaと聞いて、ふっと鼻で笑える地点です。

私にとっては、スタート地点がまだまだ遠そうなのでしばらくは Python の話題でお茶を濁そうと思います。ちょうど良い機会なので Pythonic なテストツール pytest についてチュートリアルのような記事を何回かに分けて書きます。

pytest は、設定より規約 を設計原則とするツールで、xUnit スタイルではない funcarg という関数の引数をフックしてリソースインジェクションを行う仕組みを提供するなど、ユニークなテストツールです。さらに単体テスト、機能テスト、システムテストといった全てのテストフェーズにおいても利用できると、その応用範囲の広さも喧伝しています。ドキュメントも翻訳されているので参考にしてください。

さて、先日、社内のアルバイトの方が Python で作成したツールを紹介されていました。おそらく Python プログラミングにまだ慣れていないのだと推測しますが、コーディングスタイルに一貫性が見られませんでした。私も若い頃、先輩から「コードに統合性がない」とレビューでよく指摘されたものです。

Python では PEP 8 (翻訳) というデファクトのコーディングスタイルが提案されていて、広くよく守られているようです。とは言え、まだ Python に慣れないプログラマーが意識しながらコーディングするのはちょっと大変です。そんなときに便利なのが pep8 というチェックツールです。

先に必要なツールを pip を使ってインストールしておきます。

インストールが完了したら 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()

たくさんエラーが検出されましたね。エラー出力に従って修正していくだけでも見た目の良いプログラムになります。慣れた人ならこの出力から該当行をみて修正できますが、もっと分かりやすいエラー表示をしてくれるのが pytest-pep8 プラグインです。以下のように “–pep8” オプションを付けて実行します。

該当行のどの部分がエラーなのかを指摘してくれているのでさらに分かりやすいですね。また次回に紹介しますが、テストが失敗したときのエラーレポートの見やすさ・分かりやすさも pytest の特徴の1つです。

PEP 8 違反の内容は分かるようになりましたが、ときには完全準拠するのもやや窮屈に感じることがあるかもしれません。そんなときに特定のエラーを無視するようにも設定できます。

pytest のオプション指定やプラグイン設定などは INI ファイル形式で設定します。以下のようにカレントディレクトリに pytest.ini を設定します。addopts は py.test に渡すオプションをデフォルトで設定するためのパラメーターです。

今回はオプション無しで py.test を実行すると、E302 と E701 を無視したエラーレポートが表示されます。

まとめ

py.test で通常のテストを実行するとき、pytest-pep8 プラグインもインストールしておいて、ついでに PEP 8 のコーディングスタイルをチェックするのはとても簡単そうだと思ったでしょうか。テストは面倒だと、億劫になってやらなくなってしまうので、この簡単にできるようにする仕組みも重要です。

  • Python コードはなるべく PEP 8 に従ってコーディングしよう
  • pytest という Pythnic なテストツールを使ってみよう
  • pytest-pep8 プラグインを使って pep8 テストを実行してみよう

次回は pytest を使って実際にテストを書くことについて紹介します。


関連文書:

Comments are closed.