Pythonのunittestでテスト実行前後に処理を追加する
はじめに
この記事では、「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でテスト実行前後に処理を追加する方法」について解説しました。
この方法を知っておくと、「テストの前後で処理を入れたい」時などに役に立つかと思います。
さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。