LoginSignup
18
13

More than 5 years have passed since last update.

Pythonで簡単なユニットテスト(超初心者向け)

Posted at

最近Pythonでユニットテストの勉強をしたので備忘録も兼ねて簡単に記事にしておく

実行環境

  • Python 3.5.1

ライブラリ

今回Pythonでユニットテストを行うにあたってunittestというライブラリを使用する。
unittestは標準でインストールされているライブラリのためpipでインストールする必要がなく非常にお手軽である。

実践

まずはこの簡単な足し算のプログラムをテストする。

math.py
def add(a, b):
    return a + b

テストするプログラムはこんな感じ

test_math.py
import unittest
from Math import *


class TestMath(unittest.TestCase):
    def test_add(self):
        value1 = 2
        value2 = 6
        expected = 8
        actual = add(value1, value2)
        self.assertEqual(expected, actual)


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

手順

  • import unittestunittestを読み込みます。
  • unittest.TestCaseを継承したクラスを作成します。
  • テストを行う関数を定義します。
  • unittest.main()でテストを実行します。

実行

$ python test_math.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

テストが成功するとこのように表示されます。

テストの前後に処理を行う

それぞれのユニットテストを行うにあたってテストの前後に処理を挟みたい時があります。
unittestにはそのためのメソッドが用意されており、ユニットテスト開始前に実行されるメソッドはsetUp()、終了時に実行されるメソッドはtearDown()が使用できます。
実際に実行して見ましょう。

math.py
def add(a, b):
    return a + b


def sub(a, b):
    return a - b

先ほどのmath.pyにsub(引き算)メソッドを追加しました。
add()sub()を一つのテストクラスで実行した場合に、それぞれのユニットテスト実行前後に処理を挟めるようにして見ましょう。

test_math.py
import unittest
from Math import *


class TestMath(unittest.TestCase):
    def setUp(self):
        print("setup!")

    def test_add(self):
        print("add!")
        value1 = 2
        value2 = 6
        expected = 8
        actual = add(value1, value2)
        self.assertEqual(expected, actual)

    def test_sub(self):
        print("sub!")
        value1 = 6
        value2 = 2
        expected = 4
        actual = sub(value1, value2)
        self.assertEqual(expected, actual)

    def tearDown(self):
        print("teardown!\n")


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

これを実行してやると下記のようになります。

setup!
add!
teardown!

.setup!
sub!
teardown!

.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

上手くそれぞれのユニットテストの前後に処理が挟まれました。

まとめて実行

テストモジュールが大量に存在する場合に、いちいち全てを叩いてテストしていてはキリがないので、unittestにはまとめて実行できる機能が用意されている。

$ python -m unittest discover
上記のようにdiscoverを使ってやればテストモジュールを一気に実行してくれます。

最後に

今回は同じ値だった場合にOKを返すassertEqual()メソッドを使いましたが、他にも値が一致しない場合にOKを返すassertNotEqual()メソッドなど様々のものがあります。詳しくは公式のドキュメントを参照してください。

18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13