Pythonでpytestを実行する

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

雨がふらなくて憂鬱な気分にはならないのですが、真夏日のような暑さに体力が奪われてしまいます。

20年前に比べると、日中平均の気温は変化がないようですが、最高気温は3℃以上も高くなっているようです。

この記事は、2018年の結果ですが、2020年でもそんなに大差はないかと思います。

お家の中で冷房を入れるのを我慢して熱中症になってしまう方もいるので、冷房は体によくないと我慢するのも考えものですね。

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

昨日の復習

昨日は、サードパーティーのテストパッケージであるpytestの基本を学習しました。

unittestの場合は、クラスを使ってテストしましたが、pytestは関数のみでもテスト可能でした。

もちろんクラスの中で関数を定義してテストをすることもでき、unittestで書いたコードもそのままテストすることができましたね。

pytestの基本については、昨日の記事をごらんください。

今日は、pytestの例外処理を学習します。

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

このコードのテストを実行します。

関数のみで例外テスト

昨日試したように、関数のみの実行でも、クラスオブジェクトを生成してからの実行でもどちらでもテストができるので、まずは関数のみでテストを実行してみます

import pytest

import calculation

def test_add_and_double_raise(): 
    with pytest.raises(ValueError):
        cal = calculation.Cal()
        cal.add_and_double('1', '1')

今回は、最初にpytestをインポートします。

6行目で、pytest.raises()ValueErrorを指定して、calculation.pyの関数add_and_doubleの変数xyに文字列の1を代入しています。

calculation.pyでは、3行目、4行目で引数が整数以外だった場合にValueErrorを定義しているので、文字列を代入するとValueErrorが起こります。

テストの実行結果は、ValueErrorが起こって正常にテストをクリアして終了します。

Python pytestで例外処理テスト

クラスオブジェクトで例外テスト

次にクラスを使った例外テストも試してみます。

import pytest

import calculation

class TestCal(object):
    def test_add_and_double_raise(self):
        with pytest.raises(ValueError):
            cal = calculation.Cal()
            cal.add_and_double('1', '1')

5行目を追加して、6行目の引数にselfを入れるだけです。

実行結果は関数のとき同様に、ValueErrorが返されるので、テストは異常なしで終了します。

Python pytestで例外処理テスト

例外は注意が必要

例外テストは、例外が起こっているのに正常終了するので、ちょっと注意が必要です。

例外が起こるということが想定のテストなので、例外が起こって当たり前なのですが、気をつけないとどっちがどっちやらわからなくなってしまいます。

たまに別のことを考えながらPythonのコードを書いてると、わけがわからないコードになってしまったり、手が止まったりしてしまいますので、しっかりと注意力を落とさないように集中して学習しないといけません。

誘惑のない環境を整えておくことも重要ですね。

それでは、明日もGood Python!