PostgreSQL
PrevChapter 26. Regression テストNext

Regression 結果の解析

“失敗した” テストは、エラーメッセージや算術ライブラリ、または 出力フォーマットなどのわずかな違いにより失敗したのかもしれません。この タイプの "失敗" は、Postgres の問題を示している わけではありません。

i686/Linux-ELF プラットフォームにおいては、これが v6.2.1 regression テストの参照プラットフォームであるため、失敗するテストはありませんでした。

SPARC/Linux-ELF プラットフォームでは、Postgres v6.2 の 970525 ベータバージョンを使って、以下のテストが失敗しました: 浮動小数点数の細かい精度の違いにより、float8 と geometry が "失敗" しました。select_views プロシージャはかなりの出力の違いを見せますが、 それらの違いはわずかな浮動小数点数の違いによるものです。

結論としてはどうなんでしょう?もし失敗したものがあれば、それらの違いの 本質を理解しようと努力し、またそれらが Postgres が意図したものに影響を与えるかどうかを見極めてください。しかしながら、 忘れないでいただきたいのは、v6.1 からのたくさんのバグフィックスが組み 込まれた現在までの Postgres のほぼ堅牢な リリースが行われそうなこと、および、Postgres のそれ以前のバージョンが、現在もしばしば成功裏に使われていることです。

期待されるものと実際の出力の比較

出力結果は ./results ディレクトリにあります。これらの結果は ./expected ディレクトリにある結果と 'diff' を使って比較できます。これらのファイルは 完全には一致しないかもしれません。以下の節では、違いについて説明して みようと思います。

エラーメッセージの違い

regression テストの中には、故意に無効な入力値を与えるものがあります。 このため Postgres のコード、およびホスト・プラットフォームのシステム ルーチンの両方からエラーメッセージを受ける場合があります。後のケース では、メッセージはプラットフォームにより異なるでしょうが、似たような 情報が返ってくるはずですね。メッセージにおけるこれらの違いにより regression テストは失敗するでしょうが、これは検査することにより確認 できるものです。

OID の違い

'regress.out' において、PostgreSQL の OID (オブジェクト識別子)が現れる ところがあります。OID はユニークな 32 ビットの整数で、 テーブルに行を INSERT したり UPDATE したりするたびに、PostgreSQL のバックエンドにより 生成されます。まっさらでないデータベースで regression テストを実行したり、 何度も実行したりすると、OID は異なった値で報告されます。 'misc.out' にある以下の SQL 文 QUERY: SELECT user_relns() AS user_relns ORDER BY user_relns; では、OID から 'a,523676' という行が作られます。

日付と時刻の違い

サポートされた多くのプラットフォーム上で、カリフォルニアのバークレイと 同じ時刻で動作しているように PostgreSQL に思い込ませることができます。 詳細は、regression テストの実行方法の節を参照してください。 もしタイムゾーン環境を明示的に PST8PDT に設定しない場合、ほとんどの 日付と時刻の結果はあなたのローカルタイムを反映し、その結果 regression テストに失敗することになります。 ローカルタイムゾーンのルールを明示的に設定する際に、推奨される書式を 受け付けないシステムがいくつか見受けられます。パブリック・ドメインの タイムゾーン・パッケージを使っているあるシステムでは、1970 年以前の PDT 時刻 が PST で表現されてしまうという小さな問題があります。

浮動小数点数の違い

いくつかのテストでは、64 ビット (float8) 数値をテーブルの カラムから取り出して計算を行います。float8 項目における 数学関数では、異なった結果が発生する場合があることが知られています。 これらは、Intel/86 上の BSDI と SOLARIS のように、異なったオペレーティング ・システムを同一のプラットフォーム上で使用する場合、または、SPARC および Intel/86 上の SOLARIS といったように、異なったプラットフォーム 上で同一のオペレーティング・システムを使った場合に発生します。 これらのどこが異なっているのかは、人間の目で確かめる必要があります。 通常は、小数点以下 10 桁目ということになるでしょう。 システムによっては、pow() と exp() の振る舞いが現在の Postgres の コードが期待するものと異なるため、シグナル・エラーが発生するものも あります。

多角形の違い

Oakland/Berkley CA 道路地図に関する地形データでいくつかのテストが 行われました。その地図データは多角形として表現されており、頂点は float8 数のペア(数字の緯度と経度)で表されます。 まず最初にいくつかのテーブルが生成され、地形データがロードされます。 その後、多角形の交点演算子(##)を使って 2 つのテーブルを join する ビューが生成され、そのビュー上で select が行われます。 異なったプラットフォームからの結果を比較すると、小数点以下 2 桁目と 3 桁目で違いが発生します。これらの問題が起こる場合の SQL ステートメント は以下の通りです。

    QUERY: SELECT * from street;
    QUERY: SELECT * from iexit;

乱数の違い

random.out に無作為の結果を出力することが想定されているテストケースが、 すくなくとも 1 つあります。この乱数により、regression は失敗します。

    diff results/random.out expected/random.out
とタイプしてみると、この理由による違いが若干見うけられます。しかし、 異なったアーキテクチャ上における浮動小数点数の違いは、こんなものでは ないでしょう。後述のリリースノートを参照してください。

expected ファイル

./expected/*.out ファイルは、Jolly Chen et al により 提供された一枚岩のオリジナル expected.input ファイル に適合されました。いろいろな開発マシン上で生成された、これらのファイルの より新しいバージョンは、注意深く?検査された後に、オリジナルに取って代わり ました。Ix86 ハードウェア上で多くの開発マシンが、いろいろな UNIX OS (FreeBSD, Linux, など)により動いています。 オリジナルの expected.input は、 postgres5-1.02a5.tar.gz ソールツリーを使って、 SPARC Solaris 2.4 システム上で作られました。このファイルは、ある I386 Solaris 2.4 システムで作られたファイルと比較されましたが、違いは、 浮動小数点多角形の小数点以下 3 桁目の数字のみでした(後述)。 オリジナルの sample.regress.out ファイルは、 Jolly Chen により構築された postgres-1.01 リリースで作られたものですが、 リファレンスとしてここに引用されています。このファイルは、DEC ALPHA マシン上で、postgres-1.01 リリースの Makefile.global として、PORTNAME=alpha 付きで生成されたものかもしれません。


PrevHomeNext
Regression テストの流れUpリリースノート