Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

unittestのテスト関数にも色々とある

shuzo-kino.hateblo.jp
の流れで。
unittestには色々とテスト関数があります。

実際のところ

assertEqual/assertNotEqual

a = 1
b = 1
self.assertEqual(a, b)
# => OK

c = 2
self.assertNotEqual(a, c)
# => OK
型固有を使わなくともassertEqual/assertNotEqualで十分っぽい

一応、型固有の比較関数は色々あるのですが……assertEqualのドキュメントを参照すると以下のように書いています。

assertEqual(first, second, msg=None)(原文)
first と second が等しいことをテストします。両者が等しくない場合、テストは失敗です。

さらに、 first と second が厳密に同じ型であり、list、tuple、dict、set、frozenset もしくは str のいずれか、またはサブクラスが addTypeEqualityFunc() に登録されている任意の型の場合、より有用なデフォルトのエラーメッセージを生成するために、その型特有の比較関数が呼ばれます(型固有のメソッドの一覧 も参照してください)。

バージョン 3.1 で変更: 自動で型固有の比較関数が呼ばれるようになりました。

バージョン 3.2 で変更: 文字列比較のデフォルトの比較関数として assertMultiLineEqual() が追加されました。

というわけで、assertEqualメソッドをつかうと型用の比較関数を呼ばなくとも判断して適切な関数を読んでくれるようです。
引数を参照すれば、型は多くの場合自明なので……

  • 書いてる自分の頭を整理したい時
  • 何らかの理由でテストを一クロックでも高速化したい

なんてときに明確に型用関数を呼ぶ……みたいな運用ですかね

assertTrue/assertFalse

これは内部で組み込みメソッドbool()を呼び出し、判定する奴です。
返り値としてTrue/Falseを使っているなら、こっちの方が見通しがよいですね。

a = 1
self.assertTrue(a)
# => OK

b = False
self.assertTrue(b)
# => NG

assertGreater/assertLess

これは見たまんま

a = 1
b = 2
self.assertGreater(b, a)
# => OK

self.assertLess(a, b)
# => OK

派生物としてGreaterEqualだのNotLessだのといったのもあります。

assertAlmostEqual/assertAlmostNotEqual

やや特殊なのがこちら
内部で7桁のroundを呼び出して、結果を0.0と比較するやつです
標準の対応桁は7ですが、三番目の引数として与えてあげれば変更可能です

a = 2.01
b = 2.0

round(a-b.0,1)
# 0.0

round(a-b,1) == 0
# True

self.assertAlmostEqual(a,b,1)
# OK

self.assertAlmostEqual(2010,2000,-2)
# OKです。roundで出来ることはこの関数でも可能