Pythonのunittestで失敗したら即終了させる

はじめに

この記事では、「Pythonのunittestで失敗したら即終了させる方法」について書いています。

恥ずかしながらPythonでテストはあまり書いてこなかったのですが、それではいけないと一念発起し、色々なテストライブラリなどを勉強する中でこの記事を書きました。

自分に向けた備忘録の意味もありますが、「Pythonのunittestでより高度なテストを行いたい」や「unittestでテスト書いているけど、全部行うと時間がかかるので失敗したらその時点で終了させたい」な人の一助になれば嬉しいです。

前提(環境)

以下の環境で実験をしていきます。

要点だけ

  • -f(or --failfast)オプションをつけることで初回のエラーもしくは失敗の時にテストを停止します。

試してみる

実験のために、以下のプロジェクトを用意しました。

sample
├ test_add.py
└ test_sub.py

それぞれの中身は以下の通りです。

まずはtest_add.py

import unittest

class TestAdd(unittest.TestCase):
    def test_add_1(self):
        self.assertEqual(2, 1+2)

    def test_add_2(self):
        self.assertEqual(4, 1+3)

Note

test_add_1関数は、わざとテストが失敗するように書いてます。

つづいてtest_sub.py

import unittest

class TestAdd(unittest.TestCase):
    def test_sub_1(self):
        self.assertEqual(1, 2-1)

    def test_sub_2(self):
        self.assertEqual(2, 3-1)

さて、では普通にpython -m unittestを実行してみましょう。以下のような出力が得られます。

F...
======================================================================
FAIL: test_add_1 (test_add.TestAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\xxx\sample\test_add.py", line 5, in test_add_1
    self.assertEqual(2, 1+2)
AssertionError: 2 != 3

----------------------------------------------------------------------
Ran 4 tests in 0.001s

FAILED (failures=1)

下から三行目を見ると、Ran 4 testsと、2つのファイルに書かれている計4つの全てのテストが実施されていることが分かります。

この例ではテストの数が少なく、またテストはどれも非常に早く終わるため問題ありませんが、例えば全てのテストを終えるのに非常に時間がかかる場合、「一個でもテストに失敗したらその時点でさっさと終わりにしてほしい」と思うことがあるかもしれません。

その際に役に立つのが-fオプションです。

python -m unittest -fとして実行し、出力がどう変わるか見てみます。

F
======================================================================
FAIL: test_add_1 (test_add.TestAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\xxx\sample\test_add.py", line 5, in test_add_1
    self.assertEqual(2, 1+2)
AssertionError: 2 != 3

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

見た目はほぼ変わりませんが、下から三行目を見ると、Ran 1 testに変わっています。

これは、-fオプションが初回のエラーもしくは失敗の時にテストを停止するものなので、test_add_1のテスト関数で失敗した時点で終了をしてくれた結果、実行されたテストが1になっています。

ちなみに、-fffailfastの略で、-fの代わりに--failfastと書いて実行しても同じ結果を得られます。

おわりに

Pythonのunittestで失敗したら即終了させる方法」について解説しました。

この方法を知っておくと、「テストをより素早く効率的に行いたい」時などに役に立つかと思います。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

docs.python.org