pytestの使い方【fixture, 実行方法など】

pytestの使い方【fixture, 実行方法など】Python
ゆうすけ
ゆうすけ

pytestってよく耳にするけど、いまいち分かりません。

資格マフィア
資格マフィア

簡単に言えば、テスト用のPythonライブラリだ。
基本的な使い方も合わせて解説しよう。

 

✔️ 本記事のテーマ

pytestの使い方解説

 

✔️ 読者さんへの前置きメッセージ

本記事は「pytetの使い方」について書いています。

 

この記事を読むことで
「pytestがどのようなライブラリか や pyetstの基本的な使い方」
を理解できます。

 

pytestは主にユニットテストを書く際に便利なPythonライブラリです。

 

pyetstを使うことでPythonプログラムのテストコードを効率的に書くことができます。

 

また、作成したテストコードを実行するときも、
複数のテストケースを一括実行することができるので非常に便利です。

 

それでは、pytestライブラリやその基本的な使い方について詳しく解説していきましょう。

 

pyetstとは?

pyetstとは?

pytestはテスト用のPythonライブラリです。

 

通常、コードを書くときはそのコードのテストをする必要があります。

 

個人で趣味としてコーディングする際は、もしかすると必要性を感じないかもしれませんが、チームで大規模なプログラムを開発する際や、職業プログラミングを行うときはテストコードの作成は必須となるでしょう。

 

pytrestではそのようなプログラムのテストを効率的に行うためのライブラリです。

 

pytestを使うことで短いコードで、より多くのテストケースを作成することができるでしょう。

 

また、pytestは使い方もシンプルなので、学習コストが低いのも魅力の一つです。

 

この記事ではpytestを基本的な使い方から解説していきます。

 

pytestを使うためには(準備)

pytestを使うためには(準備)

pytestはPythonのサードパーティライブラリです。

そのため、まず開発環境にインストールする必要があります。

Pythonライブラリはpipを使うことで簡単にインストールすることできます。

 

pip install pytest

 

このコマンドを実行することで、インストールできます。

また、コードの中でpytestを使うときは、プログラム上文でインポートして使いましょう。

 

import pytest

 

インポートすることで、プログラム中でpytestを使うことができます。

 

pytestの使い方(テストケースの作成)

pytestの使い方(テストケースの作成)

それでは実際にテストケースを作成していきましょう。

pytestを使うと、以下のようなコードになります。

 

import pytest


def sum_2_value(a, b):
    return a + b


def test_plus():
    ret = sum_2_value(1, 2)
    assert ret == 3

 

順番に解説していきましょう。

 

テスト関数の定義

pytestでテストケースを作成する際、テスト関数はtest_XXXという名前にしましょう。

 

この命名規則に従うことで、pytestにテスト関数として認識されます。

 

テスト実行のコマンドを叩くと、このテスト関数が自動で実行されます。

assert文

基本的には、pytestを使ったテストは通常のテストと同じように、
処理の結果をassert文で想定結果が返ってくることを検証します。

 

サンプルコードの例では、1+2の結果が3であることをassert文を使って検証しています。

 

pytestの使い方(テストの実行)

pytestの使い方(テストの実行)

Pytestでのテスト実行には2通りの方法があります。

  • 全てのテストを実行する方法
  • テストモジュールを指定して実行する方法

順番に解説していましょう。

全てのテストを実行する方法

pytestでテストを実行する方法は簡単です。

 

以下のコマンドを叩いてやることで、pytestで作られた全てのテストケースを実行します。

 

pytest

 

なお、このとき実行対象となるのは、test_XXXで始まる関数だけなので、pytestでテストケースを作る際は接頭句としてtest_を必ずつけるようにしましょう。

 

テストを実行して、テストが通ればテストケースの数だけ ~ paased と表示されます。

テストが通らなかった(返ってきた値が想定と異なっていた)場合は、failedという表示とともに、テストが通らなかった箇所と実際に返ってきた値が表示されます。

 

この表示により、テストが通らなかったときに修正するべき箇所の特定が効率的に行えます。

 

これもpytestを使うことによる恩恵だと言えるでしょう。

 

このように、

テストを実行する → 不備を発見する → 原因箇所を特定して修正する → テストを実行する → …

を繰り返すことでプログラムの品質を向上させていくのが、
システム開発の一般的な流れになります。

テストモジュールを指定して実行する方法

pytestはテストモジュールを指定して実行することも可能です。

 

以下のようにコマンド引数として、テストモジュールのパスを指定することで、対象のテストだけを実行することができます。

 

pytest /tmp/hoge.py

 

このようにテストケースを限定して実行することもできるので、
検証箇所を絞りながらテストもできます。

 

【応用編】pytestの使い方(fixture)

【応用編】pytestの使い方(fixture)

ここまででpytestの基本的な使い方は説明しました。

 

ここからは応用編として、pytestのfixtureの使い方を解説します。

 

fixtureとはテストのモック作成用の機能です。

 

fixtureを使うことで、テストケースの前処理を切り出すことができます。

 

例えば、テストケースを作る際に、DBや変数など検証したい処理に必要な値をテストケースの中で用意する場合もあるでしょう。

 

そのようなときに、その部分だけを fixtureで切り出すことができます。

 

文字だけの説明では少し分かりにくいので、コードとともに解説していきましょう。

 

import pytest


@pytest.fixture(scope='module')
def number():
    a = 1
    b = 2
        yield {'anb': [a, b]}


def test_sum(number):
    a, b = number['anb']
    c = sum_2_value(a, b)

    assert c == 3

 

fixtureでテストに使う値を用意して、
テスト関数からfixtureの値
を読み込んで使います。

 

細かい部分を順番に解説していきましょう。

 

pytest.fixture

fixtureの定義は関数に@pytest.fixtureのデコレータをつけることで定義します。

pytest.fixture(scope=’module’)

デコレータの引数scopeによって、fixtureのスコープを指定できます。

 

引数に使える値と、それによるスコープは以下の通りです。

 

順番に上がスコープは小さく、下になるほどスコープは大きくなります。

  • function:デフォルトのスコープ。一つのテストの実行中のみfixture値が保持されます。
  • class:クラスに含まれる全てのテスト実行中のみfixture値が保持されます。
  • module:モジュールに含まれる全てのテスト実行中のみfixture値が保持されます。
  • package:パッケージ内に含まれる全てのテスト実行中のみfixture値が保持されます。
  • session:テストセッションの間、fixture値は保持されます。

このスコープを変えることで、
複数のテストケースを通じてfixture値を操作することができます。

fixtureから値を渡すには

fixtureから値を渡すには、yield を使います。

 

`yield {‘anb’: [a, b]}`というように辞書のキーと値を定義します。

 

このようにすることで、テスト関数からkeyを指定することで値を使用することができます

 

なお、1つのfixtureでキーと値を複数定義することもできます。

fixtureから値を受け取るには

この部分はpytest独自の部分です。

 

fixtureから渡される値をテスト関数の中で使用するには、
引数でfixture関数を指定する必要があります。

 

サンプルコードのdef test_sum(number):の部分ですね。

 

さらにテスト関数の中でnumber['anb']というように、
fixture名[‘キー’]と書くことで値を受け取ることができます。

 

通常の辞書型の値を取り出す時と同じ書き方をすればOKです。

 

このようにして、fixtureでテストで使う値を作成して、
テスト関数の中でその値を取り出して使うことができます。

 

fixtureを使うメリット

fixtureを使うメリット

ここまででfixtureの使い方を説明しましたが、
fixtureを使うことでどのようなメリットがあるのでしょうか?

 

fixtureを使うメリットとしては、以下の2つです。

  • 前処理を切り出すことで保守性、可読性が向上する
  • 切り出した前処理を複数のテストケースで使い回すことができる

順番に解説していきましょう。

前処理を切り出すことで保守性、可読性が向上する

テスト関数から前処理だけを切り出してfixtureとして定義することで、
テストコードの保守性や可読性が向上します。

 

もしプログラムに変更が入って、テストコードにも変更を加える必要が出てきた時、前処理を切り出しておけば、その部分だけ修正すれば良いです。

 

また、初めてそのテストコードを読む人でも前処理とテストケース自体が分離されているので、どこまでがテストのための前処理で、どこからテスト本体かを一目で判別することができます。

 

このように、pytest.fixtureを使うことで、
テストコードを修正する or 理解するときに、効率的に作業を進めることができます。

切り出した前処理を複数のテストケースで使い回すことができる

fixtureとして前処理を切り出しておくことで、その前処理を使い回すことができます。

 

例えば、テストケースA、テストケースB、テストケースCと3つのテストケースを作るときに、それぞれのテスト関数の中で同じ値を生成するのは非効率的です。

 

そのようなときに、テストケースに必要な値を生成するfixtureを1つを用意しておいて、テストケースA、B、Cで使い回すことで効率的なテストを行うことができます。

 

pytestやPythonについてもっとスキルをつけるなら

pytestやPythonについてもっとスキルをつけるなら

テスト用のPythonライブラリ、pytestの使い方について解説しました。

 

pytestを使うことで効率的なテストを行うことができます。

 

pytestについてより詳しく理解するなら以下の書籍がオススメです。

 

この記事で解説した内容もこの書籍に含まれています。また、pytestだけではなく、テスト駆動開発の基本的な考え方についても習得することができます。

エンジニアとしての自身の価値をチェックする(完全無料)

エンジニアとして、

自分の価値がどれくらいのものかご存知でしょうか?

 

エンジニアとしてIT業界に身を置いていると

今の会社でずっと働くのか、フリーランスとして独立するのか …

と様々な選択肢があります。

 

どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも

自身の価値を知っておくことはとても重要です。

 

TechClips ME では、

職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。

▼▼▼▼▼

▲▲▲▲▲

しかもTechClips MEでは想定年収を企業から提示してくれるので、

自身の価値を数字で分かりやすくたしかめることができます。

 

登録はもちろん完全無料なので、一度登録してみると良いかもしれません。

 

コメント

タイトルとURLをコピーしました