「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Pytest Monkeypatchのマスター:テストを簡素化します

Pytest Monkeypatchのマスター:テストを簡素化します

2025-02-09に投稿
ブラウズ:908

Mastering Pytest Monkeypatch: Simplify Your Testing

Pythonでのテストに関しては、信頼できる孤立したテストが重要であることを確認します。一般的な課題の1つは、テスト中にオブジェクトと関数の動作をock笑または変更する方法です。これは、Pytest Monkeypatch Fixtureが輝く場所です。テスト中にコードの部分を動的に交換する柔軟な方法を提供します。

このブログでは、Monkeypatchの力、それが役立つ理由、そしてそれを使用してきれいで効果的なテストを書く方法を調べます。


Monkeypatchとは何ですか?

PytestのMonkeypatchフィクスチャを使用すると、次のことを変更または交換できます。

    関数または方法
  • オブジェクトの属性
  • 環境変数
この動的な変更は一時的なものであり、テストの範囲にのみ適用され、テストが終了すると元の動作が復元されるようにします。これにより、Monkeypatchは、永続的な変更を加えることなく、特定の条件下でコードをock笑、依存関係、またはテストするのに特に役立ちます。


なぜmonkeypatchを使用するのですか?

Monkeypatchがテストを簡素化できる重要なシナリオを次に示します。

    mocking依存関係
  1. :外部依存関係をmockオブジェクトまたは関数に置き換えて、分離ユニットをテストします。
  2. エッジケースのテスト
  3. :例外や特定の返品値などのエッジケースの動作をシミュレートします。
  4. 一時的な環境の変更
  5. :構成固有のロジックをテストするための環境変数を変更します。
  6. メソッドの置換
  7. :クラスまたはモジュールのメソッドを一時的にオーバーライドします。
Monkeypatchの使用例

1。関数をock笑します

外部APIに依存する関数があるとします:


#my_app.py def fetch_data(): #API呼び出しをシミュレートします 「実際のAPI応答」を返す

# my_app.py
def fetch_data():
    # Simulate an API call
    return "Real API Response"
を模倣できます


#test_my_app.py my_appインポートFETCH_DATAから def test_fetch_data(monkeypatch): def mock_fetch_data(): 「mocked応答」を返す monkeypatch.setattr( "my_app.fetch_data"、mock_fetch_data) assert fetch_data()== "mocked応答"

# test_my_app.py
from my_app import fetch_data

def test_fetch_data(monkeypatch):
    def mock_fetch_data():
        return "Mocked Response"

    monkeypatch.setattr("my_app.fetch_data", mock_fetch_data)

    assert fetch_data() == "Mocked Response"

環境変数に依存する関数をテストしていると想像してください:


#config.py OSをインポートします def get_database_url(): return os.getenv( "database_url"、 "default_url")

# config.py
import os

def get_database_url():
    return os.getenv("DATABASE_URL", "default_url")


#test_config.py config Import get_database_urlから def test_get_database_url(monkeypatch): monkeypatch.setenv( "database_url"、 "mocked_url") assert get_database_url()== "mocked_url"

# test_config.py
from config import get_database_url

def test_get_database_url(monkeypatch):
    monkeypatch.setenv("DATABASE_URL", "mocked_url")

    assert get_database_url() == "mocked_url"

クラス内のメソッドを一時的に置き換える必要がある場合:


#my_class.py クラス計算機: def add(self、a、b): bを返します

# my_class.py
class Calculator:
    def add(self, a, b):
        return a   b


#test_my_class.py my_classインポート計算機から def test_calculator_add(monkeypatch): def mock_add(self、a、b): 返品42 monkeypatch.setattr(calculator、 "add"、mock_add) calculturation() Assert Calc.Add(1、2)== 42

# test_my_class.py
from my_class import Calculator

def test_calculator_add(monkeypatch):
    def mock_add(self, a, b):
        return 42

    monkeypatch.setattr(Calculator, "add", mock_add)

    calc = Calculator()
    assert calc.add(1, 2) == 42

特定のシナリオの組み込み関数を模倣することもできます:


#my_module.py def is_file_openable(filename): 試す: open(filename、 "r"): trueを返します ioerrorを除く: falseを返します

# my_module.py
def is_file_openable(filename):
    try:
        with open(filename, "r"):
            return True
    except IOError:
        return False


#test_my_module.py my_moduleからIS_FILE_OPENABLEからインポート def test_is_file_openable(monkeypatch): def mock_open(filename、mode): ioerrorを育てる(「mocked ioerror」) monkeypatch.setattr( "Builtins.open"、mock_open) assert not is_file_openable( "test.txt")

# test_my_module.py
from my_module import is_file_openable

def test_is_file_openable(monkeypatch):
    def mock_open(filename, mode):
        raise IOError("Mocked IOError")

    monkeypatch.setattr("builtins.open", mock_open)

    assert not is_file_openable("test.txt")
Monkeypatchでのベストプラクティス

    scope
  1. :副作用を避けるために、テストの範囲内でのみMonkeypatchを使用します。
  2. 避けている
  3. :依存関係の注入またはその他の設計パターンが実行不可能なシナリオのためにサルパッチを予約します。
  4. explicit Paths
  5. :属性を設定する場合、偶発的な変更を防ぐために明示的なモジュールとオブジェクトパスを提供します。
  6. デフォルトの復元
  7. :Monkeypatchは元の状態を自動的に復元しますが、テストを簡単に保つためにチェーンまたはネストを避けます。
結論

PytestのMonkeypatchは、孤立した、信頼性の高い、クリーンなテストを書くための強力なツールです。機能をock笑したり、環境変数をオーバーライドしたり、エッジケースをテストしたりする場合でも、Monkeypatchはテストワークフローを大幅に簡素化できます。

ここに概説されている例とベストプラクティスを組み込むことにより、テストスイートを堅牢で保守可能にすることができます。公式のPytestドキュメントを調べて、詳細を学び、pytestの可能性を最大限に発揮してください!

ハッピーテスト!

リリースステートメント この記事は、https://dev.to/mohamedab​​delwahab/mostering-pytest-monkeypatch-simplify-your-testing-jj8?1で再現されています。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3