Python Bottleのソースを読む テスト編前回までで一通りメインの機能は確認できました。ではいよいよコード追加してプルリクを投げましょうというところですが、テストは?ということでユニットテストとカバレッジ状況をチェックしてみます。また自作アプリに対してのテスト方法もチェックしてみます。
Bottleのユニットテストとカバレッジ状況
GitHub上のBottleをクローンすると直下にtestディレクトリがあります。ここにずらーっとテストがありますが、よくよく見てみるとtestall.pyという全実行のエントリポイントが用意されているのでそれを実行します。
# noseを入れてない場合はインストール
pip install nose
# こんな感じに実行
nosetests --with-coverage --cover-html testall.py
bottle.pyだけを見てみると76%しっかりテストが書かれてるのがわかります。
bottle.py 2277 485 849 79 76%
コードのカバレッジ状況が一目瞭然。あとは足りないとこテストしたり自分で処理追加してテストしたり。これでいろいろ安心。
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
これでいろいろ安心