モチベーション微妙

とは言え、無理矢理手を動かし始めてみると勢いつくかな、と思いつつ。
当初は Feedjack な試験から、と思ってたのですが Python な UT の方法を知らん事にようやく気づいて Python なマニュアルの 5.3 unittest -- 単体テストフレームワーク から読みつつ実際に中身を確認してみる事に。

基礎的な例

という事で以下のようなサンプルが提示されている。

import random
import unittest

class TestSequenceFunctions(unittest.TestCase):
    
    def setUp(self):
        self.seq = range(10)

    def testshuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))

    def testchoice(self):
        element = random.choice(self.seq)
        self.assert_(element in self.seq)

    def testsample(self):
        self.assertRaises(ValueError, random.sample, self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assert_(element in self.seq)

if __name__ == '__main__':
    unittest.main()

assertEqual はおそらく scheme で言うトコロの equal? と同じと見て良いはず。あるいは assert_ は真偽なソレな模様。最初の試験は shuffle した結果が range(10) な可能性もあるのかな? 元に戻して同じ値か、を確認しているのが分かる。
次の testchoice は微妙。in って何か、と Python マニュアルをごそごそ探ってみると 5.7 条件式についてもう少し の項に記述あり。曰く

比較演算子 in および not in は、ある値があるシーケンスの中に存在するか (あるいは存在しないか) どうか調べます。

となる。成程ッスか。最後の試験は何だ、と言いつつ調べてみると

>>> random.sample([0,1,2,3,4],5)
[1, 0, 2, 4, 3]
>>> random.sample([0,1,2,3,4],6)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.4/random.py", line 304, in sample
    raise ValueError, "sample larger than population"
ValueError: sample larger than population
>>> random.sample([0,1,2,3,4],4)
[4, 0, 1, 2]
>>>

みたいな感じ。てー事は

self.assertRaises(ValueError, random.sample, self.seq, 20)

  • throw される例外
  • メソド
  • 引数 ...

を渡すカンジに違いない。

なんとなくは分かったっぽいんですが、やっぱ Python なソレが微妙、なのかなぁ。とりあえず Feedjack なソレで試験を書いてみる事に。