4

ちょうどset up a test framework for a new web applicationなので、大きな疑問のひとつ、「テストを互いに独立させるにはどうすればいいのですか?エンドツーエンドテストのためのテストフィクスチャの管理方法は?

年前私はすべてのデータベーステーブルを削除し、再度スキーマを作成し、テストデータを追加し、アプリケーションを起動し、1回のテストを実行してからアプリケーションを停止するという一連の複雑なAntスクリプトを設定しました。それは、フルスイートを実行するのにかかった時間のために、私たちを維持し、夜間テストに制限する苦痛でした。それでも価値があったが、もっと簡単な方法があるのだろうかと思う。

この方法の代替方法はありますか?主な基準は、失敗したかどうかにかかわらず、各テストがスイート内の他のテストの影響を受けてはならないことです。

答えて

0

確かに... CruiseControlを使用して継続的な統合テストを検討してください。 NAntやNUnitと一緒にテストを実行したり、環境を解体して設定したり、他の多くのものを使うことができます。これは、コードリポジトリにコードがチェックインされるたびに実行されます。コードを実行する唯一の方法です!

+0

私はすでにHudson、Maven、JWebUnitなどのツールを使用しています。エンドツーエンドのテストは、メインプロジェクトが成功するたびに実行されます。しかし、面白いのは、別のプロセスでテストを実行しているときに、実際にデータベースにホストされ、Webアプリケーションにキャッシュされている場合に、環境を設定して解除する方法です。 –

1

レコードの場合:私が今やっていることは、データベース全体をリセットする(すべてのコンテンツを削除し、デフォルトユーザーを追加する)アプリケーションに特別なリソースを設定することです。このリソースは、アプリケーションが「テストモード」で起動されている場合にのみURLにバインドされます。私たちのアプリケーションは(主に)RESTfulなので、外部から新しいオブジェクトを追加することができます。テストの基本クラスは、テストケースのセットアップ中にリソースを呼び出します。

テスト中のアプリケーションの変更を必要とし、潜在的なセキュリティリスクがあるため、私は実際にはソリューションが気に入らない。実際には、何かが削除される前に少なくとも3回はフラグをテストし、フラグがセットされていれば、最初のページに大きな赤色の点滅する見出しがあります(10年ぶりに点滅タグを使う良い言い訳です)。しかし、まだそれは少し怖いです。

0

テストのためにデータベースを調整すると、作業が速くなる可能性があります。 Ofc。これは使用しているDBのタイプに依存します... db統合テストでは、トランザクションを簡単にロールバックできます。他の統合テストでは、データアクセスレイヤを単純に模擬することができます。あなたは選択の余地を持っていませんが、実際のデータベースを使用してシステムをテストする機能テストでは

...

は、私は現在、備品を行うことで多くのことを助けることができるイベントソーシングを試しています。この手法の最短記述:DDDが必要(CQRSも推奨)、ドメインストレージをイベントストレージに保存した後、イベントストレージから関連イベントを取得して現在の状態を構築し、シーケンス。このイベントストレージの上には、サービスのコンポーネントの現在の状態のみを含むさまざまなキャッシュデータベースを構築することができます。これ以上のことは...同期プロセスは、投影と呼ばれるクラスによって行われ、自動的に同期または非同期イベントを保存してだから、治具を作るために、あなただけのドメインのイベントを格納する必要が...

たとえばあなたは非常に単純なREST APIによって、このような何かを書くことができます:

治具作り:

event.storage.clear(); 
every.cache.clear(); 

var credentials = { 
    name: "infje", 
    password: "oéö9péüöáé9oilusw" 
}; 
var resourceId = "swegretz34ze4wed"; 
var userDataSet = [ 
    { 
     id: 1, 
     type: "UserCreate", 
     resource: resourceId, 
     identificationFactors: credentials, 
     nick: "inf3rno", 
     birthDate: "1333.03.03.", 
     hobbies: ["wall climbing"] 
    }, 
    { 
     id: 2, 
     type: "UserUpdate", 
     resource: resourceId, 
     hobbies: ["base jumping", "knitting"] 
    } 
]; 

event.storage.persistAll(userDataSet); 
auth.cache.sync(event.storage); //a relational database with the user credentials 
users.cache.sync(event.storage); //a nosql document database with the user profile 

機能テスト:

var response = http.get("https://my.test.api/users", credentials); 
assert(response).toEqual({ 
    size: 1, 
    items: [ 
     { 
      id: resourceId, 
      nick: "inf3rno", 
      hobbies: ["base jumping", "knitting"], 
      birthDate: "1333.03.03." 
     } 
    ] 
}); 

注:これはコンセプトコードの単なる証拠なので、パスワードの暗号化、RESTのハイパーメディアの制約、電話交換などの詳細情報投影クラスのCコールなどは現在関連していません。

c。これは元のアプローチよりも遅いが、まだ遅いイベントですが、実際のデータベースをテストしたい場合はその部分を変更することはできません。イベントを使用してテストフィクスチャの作成、データのマイグレーション、キャッシュデータベースの構造の変更新しいリリースなど...それは間違いなく試してみる価値があります。

関連する問題