あなたの会社がカスタマイズ可能なテキストが付属するソフトウェアを販売していて、あなたのチームの仕事はそれをカスタマイズすることだとしましょう。クライアントエンゲージメントには、クライアントがすべてのテキストリソースを指定し、チームが完全なテストサイクルを保証する契約が含まれます。
コードのどこかに、次のようなロジックがあります。
var response = proxy.Foo(request);
if (!response.IsOK)
{
switch (response.ErrorCode)
{
case Constants.BadProfile:
DisplayError(Resources.BadProfile);
break;
case Constants.BadRequest:
DisplayError(Resources.BadRequest);
break;
default:
DisplayError(Resources.GeneralError); //Should never happen
break;
}
}
コードの記述方法に基づいて、3番目のエラーを引き起こすデータ条件を生成することは文字通り不可能です。しかし、エンジニアリングチームは、将来のコードの欠陥が発生した場合に備えて、またはクライアントが古く、プロキシが新しく見慣れないエラーをスローする状況を防ぐために、そこに配置しました。
つまり、クライアントは3つすべてのエラーメッセージリソースをカスタマイズしており、QAはそれら3つすべてをテストしたいと考えています。
一般的なエラーリソースが正しいことを確認するために、QAがテストを要求するのは妥当でしょうか。彼らはどのようにしてそのエラーを引き起こす可能性がありますか?
または、定義可能な許容基準のない機能を指定しているため、エラーメッセージを含めることは要件の誤りですか?
注:この例のproxy
はサードパーティのサービスであるため、予期しないエラーをスローするようにリグすることはできません。もちろん、クライアントコードを変更してエラーを強制することもできますが、最終的には本番環境で実行されるコードベースをテストしません。
編集:
この場合の「プロキシ」は、WCFまたはRESTクライアントではありません。ブラックボックスバイナリDLLです。懸念事項の分離、依存関係の注入、および傍受するための便利なトランスポートはありません。努力なしに結果をシムする場所はどこにもないので、英雄的であるので、テストの信頼性とそのようなEdgeケースの努力の支出を損ないます。
一方、QA 100%の統計を達成するためだけにバックストップを完全に削除することは、少し常識に反する、少しディストピア的であるように見えます。
機能を「非表示」にして顧客に知らせることはできませんが、テキストには各顧客に固有の貴重なサポート情報が含まれています。
真剣に、そのプロキシを模倣します。これは、テストするシステムの境界です。
次のいずれかを作成します。
これが自分でできない場合は、エンジニアリングチームにプッシュしてください。彼らはcanテスト範囲を与える境界を書きます。さらに、単体テストを介したテストが容易になります。
そのプロキシが明確に定義されたプロセス間通信プロトコルの表現である場合、既製のスパイ/スタブが多数あるため、幸運です。
サードパーティのライブラリ/非標準プロトコルによって提供される場合、開発者は言語抽象化メカニズムを使用して、ファサード/アダプターを提供し、サードパーティの代わりにスタブ/スパイバージョンを使用する方法を提供する必要があります。パーティーライブラリーオプション。
これらすべてのエラーメッセージが正しくカスタマイズされているかどうかをテストすることだけが必要な場合は、数か月の作業を費やしてすべてのエラー状況のテストシナリオを作成し、アプリケーションを表示するよりも効率的な解決策があります。 「実際の」エラーによるカスタマイズされたテキスト。代わりに、
これにより、質問のスニペットなどのコードを変更する必要がなくなり、プロキシをモックアウトする必要がなくなり、すべて(QAと同様に)簡単にすべてをテストできるようになります。カスタマイズ。そしておまけとして、そうでなければ(ほとんど)到達できないコードでのみ表示されるエラーテキストのカスタマイズをテストすることは簡単になります。
スイッチケースをテストする方法は?ディスパッチはオブジェクトによって実行できます。
switch (response.ErrorCode)
{
case Constants.BadProfile:
DisplayError(Resources.BadProfile);
break;
case Constants.BadRequest:
DisplayError(Resources.BadRequest);
break;
default:
DisplayError(Resources.GeneralError); //Should never happen
break;
}
ケースをディクショナリ/マッピングに切り替え、エラーコードを変更します
DisplayError(errorCodeToMessage.getDefault(response.ErrorCode, Resources.GeneralError))
オブジェクトを要求するために、等価性のマッピングをリファクタリングします。次に、その前にエラーコードを設定できます。
response.getErrorResourceId()
考えて、私の完璧なコードは次のようになります:
var response = proxy.Foo(request);
if (response.isOK()) {
...
} else {
displayResponseError(response)
}
void displayResponseError() {
errorCode = response.errorCode
message = getMessageForResponseErrorCode(errorCode)
displayErrorMessage(mesage)
}
getMessageForResponseErrorCode(errorCode) {
return getMappingFromErrorCodeToMessage().get(errorCode, getDefaultErrorMessage())
}
このコードには、テストする4つのメソッドがあります。可能であれば、それらすべてを応答に含めることができます。