secretbase.log

.NET/C#/Pythonなど

Python の unittest と テスト駆動開発 を Eclipse でやってみる

エキpy 11章に、 average 関数をテスト駆動開発で実装する手法が書いてあったのでさわりの部分をやってみました。写経です。写経大事。でも Eclipse もそんなに慣れてないです*1
Pythonの標準テスティングフレームワークは、unittest で JUnitJavaで行なっていることと同じ機能を提供します。import unittest して unittest.TestCase という基底クラスを継承したクラスの test から始まるメソッドを実行してくれます。

ここでは、受け取った複数データの平均値を求める average関数のテストとその実装です。TDDなのでテストコードからつくるんですね。
では、さっそくやってみましょう。

環境

  • Pleiades 3.7 indigo on Windows 7 Professional 64-bit
  • PyDev 2.6.0

最初のテストコードと実装

最初のテストコード (test_average.py)
from average import average
import unittest

class AvgTest(unittest.TestCase):
    def test_average(self):
        self.assertEquals(average(1,2,3),2)

if __name__ == '__main__':
    unittest.main()
最初の実装 (average.py)
def average(*numbers):
    return sum(numbers) / len(numbers)

if __name__ == '__main__':
    average(1,2,3)

PyUnitで実行します。グリーンになりました。

テストコードを追加

テストコードに追加

では、浮動小数点に対応することにしましょう。まずはテストコードを追加します。

from average import average
import unittest

class AverageTest(unittest.TestCase):
    def test_average(self):
        self.assertEquals(average(1,2,3),2)

    def test_average_floating(self):
        self.assertEqual(average(0,1), 0.5, 'floating point test')

ここでテストを実行すると、レッドになります。

機能実装

では機能実装しましょう。浮動小数点に対応するために内部はfloatで持つようにします。

def average(*numbers):
    # 受け取った全ての数値を浮動小数点として扱う
    numbers = [float(num) for num in numbers]
    return sum(numbers) / len(numbers)

PyUnitを実行しましょう(ショートカットキーがわからない。F9だとなんだか違う動作するので、アイコンをクリック)
無事グリーンになりました。

所感

  • ちゃんとグリーンバーがでる。こういうIDE環境はヤル気が出ていいなぁ。
  • テスト実装→レッド→機能実装→グリーンという回転を何回か体験。
  • test_hoge のメソッドが1テスト項目になるので、テスト項目は分けたほうがいいのかなぁ。
  • 確か JUnit だと Ctrl + 9 でテストコードと機能コードの行き来ができるんだけど、PyUnitだとできないみたい(´・ω・`)
    • 2012/08/24追記 Quick JUnit だとテストコードと機能コードの行き来ができる機能*2があり、他のxUnitではできないようです。

課題

  • PyUnit を実行するショートカットがわからなかった。むむむ。

エキスパートPythonプログラミング

エキスパートPythonプログラミング

*1:今回はPleiades の Ultimate を使いました

*2:http://www.atmarkit.co.jp/fjava/rensai4/devtool16/devtool16_1.html