テストの評価

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 第 29章リグレッションテスト | 早送り | 次のページ

# 29.2. テストの評価

適正にインストールされ、かつ、全ての機能が使用できるようなPostgreSQLインストレーションであっても、浮動小数点の表現とメッセージ内の単語順などのプラットフォーム特有の誤差のために"失敗"することがあります。 現在のテストは単純に、参照用システムで生成した出力との`diff`を取ることで結果の検証を行っているため、システムの些細な違いにも反応します。 結果が"失敗"となったら常に実際の結果と予測した結果の差を調査してください。 それらの差異が重大ではないことが判明することもあります。 なお、全てのテストが成功するように、サポートする全てのプラットフォームに対する正確な参照ファイルの保守に努めています。

実際のリグレッションテストの出力は`src/test/regress/results`ディレクトリ内のファイルに書き込まれます。 テストスクリプトは`diff`を使用して、各出力ファイルと`src/test/regress/expected`ディレクトリ内の参照用出力とを比較します。 あらゆる差異は調査用に`src/test/regress/regression.diffs`に保存されます （あるいは、自分で`diff`を実行することもできます）。

何らかの理由で、特定のプラットフォームが指定した試験で"失敗"し、その出力の調査により結果の方が有効であると確信できた場合、新しい比較用ファイルを追加し、今後の試験で失敗報告が発生しないようにすることができます。 詳細は項29.3を参照してください。

## 29.2.1. エラーメッセージの違い

リグレッションテストのいくつかは故意に無効な入力値を使用します。 エラーメッセージはPostgreSQLのコードによるもの、または使用しているプラットフォームの関数によるものがあります。 後者の場合、プラットフォームによって違いがあるかもしれませんが、似たような内容であるはずです。 これらのメッセージの違いによりリグレッションテストは"失敗"する可能性がありますが、これらは検査で確認できます。

## 29.2.2. ロケールの違い

既にインストールされている、Cロケール以外の照合順ロケールで初期化されたサーバに対してテストを実行する際には、ソート順やフォローアップの失敗によって違いが生じる可能性があります。 リグレッションテストスイートはこの問題を解決するために、多くのロケールを処理するための代替の結果ファイルを提供するように設定されています。

一時的なインストレーションを使用して、異なるロケールのテストを実行するためには、以下の例のように、`make`コマンドラインに適切なロケール関連の環境変数を渡してください。

    gmake check LANG=de_DE.utf8

（リグレッションテストのドライバは`LC_ALL`を設定しないため、この変数を使ってロケールを選択しても動作しません。） ロケール無しを使用するためには、すべてのロケール関連の環境変数を設定しないか（または、それらを`C`に設定する）、もしくは以下の特殊な起動を行います。

    gmake check NO_LOCALE=1

既存のインストレーションに対してテストを実行する場合は、ロケール設定は既存のインストレーションによって決まります。 変更するためには、`initdb`に適切なオプションを渡して、異なるロケールでデータベースクラスタを初期化してください。

実際に実運用で使用されるロケールおよび符号化方式に関連した部分のコードが検証されますので、一般的にはやはり、リグレッションテストを実運用で使用されるロケール設定で実行することを試みることを推奨します。 オペレーティングシステム環境に依存して、結果が失敗する場合もありますが、少なくとも実際のアプリケーションを実行する時に想定されるロケール固有の動作を知ることができます。

## 29.2.3. 日付と時刻の違い

ほとんどの日付と時刻の結果は時間帯の環境に依存します。 参照結果のファイルは`PST8PDT`時間帯（カリフォルニア州バークレイ）を基準に生成されています。 したがって、テストがこの時間帯で実行されなければ明らかに失敗に終わります。 リグレッションテストのドライバは結果が正しくなるように、`PGTZ`環境変数を`PST8PDT`に設定します。 しかし、使用しているオペレーティングシステムは`PST8PDT`時間帯をサポートしている必要があります。 提供されていなければ時間帯に依存しているテストは失敗に終わります。 使用しているマシンがこの機能をサポートしているかの確認は以下の方法で行うことができます。

    env TZ=PST8PDT date

上記のコマンドを実行したら、`PST8PDT`時間帯での現在のシステム時間を返すはずです。 もし`PST8PDT`時間帯が利用できなければ、UTC時間で返している可能性があります。 `PST8PDT`時間帯が存在しなければ、以下のように明示的に時間帯の規則を設定することができます。

    PGTZ='PST8PDT7,M04.01.0,M10.05.03'; export PGTZ

ローカルな時間帯の規則の明示的な設定に推奨された構文を受け付けないシステムがあります。 それらのマシンでは違った`PGTZ`設定を使用する必要があります。

古い時間帯のライブラリを使っているシステムでは1970年以前の夏時間の修正に失敗し、1970年以前のPDT時刻がPSTで表現されてしまうという問題があります。 このため、テスト結果でローカル時間の違いを生じてしまいます。

## 29.2.4. 浮動小数点数の違い

64ビット（`double precision`型）の浮動小数点数値をテーブルの列から取り出して計算を行うテストがあります。 `double precision`列における数学演算関数では、異なった結果が発生する場合があることが知られています。 `float8`と`geometry`テストは特に、プラットフォーム間、またはコンパイラの最適化オプションによる小さな違いが起こりやすくなります。 これらの違いが重要なのか無視できるのかは、人間の目で実際に確かめる必要があります。 通常は、小数点以下10桁目ということになるでしょう。

システムによって、マイナス0を`-0`と表示するものも、単に`0`と表示するものもあります。

システムによっては、現在のPostgreSQLのコードが想定するメカニズムと異なるために、`pow()`と`exp()`でエラーを発生する場合があります。

## 29.2.5. 行の順序の違い

同じ行の出力が期待されるファイルで記述されている順序とは異なっている場合があります。 ほとんどの場合、これは厳密に言ってバグではありません。 ほとんどのリグレッションテストは各`SELECT`文に対して`ORDER BY`を使用するほど規則に厳しくなく、そのため、結果の行の順序はSQLの仕様に従って、明確に決まっていません。 実際には、同じソフトウェアで、同じデータを同じ問い合わせで参照しているので全てのプラットフォームで同じ順序の結果が返され、よって、`ORDER BY`がないことは問題ではないと言えます。 しかし、問い合わせによっては、プラットフォーム間の順序の違いが起こる可能性があります。 インストール済みのサーバに対して試験を行う場合、C以外のロケール、独自の`work_mem`や独自のプランナ用のコストパラメータなどデフォルト以外のパラメータ設定により順序の違いが生じる可能性があります。

したがって、順序の違いが起こった場合、問い合わせに`ORDER BY`が含まれていて順序が影響を及ぼす場合以外は、気にしないでください。 しかし、将来のリリースで、特定の問い合わせに`ORDER BY`を追加して、偽の"失敗"を取り除くためにご一報ください。

このような問題を回避させるために、リグレッションテストの問い合わせに順序関連のコマンドを挿入しない理由として、それを行うと、必要がない問い合わせに対しても問い合わせ計画型を実行しようとするなどのことからリグレッションテストの意義を逆に半減させることが挙げられます。

## 29.2.6. スタック長の不足

`errors`が`select infinite_recurse()`コマンドでサーバをクラッシュさせた場合、プラットフォームのプロセススタックサイズがmax_stack_depth パラメータが示す値よりも小さいことを意味します。 これは、スタックサイズ制限を高くしてサーバを実行することで修正することができます（デフォルトの`max_stack_depth`での推奨値は4メガバイト）。 これを行うことができない場合、`max_stack_depth`の値を少なくすることが代替方法です。

## 29.2.7. "乱数" テスト

`random`テストスクリプトは、無作為な結果を生成することを目的としています。 randomリグレッションテストは稀に失敗に終わることがあります。 次のように、

    diff results/random.out expected/random.out

と入力すると、ほんの数行だけの差異が生じるはずです。 繰り返し失敗しない限り、気に留める必要はありません。

前のページ | ホーム | 次のページ
テストの実行 | 上に戻る | 各種の比較用ファイル