Pythonでpytestを実行する

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

もう随分最新のiPhoneに興味を惹かれなくなって時間が経ちますが、次のiPhone12には少し興味を惹かれてしまいます。

なんと言っても超高速通信の5Gに対応するらしいので、画面をタッチする前からサイトが表示されてんじゃないの?なんて期待しちゃいます。

とはいえ、期待が大きすぎると期待はずれだったときのダメージも大きいので、過度な期待は禁物です。

まー、次のiPhoneを購入するかどうかはまだ未定なんですけどね。

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

昨日の復習

昨日は、pytestの例外処理のテストを学習しました。

ValueErrorを設定したメインのファイルに対してエラーがきちんと返ってくるかをテストするのが例外テストなので、ValueErrorが起こることでテストにクリアできるという少しこんがらがりそうな内容でした。

何を想定しているのかをきっちり考えてテストすることが大切でしたね。

pytestの例外テストについては、昨日の記事をごらんください。

今日は、pytestのsetupとteardownを学習します。

calculation.py

テストを実行するためのメインファイル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

次に、テスト用のファイルのコードを書いていきましょう。

昨日と同じように、最初にpytestをインポートして、次にテストするファイルをインポートします。

import pytest

import calculation

class TestCal(object):
    def setup_method(self,method):
        print('method={}'.format(method.__name__))
        self.cal = calculation.Cal()

    def teardown_method(self, method):
        print('method={}'.format(method.__name__))
        del self.cal

    def test_add_and_double(self):
        assert self.cal.add_and_double(1, 3) == 8

    def test_add_and_double_raise(self):
        with pytest.raises(ValueError):
            self.cal.add_and_double('1', '3')

ハイライトしている部分が付け加えたコードです

unittestの場合はsetUp()tearDown()でしたが、pytestの場合は、setup_method()teardown_method()として、引数にmethodを追加します。

7行目と11行目は、methodの名前(実行する関数名)を出力していますが、わかりやすくするために出力しているだけなので、なくても問題なくテストは実行されます。

また、8行目にself.cal = calculation.Cal()を加えているので、14行目以降の個々のテストで記述していたcal = calculation.Cal()を削除して、テストする関数の名前の前にself.を付け加えています。

実行結果は次のとおりで、テストがパスしたことと、print出力したメソッドの名前が表示されています。

Python pytestでのsetupとteardownの使い方

テスト全体の前後でsetupとteardown

setupteardownを使って、個々のテストの前後になにかの処理をさせることができました。

次は、テスト全体の前後になにかの処理をさせるコードを書いてみます。

import pytest

import calculation

class TestCal(object):

    @classmethod
    def setup_class(cls):
        print('Test start')
        cls.cal = calculation.Cal()

    @classmethod
    def teardown_class(cls):
        print('Test finish')
        del cls.cal

    def setup_method(self,method):
        print('method={}'.format(method.__name__))

    def teardown_method(self, method):
        print('method={}'.format(method.__name__))

    def test_add_and_double(self):
        assert self.cal.add_and_double(1, 3) == 8

    def test_add_and_double_raise(self):
        with pytest.raises(ValueError):
            self.cal.add_and_double('1', '3')

ハイライトしている7行目から15行目が付け加えたコードです。

classmethodのデコレーターを使ってsetup_class()を作り、わかりやすいようにTest startと出力しています。
このときに、10行目のcls.cal = calculation.Cal()でクラスオブジェクトを生成しているので、17行目18行目のsetup_methodでクラスオブジェクトを作る必要がなくなり、self.cal = calculation.Cal()を削除しています。

同様に、teardown_class内の15行目でdel cls.calとしてオブジェクトを削除しているので、21行目22行目でteardown_methodでオブジェクトを削除しなくても良くなり、del self.calは削除しています。

実行結果は次のとおり

Python pytestのclassmethodによるsetupとteardown

2つのテストを実行する前と後に、classmethodによるコメントが出力されているのがわかります。

継続は力なり

いつもいっていることですが、スキルアップのためには、継続が必要です。

いくら集中して学んだことも、次の日にはほぼ忘れてしまっています。

テスト勉強のときにやった一夜漬けの勉強は、その日限りで憶えたものなので、継続して学習しないと忘れてしまうわけです。

Python学習は、テスト勉強のためにやっているわけではなく、自分のスキルアップのために学習しているわけなので、しっかりと継続して、自分のものにできるようにしたいと思います。

継続は力なり

この言葉を忘れずに学習を継続しますよ〜!

それでは明日も、Good Python!