この投稿で受け入れられた回答と同じくらい単純な電子メールの実装を想定すると、実装の単体テストを作成するための最良の方法は何でしょうか?(実装のテストの一環として、有効な受信者にメールを送信したくありません)
2 に答える
まず、プラガブルの送受信を担当するパーツを作成します。サーバーとの間でメッセージの接続/送信/受信を担当するクラス/関数/オブジェクトを切り替えることができることを確認してください。
次に、この部分を実物として機能させます。このクラス/関数/オブジェクトが元のクラス/関数/オブジェクトの動作を可能な限り偽造することを確認してください(同じパラメーターを取り、同じエラーをスローします)。
第三に、テスト中にこの部分のさまざまな動作を偽造します。さまざまなテストでのこのクラスのさまざまな動作には、次のものが含まれる場合があります。
- 正しい送信、
- 送信の遅延、
- 接続がタイムアウトしました、
- 正常に受信し、
また、モジュールが実際に何をするか(および、モジュールが他の誰かによってコーディングに使用できるかどうかなど)に応じて、次の動作を含めることもできます。
- 誤ったパラメータが渡されたときのエラー、
- ここにある他のさまざまな例外:http://docs.python.org/library/smtplib.html
それは本当にあなたのモジュールが何をするかに大きく依存します。これらのことを適切に行うかどうかをテストする必要があります。smtplib
モジュールはすでにテストでカバーされているため、テストしないでください。モジュールに関係のないことをテストしないでください-それが行うことだけです。モジュールの一部がテスト不能である可能性があります。その場合、2つのオプションがあります。テスト可能に変更するか、そのままにします(さまざまな理由で最も妥当なオプションである場合があります)。
まず第一に、あなたは大まかにあなたが説明したものをユニットテストと呼ぶことができます。単体テストとは、通常、(ネットワークアクティビティやI / Oサポートなしで)可能な限り小さなコードをテストすることを指します。
したがって、ネットワークを介して実際にメッセージを送信することなく、モックとスタブを使用してメッセージ送信ユニットをテストする単体テストを作成できます。モックを使用して、メッセージ送信結果のさまざまな方法をエミュレートします。
- 正しく送信されたメッセージ
- メッセージ送信時に受信したタイムアウト
- 遅れて送信されたメッセージ
あなたが話しているケースは、通常、統合テストと呼ばれ、アプリケーションのさまざまな部分、この場合はメールサーバーとメッセージ送信者の間の相互作用をテストします。
したがって、次のことができることをテストするには、次のようにします。
poplibがどのように機能するかの例を次に示します。
import getpass, poplib
M = poplib.POP3('localhost')
M.user(getpass.getuser()) # Assuming that mailbox has your OS user/pass
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
for j in M.retr(i+1)[1]:
print j
これは、poplib(poplibの公式ドキュメントから恥知らずに引用)を使用してメッセージを取得する方法の例です。同様に、imaplibを使用できます。メールサーバーがサポートしているテクノロジーによって異なります。
ノート!テストの作成は必ずしもそれほど単純ではないことを覚えておく必要があります。コードを単体テストに適合させる必要があります。たとえば、メール送信をテストする場合、送信者関数/クラスは、テスト中にエミュレート(モックオブジェクトに置き換える)できるメッセージ送信オブジェクト(この場合はSMTP)で呼び出される/初期化される必要があります。