ものづくりベンチャーたくらみブログ

ものづくりベンチャーでの起業をたくらむ20代ハードウェアエンジニアtottiの道程

eclipse × Pydev × nose で快適なTDD環境を立ち上げる

概要

TDD楽しい!

eclipseの強力なGUIベースの環境でTDDを行うために、環境立ち上げからテスト実行・カバレッジの取得まで、立ち上げ方を順にまとめる。

noseのインストール

Python環境のテストフレームワーク色々あるが、その中でも評判の良いnoseを使う。noseはunittestのラッパーで、簡単にテストケースを書けるところが長所。標準のテストフレームワークであるunittestはxUnitの仕様を忠実になぞっているため、ややめんどくさく感じるところがある。

noseのインストールにはpipというパッケージ管理モジュールを使う。 pipを持っていない人はココからインストール。(PleiadesやAnacondaなどのディストリビューションには初めから含まれているので、知らないうちに入っているかも)

次にpipを使ってnoseをインストールする。

$ python -m pip install nose

これだけでインストール完了(簡単!)。noseモジュールを使える状態が整った。

Eclipseの設定

  1. テストランナーを変更する [ウィンドウ] > [設定] > [Pydev] > [PyUnit] のテスト・ランナーの項目がデフォルトでは[Pydev test runner]に設定されているので、[Nose test runner]に変更する。

  2. PyUnitビューを表示する グラフィカルに結果ががわかるとやる気が出るのでテスト結果の確認方法は重要。テストの実行結果はPyUnitビューに表示されるので常に表示しておくべし。 [ウィンドウ] > [ビューの表示] > [PyUnitウィンドウ]を選択して適当な場所に配置する。

テストの実行

あとはテストを書いて実行するだけ。モジュール単体でテストするやり方とプロジェクト全体でテストするやり方がある。

  1. モジュール単位のテスト これはショートカットキーが用意されてる。テスト対象のテストモジュールを開いた状態で[Ctrl+F9]を押すと"Select test to run"というウィンドウが表示されるのでモジュール内のテストを全て実行したい場合はそのままEnter、特定のテストのみ実行したい場合はそのテストをダブルクリックすることで実行できる。

  2. プロジェクト内の全テスト プロジェクト内の全テストを実行したくなることも多々ある。というか、かかる時間が数秒であれば毎回全テスト実行したい。ただしPydev環境では全テストを実施するショートカットキーが用意されていないため、私は次のように実行してる。

  3. 一度目の実行は手動で選択する。Pydevパッケージエクスプローラーで、対象となるプロジェクトを右クリック > [実行] > [Python ユニットテスト] でプロジェクト全体のテストが走る。

  4. 二度目以降は直前の実行をもう一度実行するためのショートカットキー[Ctrl+Shift+F9]を使って実行する。

テストを実行すると、PyUnitビューのインジケータが赤くなったり緑になったりする。これで一通りTDDのサイクルが回せる環境が整った。

コードカバレッジを表示する

さらにコードカバレッジを表示できるようにする。コードカバレッジとは、テスト対象のコードのうち、どこをカバーしているか、どのくらいの割合カバーしているかを示す統計データのこと。これを見ればどのくらいきちんとユニットテストしているかが数値でわかるので参考になる。

  1. coverageビューをインストール 先ほども登場したpipコマンドを使ってインストールする。 なお、最新版のcoverageモジュールを使うとPydev上でエラーが発生したため少し前のバージョンを使用する必要がある。
$ pip install "coverage < 4.0.0"
  1. コードカバレッジビューを表示 [ウィンドウ] > [ビューの表示] > [コード・カバレッジ]を選択
  2. コードカバレッジ対象の設定 ビューの左上の"Enable code coverage for new launches?"にチェックを入れて、"Choose folder to analyze"からテスト対象のプロジェクトを選択

これで準備OK。この状態でテストを走らせると、自動的にコードカバレッジを集計してくれる。 カバレッジレポートの出力例はこちら。

f:id:totti_y:20160409032620p:plain

レポートの各数字の意味合いを以下にまとめた。

列の名前 意味
Stmts 全体の行数(Statements)
Miss テストされていない行数
Cover カバレッジ。Cover = Miss / Stms
Missing テストされていない行番号を列挙

また、レポート内のファイル名をクリックするとテストされていない部分が"Not Executed"となって目立つように表示されるため、 どの部分がカバーできていないかを見ながらテストコードを追加したりできる。

f:id:totti_y:20160409032631p:plain

終わりに

勢い余ってcoverageの導入までしてしまった。 テストやカバレッジをとることは自分のコードを客観的に見られる良い機会なので一人のコーディングでこそ継続したい。

改良点や気になる部分があれば気軽にコメントいただけると嬉しいです。それでは楽しいTDDライフを!