Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ Unittestにおけるモック技法:依存関係のシミュレーション | Unittestフレームワークの習得
Python構造化プログラミング
セクション 5.  4
single

single

bookUnittestにおけるモック技法:依存関係のシミュレーション

メニューを表示するにはスワイプしてください

外部サービス、設定、または副作用に依存するコードのテストは困難な場合があります。モックは、テスト内で複雑で予測不可能な現実世界の相互作用の動作を、その複雑さなしにシミュレートする強力な手法です。

例えば、送金サービスをテストする必要がある場合、自分の資金を使って取引をシミュレートし、結果を観察する方法も考えられます。しかし、この方法はリスクが高く、コストもかかります。より効率的でリスクのない代替手段として、モックを使用して送金プロセスを模倣する方法があります。

送金サービスのテスト

class MoneyTransferService:
    def transfer(self, source_account, destination_account, amount):
        if source_account.balance < amount:
            raise ValueError("Insufficient funds")
        source_account.balance -= amount
        destination_account.balance += amount
        return True

テスト手法:

  1. アカウント残高のモック: モックを利用して、残高不足や十分な残高など、さまざまなアカウント状態をシミュレートし、transferメソッドの応答をテスト;
  2. 取引の検証: 送金時に適切な金額が各アカウントから減算・加算されていることを確認;
  3. 例外処理: 送金が完了できない場合に、メソッドが正しく例外を処理することを確認。
import unittest
from unittest.mock import MagicMock

class TestMoneyTransferService(unittest.TestCase):
    def setUp(self):
        self.transfer_service = MoneyTransferService()
        self.source_account = MagicMock()
        self.destination_account = MagicMock()

    def test_successful_transfer(self):
        # Set up the account balances
        self.source_account.balance = 1000
        self.destination_account.balance = 500

        # Perform the transfer
        successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Check balances
        self.assertTrue(successful)
        self.assertEqual(self.source_account.balance, 800)
        self.assertEqual(self.destination_account.balance, 700)

    def test_failed_transfer_due_to_insufficient_funds(self):
        # Set up the account balances
        self.source_account.balance = 100
        self.destination_account.balance = 500

        # Attempt to transfer more than the source balance
        with self.assertRaises(ValueError):
            self.transfer_service.transfer(self.source_account, self.destination_account, 200)
        
        # Verify that balances remain unchanged
        self.assertEqual(self.source_account.balance, 100)
        self.assertEqual(self.destination_account.balance, 500)
タスク

スワイプしてコーディングを開始

unittestフレームワークとunittest.mockを使用して、MoneyTransferServiceクラスの単体テストを作成してください。要件は以下の通りです。

  • unittest.TestCaseを継承したテストクラスを作成すること;
  • アカウントオブジェクトのシミュレーションにはMagicMockを使用すること;
  • 以下の正確な名前で2つのテストメソッドを実装すること:
    • test_successful_transfer
    • test_failed_transfer_due_to_insufficient_funds
  • test_successful_transferでは、送金元に十分な残高がある場合の送金をテストし、戻り値と更新後の残高の両方を検証すること;
  • test_failed_transfer_due_to_insufficient_fundsでは、送金元に十分な残高がない場合の送金をテストし、ValueErrorが発生することと残高が変更されていないことを確認すること。

注意: テスト関数の名前は上記と完全に一致させてください。テストでは、値や例外処理を直接検証し、正規表現やパターンマッチングは使用しないでください。

解答

Switch to desktop実践的な練習のためにデスクトップに切り替える下記のオプションのいずれかを利用して、現在の場所から続行する
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 5.  4
single

single

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

some-alt