Posted on

Python Bottleのソースを読む ユニットテスト編

Python Bottleのソースを読む テスト編
前回までで一通りメインの機能は確認できました。ではいよいよコード追加してプルリクを投げましょうというところですが、テストは?ということでユニットテストとカバレッジ状況をチェックしてみます。また自作アプリに対してのテスト方法もチェックしてみます。

Bottleのユニットテストとカバレッジ状況

GitHub上のBottleをクローンすると直下にtestディレクトリがあります。ここにずらーっとテストがありますが、よくよく見てみるとtestall.pyという全実行のエントリポイントが用意されているのでそれを実行します。

# noseを入れてない場合はインストール
pip install nose
# こんな感じに実行
nosetests --with-coverage --cover-html testall.py

でました。
20160623211937
bottle.pyだけを見てみると
76%
しっかりテストが書かれてるのがわかります。

bottle.py                       2277    485    849     79    76%

そしてhtmlをチェック
20160623211742
コードのカバレッジ状況が一目瞭然。あとは足りないとこテストしたり自分で処理追加してテストしたり。これでいろいろ安心。

BottleでつくったWebアプリのテスト方法

せっかくなのでWebアプリのテスト方法も見てみます。これは公式ドキュメントにしっかり書かれているのでそこをみればだいたい分かると思います。
noseインストール

pip install nose

テスト対象コード

import bottle
@bottle.route('/')
def index():
    return 'Hi!'
if __name__ == '__main__':
    bottle.run()

テストコード
単純にindex()を実行して結果をassertする

import mywebapp
def test_webapp_index():
    assert mywebapp.index() == 'Hi!'

テスト実行

nosetests test_app.py
Ran 1 test in 0.014s
OK

上記は直接関数をテストする方法ですがwebtestを使ってwebベースでアクセスしてテストする方法もあります。ただこの方法をやってみたところ明示的 app = Bottle()を宣言しないとうまく実行できませんでした。ここら辺はもう少しwebtestの使い方がわかればなんとかなるかもしれません。
webtestインストール

pip install webtest

テスト対象コード

from bottle import Bottle
# アプリを明示的に作成
app = Bottle()
@app.route('/')
def index():
    return 'Hi!'
if __name__ == '__main__':
    run(app=app)

テストコード
公式ドキュメントではログイン・ログアウトのテストが書かれてましたがここでは省略

from webtest import TestApp
import mywebapp
def test_index():
    app = TestApp(mywebapp.app)
    assert app.get('/').status == '200 OK'

テスト実行

nosetests test_app.py
Ran 2 tests in 0.003s
OK

これでいろいろ安心