電子メールクライアントをユニットテストする方法
-
20-09-2019 - |
質問
私は今、デスクトップメールクライアントに取り組んでいます。バックエンドをユニットテストしたいと思います。しかし、私はその仕事をする方法を見ることができません。私のコードが機能するためには、ワーキングメールサーバーに接続する必要があります。ユニットテストを電子メールアカウントに結び付け、アカウントが私のテストが期待する状態と一致していることを確認しない限り、これをどのように管理できるかわかりません。
この種のアプリケーションをテストする方法に関するアイデアはありますか?
編集:
詳細を追加するには、C ++高レベルのメールクライアントライブラリに取り組んでいます。これは、CライブラリであるLibetpanを使用して、メールサーバーに接続して対話する詳細を実際に処理します。
解決
私はするつもりだ 推定 バックエンドをテストすることにより、実際に電子メールサーバーに通信し、残りのソフトウェアをテストするコードのビットを参照しています。 ock笑 このレイヤー。
現在、これは定義ユニットに応じて統合テストである場合とそうでない場合があります。率直に言って、私はあなたがそれを呼び出すことにしたことを気にしませんが、あなたが迅速に実行され、頻繁に実行されるいくつかの自動テストを書くならば、彼らはあなたのユニットテストと同じプラットフォームを使用するかもしれません。
次の2つの方法で機能しないようにこれを書こうとします。1つ目は、必要に応じて設定および構成できるプロセスローカルメールサーバーに接続することです。 Javaで使用します ごみ箱 しかし、C ++にはAlikesが存在すると確信しています。 2つ目は、スクリプトできる少なくとも1つのローカルメールサーバーに接続することです。あなたが好きなだけ飛び散ることができるもの(したがって、開発者間で現実的ではない、または共有されていない¹)が、それに対して同じテストセットを実行することができます。その理由は、SMTPサーバーの開発者がすべての人を嫌い、あなたのスタブが本物と同じように機能することを確認することをお勧めします。これは私が同等のものと見なしています 開発者ごとに1つのデータベース.
今、あなたがあなた自身のSMTPクライアントを書いていないなら、ただ持っているなら ファサード 既存のサードパーティAPIの周りでは、サードパーティのAPIがバグがすでに脱落しているほど十分に虐待されているという仮定で、これを「統合テスト」する可能性が低くなります。サードパーティのAPIをock笑し、ファサードが期待どおりに機能することを検証することを検討します。
1)CIサイクル中にこれを行うことができるかもしれません。そのため、すべての開発者とローカルラン間で1セットの電子メールサーバーを共有すると、C ++ダンプスターを使用するだけです。
他のヒント
完全にあなたの制御下にある本物をスタブに置き換える方法を見つける必要があります。通常、これはようなモッキングフレームワークで行われます Rhino.Mocks.
ところで、「実際の」メールアカウントを使用する場合、それはもうユニットテストではなく、統合テストです...
ソケットの使用をテストしたくない可能性が高いため、TCP通信が含まれないダミーサーバーの実装にコードを置き換えることを考えるかもしれません。クライアントからの予想リクエストをハードコードし、ダミーサーバーを適切に応答させます。
Andrewは、Mail APIをock笑することについて正しいです。これがCにあることの問題は、2つの方法のいずれかで対処できます。
- ock笑できるシンプルなC ++ラッパーを提供します。
- リンカーを使用して、C APIのテスト/モックバージョンを提供すると、ライブラリと同じヘッダーファイルを使用する必要がありますが、ユニットテストはライブラリの代わりに模擬C機能をリンクします。
困難な状況でユニットテストを行う方法を扱う素晴らしい本があります。「レガシーコードで効果的に作業する」、この本を十分にお勧めすることはできません。タイトルに延期されないでください。この本は、レガシーコードをユニットテストなしのコードと見なしています。