問題タブ [end-to-end]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database - データベース クエリのテストに使用するベスト プラクティスは何ですか?
私は現在、レイヤーの「全範囲」(UI、中間、遍在するデータベース) を持つソリューションをテストしている最中です。
私が現在のチームに到着する前に、さまざまな関連性ルール、並べ替えなどに基づいて、ストアド プロシージャが返す必要がある結果セットを理論的に返すクエリを手動で作成するテスターによって、クエリ テストが行われました。
これには、問題の実際のクエリに対してよりも、テスターのクエリに対してより頻繁にバグが報告されるという副作用がありました。
私は、既知の結果セットを実際に操作して、存在するデータを制御するため、それがどのように返されるかを推測できるようにすることを提案しました.
人々は、開発者が作成したものをテストするために独自のクエリを作成することにまだ固執していました。私は多くがまだそうであると思います。これはまったく理想的ではなく、テストのフットプリントを不必要に増やすだけだと思います。
ですから、このようなシナリオをテストするためにどのような方法を使用していますか?また、無秩序なデータを導入することなく、得られる最高のエンドツーエンドのカバレッジには何が理想的であると考えられますか?
私が抱えている問題は、どのテストを行うのに最適な場所かということです。サービスを直接突っ込んで、そのデータセットをストアド プロシージャから取得できるデータセットと比較するだけですか? 私は大まかなアイデアを持っており、これまでのところ十分に成功していますが、ここでまだ重要なものが欠けているように感じます.より良い。
python - 入力ファイルとその出力をテストするための Python テスト「フレームワーク」
Python で記述されたツールのエンド ツー エンド テストを作成しています。ツールはファイルを入力として読み取ります。その終了コードとその出力をテストしたいと思います。
これはかなり一般的なイディオムであり、いくつかの方法で行われているのを見てきました。PHP プロジェクトでは、各テストはファイルでありINPUT:
、EXPECTED:
、EXPECTED_REGEX:
、 などの行があります。私自身のphcプロジェクトでは、各ファイルは通常のソース ファイルですが、先頭にコメントが追加され、 などのキーワードが含まれていますEXPECTED
。私は、tcl で書かれたはるかに複雑なツールを使用するgccからコピーしたと思います。
Pythonでこれを行うフレームワーク、ライブラリなどはありますか? そうすべき:
- ソースファイルを読む
- 予想される出力、終了コード、検出されるまたは検出されないことが予想される単語/正規表現に対応する特別なキーワード (または類似の) を解析します。
- 出力が正しいことを確認します。
理論的には難しいようには見えませんが、以前にこれを実装したときに多くのエッジケース (特にエスケープを含む) を思い出すので、車輪を再発明したくありません。
google-app-engine - Google アプリ エンジンで XMPP を保護する
Googleトークのように、Googleアプリエンジンからのxmppメッセージをエンドツーエンドで暗号化できるかどうかは誰にもわかりませんか?
security - SSL を使用したエンド ツー エンド リクエストでの IP アドレスとホスト名の使用
したがって、これはブラウザとサーバーの通信に関するものではないことに注意してください。サーバー間通信では、ホスト名を使用するのではなく、他のサーバーの IP アドレスを使用して要求を行うと、MITM 攻撃の可能性が低くなりますか?
asp.net-mvc - BDD と ASP.NET MVC - ハイウェイを見つける
約半年前、単体テストを掘り下げ始めました。私はTDD(または私がそう思っていたもの)に進み、MVCアプリケーションの動作駆動型を開発したいと考えています。私の最後のプロジェクトは受け入れテスト可能な環境で実行されなかったので、受け入れテスト (実際のエンドツーエンド) の概念は私にとって新しいものです。
私はいくつかの良い記事、特にサンダーソンのhttp://blog.stevensanderson.com/2010/03/03/behavior-driven-development-bdd-with-specflow-and-aspnet-mvc/を読むことから始め、私のバックアップを取っています。そのトピックに関する彼の本を読んで、MVC スキルを習得します。
エンドツーエンドのテストには SpecFlow と SimpleBrowser を使用しています。ナビゲーション バーからナビゲーションを操作するのは簡単なことでしたが、今は行き詰っています。さらに記事を作成したりコメントしたりするためのユーザー アカウントを実装することを目指しています。登録プロセスを推進するのは頭痛の種でした。この機能ファイルの場合:
必要なテスト環境 (この例ではメール サーバー) を提供し、テストの脆弱性を軽減する方法がわかりません ([作成] ボタンのラベルを [送信] に変更することを考えてみてください)。キャプチャジェネレーターを織り込んで、後で自動ユーザー作成を防ぐことは言うまでもありません (皮肉なことです)。先のことを考えすぎているだけかもしれませんが、実際には TDD ではそうすべきではありませんが、画面を見つめて次のテストのことを考えていることがあります。
スー..そのテキストの壁の後に、実際の質問:この種の動作をどのように実装すればよいですか?
- UI レベルのテストに固執し、キャプチャ ロジックを実装するために必要に応じてリファクタリングする
- コントローラー レベルのテストにフォールバックする
- あなたが私を啓発する他の方法
unit-testing - エンドツーエンドのテストが多すぎますか?
私はこの状況全体に本当に不満を感じています。その理由は次のとおりです。
多くの異なるクライアントデータベースと1つのマスターデータベース(異なるスキーマを持つ)の同期を維持するために、完全にテストされていないレガシーシステムを継承しました。システムは私に渡されたときに部分的にしか完成しておらず、多くの欠陥があり、90%の確率で正しく機能していませんでした。
このシステムでは、6種類の同期が許可されており、データベースはかなり大きくなる可能性があるため、それぞれが異なる(場合によっては重複する)テーブルを同期します。クライアントは、状態に応じて最も重要なテーブルに優先順位を付けることができます。
いくつかのエンドツーエンドのテストから始め、特定のデータを使用してマスターデータベースといくつかのクライアントデータベースをローカルにセットアップし、さまざまな同期メソッドを呼び出して、適切なデータが適切な形式で適切なデータベースに表示されることを確認しました。
私は時間に追われていました。このシステムには、データベース間でデータを移動する方法が少なくとも100通りあり、コードは数千行しかないため、エンドツーエンドのテストをどんどん行っていきました。基本的に、プロジェクトを引き継いだときに存在した欠陥ごとに1〜2個。私は16の単体テスト(追加したコードからTDDを実行)と113のエンドツーエンドテストでシステムを完成させました。これらのテストの多くは、以前の欠陥に直接基づいていました。
私はシステムを完成させました、そしてそれは何事もなく数ヶ月間生産されました。
最近、クライアントデータベースを新しいデータベースに変換することを決定しました。新しいデータベースでテスト(この間ずっとCIサーバーで毎晩実行されていました)を実行すると、113のうち約100が失敗しました。(もちろん、ユニットテストはすべて合格です)。
私は失敗したエンドツーエンドのテストを修正してきましたが、率直に言って、ほとんどの場合、1つまたは2つの単純な理由で失敗しました(新しいデータベースの丸めの日付が異なるなど)が、テストが非常に脆弱であるという事実に不満を感じています。それらは正しく失敗しましたが、100ではなく1つか2つしか必要ありませんでした。問題は、ほとんどの場合、日付に基づいて1つのテーブルからデータを選択するだけなので、単体テストするコードがそれほど多くないことです。別のデータベースから同じデータを選択し、2つをマージしてから、適切に挿入/更新します。
これらのテストなしでこのシステムを完成させる方法はありませんが、それらを維持することの苦痛は基本的に私をこの質問に導くものです:私がどのように進めるべきか/または私がより良くできたかもしれない何か提案?これらのエンドツーエンドのテストを初めて作成するのに多くの時間を浪費しましたか?「レガシーコードを効果的に使用する」を読みましたが、「リファクタリングしてより多くの単体テストを作成する」以外は、私が感じていた種類の痛みについては、あまり良い答えがないように感じました。このシステムのユニークな性質に対して、コードが非常に少なく、データベースの変換が多いというオプションがあります。
tdd - システム全体をエンド ツー エンドでテストするためのベスト プラクティス
エンド ツー エンド テストとは、アプリケーションを外側の境界から実行して、その動作を検証することを意味します。これまでのところ、単一の実行可能なアーティファクトのテストを書いただけです。異なるホストにデプロイされた複数のアーティファクトで構成されるシステムをテストするにはどうすればよいですか?
2つの選択肢があります。
- テストはシステム全体をセットアップし、非常に外側から実行します。
- 各アーティファクトは個別にエンド ツー エンドでテストされ、テスト コンテンツに依存してそれらの間のプロトコルが適用されます。
これらの 1 つだけに固執する明確なケースはありますか、それともどちらかが優先されますか、それとも互換性がありますか? 互換性がある場合、それらの間の利点と欠点は何ですか?
c# - namespaceA.objectAをnamespaceA.objectAにキャストできません
私のアプリケーションのEndToEndテストには、releasedllを手動でロードすることが含まれます。
テスト中、私は常に次のものをロードします。-n個のデバッグアセンブリのNUnitシャドウコピー-n個のリリースアセンブリのPostbuildeventcopy
2つのコピーが同じビルド生成(バージョン)からのものであると確信している場合でも、リフレクションロードのキャストは失敗します。
ここで少しコンテキストを与えるために、いくつかの擬似コードがあります。
Loadfromを使用してアセンブリ内の静的を取得するヘルパークラスがあります。何かを呼び出す前に、モックを注入する必要があります。
このモックは、nunitが作成するため、デバッグバージョンのツールライブラリのシャドウコピーを使用して作成されます。
ロードされたライブラリはリリースバージョンです。これは、実際の環境にできるだけ近いテストを実行したいので、私にとって重要です。
リフレクションを使用して注入しようとするとFieldInfo SetValue(...)
、呼び出しを使用する必要があります。次のようになります。
Somethimes the Reflectionは機能し、私のタイプが互いにキャストできない場合があります。
エラーは、によって生成されたArgumentExceptionFieldInfo SetValue(...)
です。
field.FieldType != typeof(T)
例外を無視して、GetHashCode()呼び出しのみの違いを調べると、異なる値が得られます。
少しランダム性が関係していると思います。
タイプキャストを強制できますか?それも賢明ですか?
私が見逃しているプロジェクトを構築している間に私がしなければならないことがありますか?
c# - リフレクションを使用して、ビルド時に不明なインターフェイスのモックを作成する
テストを終了するには、テストアセンブリが依存アセンブリのシャドウコピーをプリロードしないことが重要です。
アセンブリ T は、アセンブリ A を読み込んでテストするテストフレームワークです。アセンブリ A は、B で定義されたインターフェイスに依存します。
テストの目的で、ビルド時に使用できるようにせずに、A のいくつかの静的メンバーを置き換える必要があります。
ここに私がいるジレンマを示すいくつかの疑似コードがあります:
- 経由でタイプにアクセスできますが、
semiknown.FieldType
それは何の役に立つのでしょうか? その情報を使用してモックを作成し、静的メンバーを置き換えることはできますか? - 型を取得し、静的メンバーを置き換えることができるとします-モックで期待値を構築するにはどうすればよいですか?