ユニットテストあれこれ 
2014/10/29 
岡山Python勉強会 
@k5_yamayama
自己紹介 
山手恵悟(やまやま) 
@k5_yamayama 
岡山の某DBメーカー勤務 
ユーザーCE→社内SE→企画開発→ 
→サーバー管理→営業に至る。 
(これってフルスタック…?)
コミュニティ 
Okayama Engineers Community(通称:OITEC) 
運営スタッフやってます。 
岡山Python勉強会(通称:おっPy) 
立ち上げスタッフ 
主催者のはずの“#た”が福山に戻っちゃった 
で現在は、ほぼ主催者状態。
はじめに 
前回までにDjangoのチュートリアルが終わった 
ので今回は、テスト(ユニットテスト)について 
お話をしようと思います。
注意事項 
本セッションは、やまやま個人が調査・検証した 
結果を発表するもので、間違いやこれにより損害 
が生じても一切責任を負いませんのでご了承くだ 
さい。
今日の目的とゴール 
 目的 
Pythonのテスト手法について知っても 
らう。 
 ゴール 
様々なユニットテスト手法を理解する。
主なテストの方法について 
 Pythonには、標準でテストを実施する方法が 
用意されています。 
主なテスト 
Unittest 
Nose 
Doctest 
今回は、上記のテストについて比較していこ 
うと思います。
対象のコード 
テスト元のメソッド 
def add_data(data): 
adddata = data + 1000 
return adddata
Unittest 
 Python標準で用意されているテスト方法 
 JunitのPython版 
 Assertメソッドにて比較を行う 
 テストメソッドの頭にはTestをつける 
 テスト対象のファイル名にはTest.pyとしな 
いこと
Unittest 
テストコード 
import unittest 
class TestSequenceFunctions(unittest.TestCase): 
def setUp(self): 
self.data = 10 
def test_adddata(self): 
# add data 
actual = method_sample.add_data(self.data) 
self.assertEqual(actual, 1010) 
if __name__ == '__main__': 
unittest.main() Assrtメソッドを使い比較処理を実 
施
Nose 
 Unittestの拡張モジュール 
 要インストール(SetupToolsで…) 
 C#でいうところのChainigAssertion 
 テストの内容を簡略化できる
nose 
さっきのコードをnoseでやると… 
from nose.tools import with_setup, raises 
from method_sample import add_data 
def test_add_data(): 
actual = add_data(0) 
assert actual == 1000 
def test_add_data2(): 
Assert.equalと同様の処理が簡 
素化 
されている 
a = 10 
actual = add_data(a) 
assert actual == 1010
doctest 
 メソッド内に記述した内容でチェックを行う 
機能 
 Docstring内にテスト内容を記述すると内容 
を解析してテストを行ってくれる 
 メソッドの簡易テスト的な意味あい(っぽい) 
 簡単な内容ならこれでOKかも… 
 コマンドライン引数を入れることで結果を表 
示させることが可能
doctest 
def add_data(data): 
"""add data of integer >= 0 
>>> add_data(1) 1001 
""" 
adddata = data + 1000 
return adddata 
if __name__ == "__main__": 
import doctest 
doctest.testmod() 
コメント内で処理を実行し、結 
果を比較している
まとめ 
 まずは基本的なテストの仕組みを理解するには 
unittestが有効 
 効率よく記入するには、noseを使って記述するほうが良 
さそう 
 Doctestは簡易テストとして使うべき 
 Docstringは、メソッドの説明+簡易テストを使い構 
築していくとライブラリコメントと動作の整合性がとり 
易い 
 各種コマンドラインで色々できるのでまずはやってみた 
ほうが良いと思います。
参考URL 
Unittest 
http://docs.python.jp/2/library/unittest.html 
Nose 
http://chocolapod.sakura.ne.jp/blog/entry/8 
0 
Doctest 
http://docs.python.jp/2/library/doctest.html
ご清聴ありがとうございまし 
た。

Pythonのユニットテスト