Pythonのunittestのスキップ

Python学習【365日チャレンジ!】176日目のマスターU(@Udemy11)です。

青物(ハマチやらサゴシやら)の釣果情報を見てしまうと思わずそわそわしてしまいます。

もちろん次の日には早朝から青物狙いで釣りに行くことがありますが、準備万全で望んだときほど全く釣れなかった記憶しかありません。

魚に殺気が伝わっているのかもしれませんね。

それでは、今日もPython学習を始めましょう。

昨日の復習

昨日は、unittestの前後に何かの処理をさせるsetupとteardownを学習しました。

一つ一つのテストの前後に処理をさせることができるので、どこがおかしいのか一目瞭然。

テストをする際は必須の処理といえるでしょう。

setupとteardownの基本については昨日の記事を参考にして下さい。

今日は、作成したテストのスキップ方法を学習しましょう。

テストのスキップ

テストを作成したあと、条件に応じてテストを実施する必要のない場面が生じることがあります。

たとえば、アプリをリリースしたバージョンによっては、すでに過去のバージョンで問題がなく稼働することがわかっているため、改めてテストする必要はありません。

ただ、そのテストを削除してしまうと、再度テストコードを使う必要が出てきたときは、1からコードを書き直さなければなりませんし、条件を指定してテストを実行することはできなくなります。

なので、条件に応じてテストをスキップしたい時に活躍するのがテストのスキップです。

条件を指定せずにただスキップするパターンと、条件を指定してスキップするパターンを実行してみます。

条件無しでスキップ

メインのPythonファイル(calculation.py)のコードは昨日までと同じです。

class Cal(object):
    def add_and_double(self, x, y):
        if type(x) is not int or type(y) is not int:
            raise ValueError
        result = x + y
        result *= 2
        return result

続いて、テストのためのファイル(test_calculation.py)を書いていきましょう

テストを単純にスキップする場合は、スキップするデコレーターを使います。

import unittest

import calculation

class CalTest(unittest.TestCase):
    def setUp(self):
        print('setup')
        self.cal = calculation.Cal()

    def tearDown(self):
        print('clean up')
        del self.cal

    @unittest.skip('skipped')
    def test_add_add_double(self):
        self.assertEqual(self.cal.add_and_double(1, 1), 4)

    def test_add_and_double_raise(self):
        with self.assertRaises(ValueError):
            self.cal.add_and_double('1', '1')

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

ハイライトした14行目を付け加えただけです。

実行結果は次のようになります。

Ran 2 tests in 0.004s

OK (skipped=1)

Skipped: skipped
setup
clean up

最初のテストがスキップされて、2つめのテストが問題なく実行されているのがわかります。

条件を指定してスキップ

次に条件を満たしたテストのみスキップするコードを書いてみます。

import unittest

import calculation

release_name = 'test'

class CalTest(unittest.TestCase):
    def setUp(self):
        print('setup')
        self.cal = calculation.Cal()

    def tearDown(self):
        print('clean up')
        del self.cal

    @unittest.skipIf(release_name='test', 'skipped')
    def test_add_add_double(self):
        self.assertEqual(self.cal.add_and_double(1, 1), 4)

    def test_add_and_double_raise(self):
        with self.assertRaises(ValueError):
            self.cal.add_and_double('1', '1')

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

ハイライトしている5行目でグローバル変数release_nameを定義して、16行目でグローバル変数release_nameが定義されたものである場合unittest.skipIf()を使ってテストをスキップするコードを書いています。

出力される結果は、先ほどと同じ結果になります。

もちろん、5行目で定義されているrelease_nameがtest以外だった場合は、スキップされずにテストが実行されます。

プログラムは緻密

私はもともとおおざっぱな性格なので、緻密な分析が苦手です。

自分の感覚に頼っていろいろなことを決めちゃうので、失敗することが多くうまくいくことはあまりありませんでした。

うすうす感じてはいたのですが、緻密にものを考えるのが面倒なので、まーいいかって考えていました。

まるで新型コロナウイルス感染予防に対する今の政府の対応みたいですね(笑)

恥ずかしながら、このことに気づいたのはごく最近で、それからは、もっとしっかりと分析をしたうえでやることを決めようと思って現在実行中です。

逆に、プログラムは曖昧さが全くありません。
緻密なコードを書いていたとしても、ミスがあればエラーが起こりますし、プログラムはきちんと動きません。

自分と全く違った性質のものを学ぼうとするんだから、私もたいがい変わり者ですね。

それでは明日もGood Python!