20

Java プロジェクトでは、JUnit テストがセットアップ、テスト、破棄を行います。インメモリ データベースを使用して実際のデータベースをモック アウトする場合でも、通常は、トランザクションをロールバックするか、データベースをメモリから削除して、各テストの間に再作成します。これにより、1 つのテストが次のテストに影響を与える可能性のある環境にアーティファクトを残さないため、テストを分離できます。各テストは既知の状態で開始され、別の状態に移行することはありません。

これで、1100 個のテーブルと 400K のコード (多数の pl/sql パッケージ) を作成する Oracle db ビルドができました。データベースのインストールをテストするだけでなく(完全 - スクラッチから作成、部分 - 以前のデータベースからのアップグレードなど)、すべてのテーブルと他のオブジェクトがインストール後に期待どおりの状態であることを確認したいのですが、 pl/sqlでテストを実行します(前者を正確に行う方法がわかりません-提案?)。

これをすべてJenkins for CIから実行して、回帰テストで開発エラーをキャッチできるようにしたいと考えています。

まず、XE は Java SP をサポートしておらず、Oracle Web Flow に依存しているため、XE の代わりにエンタープライズ バージョンを使用する必要があります。これらの依存関係を排除したとしても、通常、ビルドは読み込みだけで 1.5 時間かかります (フル ビルド)。

では、この環境でテストの分離を実現するにはどうすればよいでしょうか。テストごとにトランザクションを使用してロールバックしますか? OK、コミットを含む pl/sql プロシージャはどうですか?

各テストの後にデータベースをリセットするか、各テストの間にデータベース全体を再作成するためのバックアップとリカバリについて考えました(抜本的すぎます)。どちらもインストールに 1 時間以上かかるため、実用的ではありません。テストごとにこれを行うのは、やり過ぎで正気ではありません。

データベーススキーマの砂に線を引き、その時点にロールバックする方法はありますか? 大きな「元に戻す」機能のようなものです。expdp/impdp または rman 以外の何か。おそらく、アプローチ全体がオフになっています。提案?他の人はこれをどのように行っていますか?

CI または小規模な本番アップグレード ウィンドウの場合、テスト スイート全体を妥当な時間 (30 分が理想的) で実行する必要があります。

この「元に戻す」機能を実現するのに役立つ製品はありますか?

4

4 に答える 4

11

Kevin McCormack は、The Server Labs ブログで、Maven と Hudson を使用した PL/SQL の継続的統合テストに関する記事を公開しました。 それをチェックしてください。テスト コンポーネントの重要な要素は、PL/SQL での JUnit の概念の実装である、Steven Feuerstein の utPlsqlフレームワークです。

テスト フィクスチャをリセットする必要があることは、PL/SQL テストの大きな問題の 1 つです。役立つことの 1 つは、ストアド プロシージャでのコミットを回避し、適切なプラクティスを遵守することです。トランザクション制御は、コール スタックの最も外側の部分のみに制限する必要があります。コミットを発行する必要があるだけのプログラム (おそらく DDL を実行するため暗黙的に) には、DELETE ステートメントを発行するテスト フィクスチャが常に存在します。リレーショナル整合性を処理すると、コーディングが非常に難しくなります。

もう 1 つの方法は、Data Pump を使用することです。impdp を破棄するように見えますが、Oracle はそのための PL/SQL API DBMS_DATAPUMPも提供しています。インポートを実行する前に既存のデータを破棄する機能を提供するため、ここでそれをお勧めします。したがって、エクスポートされたデータ セットをテスト フィクスチャとして使用できます。SetUp を実行するには、Data Pump ジョブを実行する必要があります。TearDown では何もする必要はありません。その片付けは SetUp の開始時に行われるからです。

于 2011-06-10T22:45:42.390 に答える
9

Oracle では、Flashback Technology を使用してサーブを特定の時点に復元できます。

http://download.oracle.com/docs/cd/B28359_01/backup.111/b28270/rcmflash.htm

于 2011-06-10T21:21:18.087 に答える
3

1.5時間は、1100個のテーブルと400Kのコードでは非常に長い時間のようです。私は明らかにあなたの環境の詳細を知りませんが、私の経験に基づいて、あなたはそれを5分から10分に短縮できるに違いありません。Oracleで見た2つの主なインストールスクリプトの問題は次のとおりです。

1.操作は小さな断片に分割されます

ステップが多いほど、オーバーヘッドが大きくなります。たとえば、次のようなコードを可能な限り統合する必要があります。

交換:

create table x(a number, b number, c number);
alter table x modify a not null;
alter table x modify b not null;
alter table x modify c not null;

と:

create table x(a number not null, b number not null, c number not null);

交換:

insert into x values (1,2,3);
insert into x values (4,5,6);
insert into x values (7,8,9);

と:

insert into x
select 1,2,3 from dual union all
select 4,5,6 from dual union all
select 7,8,9 from dual;

これは、スクリプトとデータベースを異なる場所で実行する場合に特に当てはまります。この小さなネットワークラグは、10,000を掛けると問題になり始めます。私が知っているすべてのOracleSQLツールは、一度に1つのコマンドを送信します。

2.開発者はデータベースを共有する必要があります

これは、技術的な修正というよりも長期的なプロセスソリューションですが、いつか開始する必要があります。Oracleを使用するほとんどの場所では、少数のサーバーにのみOracleがインストールされています。そうなると、慎重に管理しなければならない希少なリソースになります。人々はそれをめぐって争い、役割は不明確であり、物事は修正されません。

それがあなたの環境なら、狂気を止めて、今すぐすべてのラップトップにOracleをインストールしてください。数百ドルを費やして、すべての人に個人版(Enterprise Editionと同じ機能を備えています)を提供します。必要なツールをすべての人に提供してください。継続的な改善により、最終的に問題が解決します。


また、スキーマ「元に戻す」の場合は、トランスポータブル表領域を調べることをお勧めします。私はこれを使ったことがありませんが、おそらくそれはシステムをインストールするはるかに速い方法です-インポートする代わりにファイルをコピーして貼り付けるだけです。同様に、おそらく何らかのタイプの仮想化が役立つ可能性があります-OSとデータベースのスナップショットを作成します。

于 2011-06-14T07:26:54.513 に答える
0

Oracle Flashback は Enterprise Edition の機能ですが、ベースとなっているテクノロジーはすべてのエディション、つまり Oracle Log Miner で利用できます。

http://docs.oracle.com/cd/B28359_01/server.111/b28319/logminer.htm#i1016535

誰かが機能テストのテスト分離を提供するためにこれを使用したかどうかを知りたいです。つまり、 v$LOGMNR_CONTENTS をクエリして、テストの開始に対応する時点から UNDO ステートメントのリストを取得します。

データベースはアーカイブ モードである必要があり、junit テスト ケースではメソッドにアノテーションが付けられている必要があります。

@Startup 

DBMS_LOGMNR.START_LOGMNR を呼び出します。テストが実行され、次に で注釈が付けられたメソッドで実行されます

@Teardown

v$LOGMNR_CONTENTS をクエリして、UNDO ステートメントのリストを検索します。これらは、JDBC 経由で実行されます。実際、UNDO ステートメントのクエリと実行は、PLSQL ストアド プロシージャに抽出できます。ステートメントが実行される順序を考慮する必要があります。

これには、トランザクションをコミットできるという利点があると思います。これは、参照整合性、主キー違反など、非常に多くのバグが入り込む可能性がある場所です。

于 2013-02-09T09:28:15.167 に答える