5

パフォーマンス上の理由から、第2レベルのデータキャッシュが有効になっているJPA / Hibernate / Spring /TomcatWebアプリケーションがあります。そして、キャッシュは非常にうまく機能します!

また、いくつかのテストデータをアプリケーションのデータベースに直接追加してから、いくつかのSeleniumステップを実行するCucumberテストスイートもあります。もちろん、第2レベルのキャッシュが原因でアプリケーションが更新を認識しないため、失敗します。

キャッシュを無効にして(Mavenフィルタリングなどのブールプロパティを渡すことで)テスト用に特別なビルドを作成できることはわかっていますが、@ Cacheの注釈付きエンティティが多数あるため、キャッシュを無効にすると、「第2レベルのキャッシュは有効」。

別のアプローチは、ehcacheリモーティングを使用してキャッシュをクリアするか、オブジェクトの有効期間がゼロなどでキャッシュを構成することです。

アプリケーションUIのみを使用してテストデータを作成することもできますが、これによりテストケースが不必要に複雑になるため、テストを実行する前にDBに書き込むことをお勧めします。

第2レベルのデータキャッシュを有効にした統合テストアプリケーションへのアプローチを誰かが共有できますか?

4

4 に答える 4

1

ユニットテストで第2レベルのキャッシュをテストする必要がある場合は、daoメソッドを呼び出すたびに、必ずセッションを閉じて開く必要があります。それ以外の場合は、1つ/現在の休止状態セッションのスコープにのみ存在する第1レベルのキャッシュを使用します。

于 2012-06-25T15:28:57.577 に答える
0

受け入れテストをDBに依存しないようにすることをお勧めしますが、書き直しが多すぎるため、現在、org.hibernate.cache.Cacheおよびorg.hibernate.cache.CacheProviderインターフェイスの非常に単純な実装を作成することにしました。空のキャッシュ。

テストビルドは、実際のキャッシュをこの新しいキャッシュに置き換え、休止状態のアノテーションとBDDステップの両方を満足させます。

于 2012-04-28T03:29:14.603 に答える
0

国、地域などのいくつかのBeanに読み取り専用キャッシュを実装する必要がありました。

それらが実際にキャッシュされているかどうかを確認するために、Springを使用した統合テストを作成しました。テストはそれほど適切ではありません、それは私が得たかったものの単なる検証です。これをヒントとして使用し、独自に実装できます。

スプリングを使用した統合テストの記述方法に関する記事については、こちらをお読みください。

@Configurable(autowire = Autowire.BY_NAME)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class HibernateCachingTestIntg {

    @Autowired
    private ConfigurationDAO configurationDAO;

    @Autowired
    private CountryDAO countryDAO;

    @Test
    public void testGetCountries() {
        for (int i = 0; i < 5; i++) {
            StopWatch sw = new StopWatch("C");
            sw.start();
            countryDAO.listCountries();
            sw.stop();
            System.out.println(sw);
        }

    }

    @Test
    public void testGetRegionList() {

        for (int i = 0; i < 5; i++) {
            StopWatch sw = new StopWatch("R");
            sw.start();
            configurationDAO.getRegionList();
            sw.stop();
            System.out.println(sw);
        }

    }
}

そしてここに出力があります:-

StopWatch 'C': running time (millis) = 217; [] took 217 = 100%
StopWatch 'C': running time (millis) = 15; [] took 15 = 100%
StopWatch 'C': running time (millis) = 16; [] took 16 = 100%
StopWatch 'C': running time (millis) = 15; [] took 15 = 100%
StopWatch 'C': running time (millis) = 16; [] took 16 = 100%

StopWatch 'R': running time (millis) = 201; [] took 201 = 100%
StopWatch 'R': running time (millis) = 15; [] took 15 = 100%
StopWatch 'R': running time (millis) = 0; [] took 0 = 0%
StopWatch 'R': running time (millis) = 16; [] took 16 = 100%
StopWatch 'R': running time (millis) = 15; [] took 15 = 100%

ここでわかるように、クエリの最初の実行には時間がかかり、その後の実行時間は短くなります。クエリロガーをオンにすると、SQLが初めて起動されることがわかります。

于 2012-04-27T04:15:47.923 に答える
0

Seleniumを介した機能テストについて話しているので、アプリをブラックボックスと見なし、Seleniumが実際にはユーザーであるためテストする必要があります。したがって、Webインターフェイスを介してデータを渡し、アプリがデータを処理して後で表示する方法をテストする必要があります。

このようなアプリケーション全体の機能テストの代わりに、さまざまなコンポーネントのテストを使用したビヘイビア駆動開発があります。ここでのコンポーネントは、コントローラーから始まり、DAOで終わるフローです(通常、DAOは、非常に高速に合格するようなテストでモックされますが、データベースでの動作はテストされません)。この場合、完全な環境テストの小さなセットとBDDテストの大きなセットがあります。

于 2012-04-27T07:18:10.363 に答える