リレーショナルデータベース回帰テストのデータ品質


9

私は、ミュージアムのアクセッション、寄贈、貸与、またはその他の方法で取得したアーティファクトを追跡するために使用されるオープンソースのミュージアムコレクション管理Webアプリケーションに取り組んでいます。

これには、(以前の経験と比べて)かなり大規模なデータベースの設計と作成が含まれ、さまざまな種類のさまざまな情報(アーチファクト情報、場所の変更情報、個人の連絡先情報、写真など)が格納され、柔軟で簡単に拡張できる必要があります。 。

私は大学の学位を取得したばかりで、データベースの設計に関しては専門家ではないので、自分が持っているものが「機能する」ことを確認するための完全なテストスイートを作成したいと思っています。

私はデータベースのテストを読み、データベースに関する回帰テストについて言及しているいくつかの記事に出くわしましたが、これがすべてに関係していることを完全には理解していません。Dr.Dobbsでこの記事を読んだことで、データベース内のロジックが正しいことを検証することが、必要なテストの1つであることを理解しています。したがって、特定のデータをデータベースに挿入するテストを作成し、それをクエリでフォローアップして、データベースから正しいデータが返されることを確認します(すべての適切なトリガーまたはビューが機能していることを確認します)。

混乱は、「データ品質」のテストについての言及で生じます。上記の記事で、著者はテストで以下を検証したいと述べています:

  • 列ドメイン値のルール
  • 列のデフォルト値のルール
  • 価値存在ルール
  • 行の値のルール
  • サイズルール

これにはどのような種類のテストが含まれ、どのように実装されますか?また、これはデータベースのテストスイートを初めて作成するのですが、テスト開発をガイドするために開始する方法/場所、または実行できるプロセスに関する優れたガイドラインはありますか?

回答:


3

この質問に対する完全な回答は非常に長くなります。要点を申し上げます。

懸念事項を分離するために、次のようなテストを検討している場合があります。

A-データベース設計を検証します。

B-プログラムがデータベースと正しく相互作用していることを確認します。

データベース設計の検証は、データベースを設計した人が行う必要があります。開発者(単体テスト中)は、パート(B)にもっと関心を持つ必要があります。2つのタイプのテストの主な違いは、使用するツールです。(A)の場合、プロジェクトコードから独立した環境を使用しますが、(B)の場合は、プロジェクトのコードを使用します。次のテキストでは、両方を混合します。

特定の質問に答えるには:

列ドメイン値のルール

各列にはデータ型が関連付けられています。各列をビジネスルールに対して検証して、正しいデータ型を表していることを証明する必要があります。列のデータ型がビジネス要件と互換性がない場合、またはコードがデータベースでの定義とは異なるデータ型を使用している場合、問題が発生する可能性があります。

例えば:

  • 列がsmall intとして定義されている場合、その列にテキストを格納することはできません。列がオプションの場合、これは特に重要なテストです。実際にデータが入力されるまで気付かれない可能性があるためです。

  • ビジネスで発生する必要がある列に負の値を格納できますか?

列のデフォルト値のルール

一部の列は、DDL(データ定義言語)のデフォルト値の指定に関連付けられており、挿入時に挿入によって値が提供されない場合、データベースはデフォルト値を想定します。これは、値を渡さずに、データベースに格納されている結果の値を観察することでテストできます。このテストには、Nullable列のチェックも含まれます。列に一意のインデックスが構築されていない限り、DDLから検証できるため、テストが必要になることはほとんどありません。

価値存在ルール

これを理解したところで、挿入または更新されたデータがデータベースで期待どおりに表示されることを確認します。

行の値のルール

これが正確に何を意味するのか私ははっきりしていません。

サイズルール

各列には、DDLでの定義方法に基づいて、データベース内のサイズがあります。要件に適合する値(GUIから入力されたもの、または計算の出力として得られたもの)が列に正しく格納されるようにする必要があります。たとえば、Small Integerデータ型では50億の値を格納できません。また、VARCHAR2(30)として定義された名前は40文字に対応しないため、特に列をデータの集計に使用する場合は、ここでビジネスルールを明確にする必要があります。そのような状況で何が起こるかをテストしたいとします。

開始する方法/場所に関するガイドライン

これを行う1つの方法は、テスト計画を作成することです。仕様(要件ドキュメントやユースケースなど)およびソフトウェアの正しいバージョンを使用していることを確認したい。また、ユニットテスト(存在する場合)によって行われたテストとこれらのテストを調整する必要があります。再度実行する必要のない重複したテストを見つける場合があります。テストの前にデータベースのコピーを取得して、必要に応じて特定のテストを繰り返すことができます。DBAがこれをお手伝いします。また、チームがこれらのテストをどのように文書化し、テストの範囲を検証するかをチームに確認する必要があります。データベースを論理部分に分割し、各論理部分のテストを個別に開始できます。テストプロセスは、データベースのDDLを調査し、列がビジネスの必要に応じて正しく定義されていることを確認することから始まります。テストの大部分を実行するには、アプリケーションのソフトウェアを使用し、他のツールは使用しないでください。たとえば、次の質問:

  • 列は定義されたタイプであると想定されています(NameをIntとして作成しても意味がありません)。

  • サイズはビジネス要件に対応していますか?

  • ビジネス要件のすべての列がデータベースにありますか?

  • null列は本当にオプションですか?

次に、上記をテストするためのテストケースを設計できます。GUIを使用してほとんどのテストを実行できます。

あなたが言及していない他の重要なデータベーステストがあります。それらは以下を扱います:

1-主キーがビジネスの観点から本当にユニークであることをテストします。

2-一意のインデックス(PK以外)がビジネスの観点から本当に一意であることをテストします。

3-外部キー制約のテストが機能します。

4-行が削除されたときに何が起こるか、および関連する行への影響をテストします。

5-CHEKC、トリガー(存在する場合)などの特別なデータベース構成に関するその他のテスト。

6-正しいテーブル正規化とその正規化された列が正しい値を保持します。

上記は完全なリストではありませんが、それであなたは始められるはずです。


回答の詳細をありがとうございます。また、テスト開発の提案は、開始するのに適しているようです。ご協力いただきありがとうございます。
Kristen D.

クリステン @Songoフィードバックに感謝します。
NoChance 2012

1

私はあなたがこれに間違った方法で取り組んでいると思います。

私が知っているすべてのデータベースは、データをテーブルに挿入する前に検証します-各列の定義に対してデータを検証します。SMALLINT(3)列に80文字の文字列を入力することはできません-データベースはその試行に失敗し、エラーが発生したことを通知します。データを挿入してから取得することで、自分でテストする必要はありません。

必要なのは、データがデータベースに送信される前のデータの検証/フィルタリングルールです。

  • データが各列の許容されるタイプと範囲に適合していることを確認し、不要なコンテンツをフィルタリングする
  • エラー(およびパブリックインターフェイスがある場合はSQLインジェクションの可能性)を回避するために、適切にエスケープするようにします。

これらの検証/フィルタリングルールは、実際のアプリケーションのデータに対して実行する必要があります。次に、テストを設定して、正しいデータと正しくないデータを入力して、テストが成功するか失敗するかを確認して、テストが正しいことを確認できます。

データベース設計に関する限り、実際にテストで検証することはできません。多くの設計は、理想的でなくても(そして異なる人の間での理想的な変更の定義でも)機能します。適切なデータベース設計には、自動テストではなく、経験と知識が必要です。


私はあなたがどこから来たのかわかり、データベースに到達する前にデータを検証するフィルターを作成してテストするつもりですが、この質問では、データベースの設計を検証することを主な目的としていました(実際にできる限りのことです)それを使用して)、また、実際に機能しているものが意図したとおりに機能していることを確認します(たとえば、@ EmmadKareemが彼の回答で述べたように、外部キー制約が破られていないことを確認します。データ検証は非常に不可欠なので、データベースを使用するすべてのアプリケーションの一部
Kristen D.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.