セクション 5. 章 4
single
Unittestにおけるモック技法:依存関係のシミュレーション
メニューを表示するにはスワイプしてください
外部サービス、設定、または副作用に依存するコードのテストは困難な場合があります。モックは、テスト内で複雑で予測不可能な現実世界の相互作用の動作を、その複雑さなしにシミュレートする強力な手法です。
例えば、送金サービスをテストする必要がある場合、自分の資金を使って取引をシミュレートし、結果を観察する方法も考えられます。しかし、この方法はリスクが高く、コストもかかります。より効率的でリスクのない代替手段として、モックを使用して送金プロセスを模倣する方法があります。
送金サービスのテスト
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
テスト手法:
- アカウント残高のモック: モックを利用して、残高不足や十分な残高など、さまざまなアカウント状態をシミュレートし、transferメソッドの応答をテスト;
- 取引の検証: 送金時に適切な金額が各アカウントから減算・加算されていることを確認;
- 例外処理: 送金が完了できない場合に、メソッドが正しく例外を処理することを確認。
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が発生することと残高が変更されていないことを確認すること。
注意: テスト関数の名前は上記と完全に一致させてください。テストでは、値や例外処理を直接検証し、正規表現やパターンマッチングは使用しないでください。
解答
すべて明確でしたか?
フィードバックありがとうございます!
セクション 5. 章 4
single
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください