Python でテスト

More than 5 years have passed since last update.


doctest

docstring 内に書ける。凡例として使える。


使い方

doctest を import し、docstring 内で以下のように書き、doctest.testmod() を呼ぶ。実行する際は python ${ファイル名}.py -v とする。


サンプルコード


sample.py

# -*- coding: utf-8 -*-

import doctest

def twice(n):
""" 引数を 2 倍して返す関数
>>> twice(8)
16
>>> twice(1850923)
3701846
"""

return n * 2

if __name__ == "__main__":
doctest.testmod()


実行

python sample.py -v

結果

Trying:

twice(8)
Expecting:
16
ok
Trying:
twice(1850923)
Expecting:
3701846
ok
1 items had no tests:
__main__
1 items passed all tests:
2 tests in __main__.twice
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

docstring を読んでみる

python

import sample

help(sample.twice)

twice(n)

引数を 2 倍して返す関数
>>> twice(8)
16
>>> twice(1850923)
3701846

これは…ありがたい…

Instance Method をテストする場合


  • testmod に引数として extraglobs を与える。extraglobs で定義された dictionary の key と値のセットは global 変数にマージされる。


sample.py

# -*- coding: utf-8 -*-

class IntUtil:
def twice(self, n):
""" 引数を 2 倍して返す関数
>>> mine.twice(8)
16
>>> mine.twice(1850923)
3701846
"""

return n * 2

if __name__ == "__main__":
import doctest
doctest.testmod(extraglobs = {'mine': IntUtil()})



unittest

一般的な単体テストおよび結合テストはこちらのモジュールで行う


開始処理と終了処理

setUp: 開始時実行

tearDown: 終了時実行


functions

関数名
説明

assertEqual(a, b, msg=None)
a == b

assertNotEqual(a, b, msg=None)
a != b

assertTrue(expr, msg=None)
bool(x) is True

assertFalse(x)
bool(x) is False

assertIs(a, b)
a is b

assertIsNot(a, b)
a is not b

assertIsNone(x)
a is None

assertIsNotNone(x)
a is not None

assertIn(a, b)
a in b

assertNotIn(a, b)
a not in b

assertIsInstance(a, b)
isinstance(a, b)

assertNotIsInstance(a, b)
not isinstance(a, b)


sample_test.py

# -*- coding: utf-8 -*-

import unittest
import sample

class SampleTest(unittest.TestCase):
def setUp(self):
self.util = sample.IntUtil()
def test_twice(self):
# 足した数と同値か
import random
roop = 0
while roop != 10000:
n = random.randint(0, 100)
ans = n + n
self.assertEqual(self.util.twice(n), ans)
roop += 1

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



参考資料