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
出力したメソッドの名前が表示されています。
テスト全体の前後でsetupとteardown
setup
とteardown
を使って、個々のテストの前後になにかの処理をさせることができました。
次は、テスト全体の前後になにかの処理をさせるコードを書いてみます。
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
は削除しています。
実行結果は次のとおり
2つのテストを実行する前と後に、classmethod
によるコメントが出力されているのがわかります。
継続は力なり
いつもいっていることですが、スキルアップのためには、継続が必要です。
いくら集中して学んだことも、次の日にはほぼ忘れてしまっています。
テスト勉強のときにやった一夜漬けの勉強は、その日限りで憶えたものなので、継続して学習しないと忘れてしまうわけです。
Python学習は、テスト勉強のためにやっているわけではなく、自分のスキルアップのために学習しているわけなので、しっかりと継続して、自分のものにできるようにしたいと思います。
継続は力なり
この言葉を忘れずに学習を継続しますよ〜!
それでは明日も、Good Python!