はじめに
この記事では、「Pythonのunittestでテスト実行前後に処理を追加する方法」について書いています。
恥ずかしながらPythonでテストはあまり書いてこなかったのですが、それではいけないと一念発起し、色々なテストライブラリなどを勉強する中でこの記事を書きました。
自分に向けた備忘録の意味もありますが、「Pythonのunittestでより高度なテストを行いたい」や「unittestでテスト書いているけど、テストの前後で処理を入れたい」な人の一助になれば嬉しいです。
要点だけ
- テストクラス全体で行う前処理を書く場合は
setUpClass関数を作り、その中に記述する - テストクラス全体で行う後処理を書く場合は
tearDownClass関数を作り、その中に記述する - 個別の関数毎に行う前処理を書く場合は
setUp関数を作り、その中に記述する - 個別の関数毎に行う後処理を書く場合は
tearDown関数を作り、その中に記述する
コードだと以下のような感じです。
class TestXXX(unittest.TestCase):
@classmethod
def setUpClass(cls):
# ...(ここに処理を書く)
@classmethod
def tearDownClass(cls):
# ...(ここに処理を書く)
def setUp(self):
# ...(ここに処理を書く)
def tearDown(self):
# ...(ここに処理を書く)
前提(環境)
以下の環境で実験をしていきます。
試してみる
test_add.pyというファイルを作り中には以下のようなコードを書きます。
import unittest
class TestAdd(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("======= START =======")
@classmethod
def tearDownClass(cls):
print("======= END =======")
def setUp(self):
print("--- start ---")
def tearDown(self):
print("--- end ---")
def test_add_1(self):
print("in test_add_1")
self.assertEqual(3, 1+2)
def test_add_2(self):
print("in test_add_2")
self.assertEqual(4, 1+3)
それぞれ、関数が呼ばれたらコンソールに出力がされるように記述しました。
こうすることで、どのタイミングで何が呼ばれるかが分かるようにあります。
さて、ではpython -m unittestを実行してみましょう。以下のような出力が得られると思います。
======= START ======= --- start --- in test_add_1 --- end --- .--- start --- in test_add_2 --- end --- .======= END ======= ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK
出力を見てみると、以下のことが分かるかと思います。
======= START =======の出力(setUpClass関数)は最初しか呼ばれていない- ->
setUpClass関数はテストクラス全体の処理の頭に行われる
- ->
======= END =======の出力(tearDownClass関数)は最後しか呼ばれていない- ->
tearDownClass関数はテストクラス全体の処理の最後に行われる
- ->
--- start ---の出力(setUp関数)はテスト関数の前に呼ばれてる- ->
setUp関数は各テスト関数を行う直前に行われる
- ->
--- end ---の出力(tearDown関数)はテスト関数の後に呼ばれてる- ->
tearDown関数は各テスト関数を行った直後に行われる
- ->
おわりに
「Pythonのunittestでテスト実行前後に処理を追加する方法」について解説しました。
この方法を知っておくと、「テストの前後で処理を入れたい」時などに役に立つかと思います。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。