summaryrefslogtreecommitdiffstats
path: root/doc/src/sgml/regress.sgml
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--doc/src/sgml/regress.sgml886
1 files changed, 886 insertions, 0 deletions
diff --git a/doc/src/sgml/regress.sgml b/doc/src/sgml/regress.sgml
new file mode 100644
index 0000000..724ef56
--- /dev/null
+++ b/doc/src/sgml/regress.sgml
@@ -0,0 +1,886 @@
+<!-- doc/src/sgml/regress.sgml -->
+
+ <chapter id="regress">
+ <title>Regression Tests</title>
+
+ <indexterm zone="regress">
+ <primary>regression tests</primary>
+ </indexterm>
+
+ <indexterm zone="regress">
+ <primary>test</primary>
+ </indexterm>
+
+ <para>
+ The regression tests are a comprehensive set of tests for the SQL
+ implementation in <productname>PostgreSQL</productname>. They test
+ standard SQL operations as well as the extended capabilities of
+ <productname>PostgreSQL</productname>.
+ </para>
+
+ <sect1 id="regress-run">
+ <title>Running the Tests</title>
+
+ <para>
+ The regression tests can be run against an already installed and
+ running server, or using a temporary installation within the build
+ tree. Furthermore, there is a <quote>parallel</quote> and a
+ <quote>sequential</quote> mode for running the tests. The
+ sequential method runs each test script alone, while the
+ parallel method starts up multiple server processes to run groups
+ of tests in parallel. Parallel testing adds confidence that
+ interprocess communication and locking are working correctly.
+ </para>
+
+ <sect2>
+ <title>Running the Tests Against a Temporary Installation</title>
+
+ <para>
+ To run the parallel regression tests after building but before installation,
+ type:
+<screen>
+make check
+</screen>
+ in the top-level directory. (Or you can change to
+ <filename>src/test/regress</filename> and run the command there.)
+ At the end you should see something like:
+<screen>
+<computeroutput>
+=======================
+ All 193 tests passed.
+=======================
+</computeroutput>
+</screen>
+ or otherwise a note about which tests failed. See <xref
+ linkend="regress-evaluation"/> below before assuming that a
+ <quote>failure</quote> represents a serious problem.
+ </para>
+
+ <para>
+ Because this test method runs a temporary server, it will not work
+ if you did the build as the root user, since the server will not start as
+ root. Recommended procedure is not to do the build as root, or else to
+ perform testing after completing the installation.
+ </para>
+
+ <para>
+ If you have configured <productname>PostgreSQL</productname> to install
+ into a location where an older <productname>PostgreSQL</productname>
+ installation already exists, and you perform <literal>make check</literal>
+ before installing the new version, you might find that the tests fail
+ because the new programs try to use the already-installed shared
+ libraries. (Typical symptoms are complaints about undefined symbols.)
+ If you wish to run the tests before overwriting the old installation,
+ you'll need to build with <literal>configure --disable-rpath</literal>.
+ It is not recommended that you use this option for the final installation,
+ however.
+ </para>
+
+ <para>
+ The parallel regression test starts quite a few processes under your
+ user ID. Presently, the maximum concurrency is twenty parallel test
+ scripts, which means forty processes: there's a server process and a
+ <application>psql</application> process for each test script.
+ So if your system enforces a per-user limit on the number of processes,
+ make sure this limit is at least fifty or so, else you might get
+ random-seeming failures in the parallel test. If you are not in
+ a position to raise the limit, you can cut down the degree of parallelism
+ by setting the <literal>MAX_CONNECTIONS</literal> parameter. For example:
+<screen>
+make MAX_CONNECTIONS=10 check
+</screen>
+ runs no more than ten tests concurrently.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Running the Tests Against an Existing Installation</title>
+
+ <para>
+ To run the tests after installation (see <xref linkend="installation"/>),
+ initialize a data directory and start the
+ server as explained in <xref linkend="runtime"/>, then type:
+<screen>
+make installcheck
+</screen>
+or for a parallel test:
+<screen>
+make installcheck-parallel
+</screen>
+ The tests will expect to contact the server at the local host and the
+ default port number, unless directed otherwise by <envar>PGHOST</envar> and
+ <envar>PGPORT</envar> environment variables. The tests will be run in a
+ database named <literal>regression</literal>; any existing database by this name
+ will be dropped.
+ </para>
+
+ <para>
+ The tests will also transiently create some cluster-wide objects, such as
+ roles, tablespaces, and subscriptions. These objects will have names
+ beginning with <literal>regress_</literal>. Beware of
+ using <literal>installcheck</literal> mode with an installation that has
+ any actual global objects named that way.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Additional Test Suites</title>
+
+ <para>
+ The <literal>make check</literal> and <literal>make installcheck</literal> commands
+ run only the <quote>core</quote> regression tests, which test built-in
+ functionality of the <productname>PostgreSQL</productname> server. The source
+ distribution contains many additional test suites, most of them having
+ to do with add-on functionality such as optional procedural languages.
+ </para>
+
+ <para>
+ To run all test suites applicable to the modules that have been selected
+ to be built, including the core tests, type one of these commands at the
+ top of the build tree:
+<screen>
+make check-world
+make installcheck-world
+</screen>
+ These commands run the tests using temporary servers or an
+ already-installed server, respectively, just as previously explained
+ for <literal>make check</literal> and <literal>make installcheck</literal>. Other
+ considerations are the same as previously explained for each method.
+ Note that <literal>make check-world</literal> builds a separate instance
+ (temporary data directory) for each tested module, so it requires more
+ time and disk space than <literal>make installcheck-world</literal>.
+ </para>
+
+ <para>
+ On a modern machine with multiple CPU cores and no tight operating-system
+ limits, you can make things go substantially faster with parallelism.
+ The recipe that most PostgreSQL developers actually use for running all
+ tests is something like
+<screen>
+make check-world -j8 >/dev/null
+</screen>
+ with a <option>-j</option> limit near to or a bit more than the number
+ of available cores. Discarding <systemitem>stdout</systemitem>
+ eliminates chatter that's not interesting when you just want to verify
+ success. (In case of failure, the <systemitem>stderr</systemitem>
+ messages are usually enough to determine where to look closer.)
+ </para>
+
+ <para>
+ Alternatively, you can run individual test suites by typing
+ <literal>make check</literal> or <literal>make installcheck</literal> in the appropriate
+ subdirectory of the build tree. Keep in mind that <literal>make
+ installcheck</literal> assumes you've installed the relevant module(s), not
+ only the core server.
+ </para>
+
+ <para>
+ The additional tests that can be invoked this way include:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Regression tests for optional procedural languages.
+ These are located under <filename>src/pl</filename>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Regression tests for <filename>contrib</filename> modules,
+ located under <filename>contrib</filename>.
+ Not all <filename>contrib</filename> modules have tests.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Regression tests for the ECPG interface library,
+ located in <filename>src/interfaces/ecpg/test</filename>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Tests for core-supported authentication methods,
+ located in <filename>src/test/authentication</filename>.
+ (See below for additional authentication-related tests.)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Tests stressing behavior of concurrent sessions,
+ located in <filename>src/test/isolation</filename>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Tests for crash recovery and physical replication,
+ located in <filename>src/test/recovery</filename>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Tests for logical replication,
+ located in <filename>src/test/subscription</filename>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Tests of client programs, located under <filename>src/bin</filename>.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ When using <literal>installcheck</literal> mode, these tests will create
+ and destroy test databases whose names
+ include <literal>regression</literal>, for
+ example <literal>pl_regression</literal>
+ or <literal>contrib_regression</literal>. Beware of
+ using <literal>installcheck</literal> mode with an installation that has
+ any non-test databases named that way.
+ </para>
+
+ <para>
+ Some of these auxiliary test suites use the TAP infrastructure explained
+ in <xref linkend="regress-tap"/>.
+ The TAP-based tests are run only when PostgreSQL was configured with the
+ option <option>--enable-tap-tests</option>. This is recommended for
+ development, but can be omitted if there is no suitable Perl installation.
+ </para>
+
+ <para>
+ Some test suites are not run by default, either because they are not secure
+ to run on a multiuser system or because they require special software. You
+ can decide which test suites to run additionally by setting the
+ <command>make</command> or environment variable
+ <varname>PG_TEST_EXTRA</varname> to a whitespace-separated list, for
+ example:
+<programlisting>
+make check-world PG_TEST_EXTRA='kerberos ldap ssl'
+</programlisting>
+ The following values are currently supported:
+ <variablelist>
+ <varlistentry>
+ <term><literal>kerberos</literal></term>
+ <listitem>
+ <para>
+ Runs the test suite under <filename>src/test/kerberos</filename>. This
+ requires an MIT Kerberos installation and opens TCP/IP listen sockets.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ldap</literal></term>
+ <listitem>
+ <para>
+ Runs the test suite under <filename>src/test/ldap</filename>. This
+ requires an <productname>OpenLDAP</productname> installation and opens
+ TCP/IP listen sockets.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><literal>ssl</literal></term>
+ <listitem>
+ <para>
+ Runs the test suite under <filename>src/test/ssl</filename>. This opens TCP/IP listen sockets.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ Tests for features that are not supported by the current build
+ configuration are not run even if they are mentioned in
+ <varname>PG_TEST_EXTRA</varname>.
+ </para>
+
+ <para>
+ In addition, there are tests in <filename>src/test/modules</filename>
+ which will be run by <literal>make check-world</literal> but not
+ by <literal>make installcheck-world</literal>. This is because they
+ install non-production extensions or have other side-effects that are
+ considered undesirable for a production installation. You can
+ use <literal>make install</literal> and <literal>make
+ installcheck</literal> in one of those subdirectories if you wish,
+ but it's not recommended to do so with a non-test server.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Locale and Encoding</title>
+
+ <para>
+ By default, tests using a temporary installation use the
+ locale defined in the current environment and the corresponding
+ database encoding as determined by <command>initdb</command>. It
+ can be useful to test different locales by setting the appropriate
+ environment variables, for example:
+<screen>
+make check LANG=C
+make check LC_COLLATE=en_US.utf8 LC_CTYPE=fr_CA.utf8
+</screen>
+ For implementation reasons, setting <envar>LC_ALL</envar> does not
+ work for this purpose; all the other locale-related environment
+ variables do work.
+ </para>
+
+ <para>
+ When testing against an existing installation, the locale is
+ determined by the existing database cluster and cannot be set
+ separately for the test run.
+ </para>
+
+ <para>
+ You can also choose the database encoding explicitly by setting
+ the variable <envar>ENCODING</envar>, for example:
+<screen>
+make check LANG=C ENCODING=EUC_JP
+</screen>
+ Setting the database encoding this way typically only makes sense
+ if the locale is C; otherwise the encoding is chosen automatically
+ from the locale, and specifying an encoding that does not match
+ the locale will result in an error.
+ </para>
+
+ <para>
+ The database encoding can be set for tests against either a temporary or
+ an existing installation, though in the latter case it must be
+ compatible with the installation's locale.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Custom Server Settings</title>
+
+ <para>
+ Custom server settings to use when running a regression test suite can be
+ set in the <varname>PGOPTIONS</varname> environment variable (for settings
+ that allow this):
+<screen>
+make check PGOPTIONS="-c force_parallel_mode=regress -c work_mem=50MB"
+</screen>
+ When running against a temporary installation, custom settings can also be
+ set by supplying a pre-written <filename>postgresql.conf</filename>:
+<screen>
+echo 'log_checkpoints = on' > test_postgresql.conf
+echo 'work_mem = 50MB' >> test_postgresql.conf
+make check EXTRA_REGRESS_OPTS="--temp-config=test_postgresql.conf"
+</screen>
+ </para>
+
+ <para>
+ This can be useful to enable additional logging, adjust resource limits,
+ or enable extra run-time checks such as <xref
+ linkend="guc-debug-discard-caches"/>.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Extra Tests</title>
+
+ <para>
+ The core regression test suite contains a few test files that are not
+ run by default, because they might be platform-dependent or take a
+ very long time to run. You can run these or other extra test
+ files by setting the variable <envar>EXTRA_TESTS</envar>. For
+ example, to run the <literal>numeric_big</literal> test:
+<screen>
+make check EXTRA_TESTS=numeric_big
+</screen>
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Testing Hot Standby</title>
+
+ <para>
+ The source distribution also contains regression tests for the static
+ behavior of Hot Standby. These tests require a running primary server
+ and a running standby server that is accepting new WAL changes from the
+ primary (using either file-based log shipping or streaming replication).
+ Those servers are not automatically created for you, nor is replication
+ setup documented here. Please check the various sections of the
+ documentation devoted to the required commands and related issues.
+ </para>
+
+ <para>
+ To run the Hot Standby tests, first create a database
+ called <literal>regression</literal> on the primary:
+<screen>
+psql -h primary -c "CREATE DATABASE regression"
+</screen>
+ Next, run the preparatory script
+ <filename>src/test/regress/sql/hs_primary_setup.sql</filename>
+ on the primary in the regression database, for example:
+<screen>
+psql -h primary -f src/test/regress/sql/hs_primary_setup.sql regression
+</screen>
+ Allow these changes to propagate to the standby.
+ </para>
+
+ <para>
+ Now arrange for the default database connection to be to the standby
+ server under test (for example, by setting the <envar>PGHOST</envar> and
+ <envar>PGPORT</envar> environment variables).
+ Finally, run <literal>make standbycheck</literal> in the regression directory:
+<screen>
+cd src/test/regress
+make standbycheck
+</screen>
+ </para>
+
+ <para>
+ Some extreme behaviors can also be generated on the primary using the
+ script <filename>src/test/regress/sql/hs_primary_extremes.sql</filename>
+ to allow the behavior of the standby to be tested.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="regress-evaluation">
+ <title>Test Evaluation</title>
+
+ <para>
+ Some properly installed and fully functional
+ <productname>PostgreSQL</productname> installations can
+ <quote>fail</quote> some of these regression tests due to
+ platform-specific artifacts such as varying floating-point representation
+ and message wording. The tests are currently evaluated using a simple
+ <command>diff</command> comparison against the outputs
+ generated on a reference system, so the results are sensitive to
+ small system differences. When a test is reported as
+ <quote>failed</quote>, always examine the differences between
+ expected and actual results; you might find that the
+ differences are not significant. Nonetheless, we still strive to
+ maintain accurate reference files across all supported platforms,
+ so it can be expected that all tests pass.
+ </para>
+
+ <para>
+ The actual outputs of the regression tests are in files in the
+ <filename>src/test/regress/results</filename> directory. The test
+ script uses <command>diff</command> to compare each output
+ file against the reference outputs stored in the
+ <filename>src/test/regress/expected</filename> directory. Any
+ differences are saved for your inspection in
+ <filename>src/test/regress/regression.diffs</filename>.
+ (When running a test suite other than the core tests, these files
+ of course appear in the relevant subdirectory,
+ not <filename>src/test/regress</filename>.)
+ </para>
+
+ <para>
+ If you don't
+ like the <command>diff</command> options that are used by default, set the
+ environment variable <envar>PG_REGRESS_DIFF_OPTS</envar>, for
+ instance <literal>PG_REGRESS_DIFF_OPTS='-c'</literal>. (Or you
+ can run <command>diff</command> yourself, if you prefer.)
+ </para>
+
+ <para>
+ If for some reason a particular platform generates a <quote>failure</quote>
+ for a given test, but inspection of the output convinces you that
+ the result is valid, you can add a new comparison file to silence
+ the failure report in future test runs. See
+ <xref linkend="regress-variant"/> for details.
+ </para>
+
+ <sect2>
+ <title>Error Message Differences</title>
+
+ <para>
+ Some of the regression tests involve intentional invalid input
+ values. Error messages can come from either the
+ <productname>PostgreSQL</productname> code or from the host
+ platform system routines. In the latter case, the messages can
+ vary between platforms, but should reflect similar
+ information. These differences in messages will result in a
+ <quote>failed</quote> regression test that can be validated by
+ inspection.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Locale Differences</title>
+
+ <para>
+ If you run the tests against a server that was
+ initialized with a collation-order locale other than C, then
+ there might be differences due to sort order and subsequent
+ failures. The regression test suite is set up to handle this
+ problem by providing alternate result files that together are
+ known to handle a large number of locales.
+ </para>
+
+ <para>
+ To run the tests in a different locale when using the
+ temporary-installation method, pass the appropriate
+ locale-related environment variables on
+ the <command>make</command> command line, for example:
+<programlisting>
+make check LANG=de_DE.utf8
+</programlisting>
+ (The regression test driver unsets <envar>LC_ALL</envar>, so it
+ does not work to choose the locale using that variable.) To use
+ no locale, either unset all locale-related environment variables
+ (or set them to <literal>C</literal>) or use the following
+ special invocation:
+<programlisting>
+make check NO_LOCALE=1
+</programlisting>
+ When running the tests against an existing installation, the
+ locale setup is determined by the existing installation. To
+ change it, initialize the database cluster with a different
+ locale by passing the appropriate options
+ to <command>initdb</command>.
+ </para>
+
+ <para>
+ In general, it is advisable to try to run the
+ regression tests in the locale setup that is wanted for
+ production use, as this will exercise the locale- and
+ encoding-related code portions that will actually be used in
+ production. Depending on the operating system environment, you
+ might get failures, but then you will at least know what
+ locale-specific behaviors to expect when running real
+ applications.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Date and Time Differences</title>
+
+ <para>
+ Most of the date and time results are dependent on the time zone
+ environment. The reference files are generated for time zone
+ <literal>PST8PDT</literal> (Berkeley, California), and there will be
+ apparent failures if the tests are not run with that time zone setting.
+ The regression test driver sets environment variable
+ <envar>PGTZ</envar> to <literal>PST8PDT</literal>, which normally
+ ensures proper results.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Floating-Point Differences</title>
+
+ <para>
+ Some of the tests involve computing 64-bit floating-point numbers (<type>double
+ precision</type>) from table columns. Differences in
+ results involving mathematical functions of <type>double
+ precision</type> columns have been observed. The <literal>float8</literal> and
+ <literal>geometry</literal> tests are particularly prone to small differences
+ across platforms, or even with different compiler optimization settings.
+ Human eyeball comparison is needed to determine the real
+ significance of these differences which are usually 10 places to
+ the right of the decimal point.
+ </para>
+
+ <para>
+ Some systems display minus zero as <literal>-0</literal>, while others
+ just show <literal>0</literal>.
+ </para>
+
+ <para>
+ Some systems signal errors from <function>pow()</function> and
+ <function>exp()</function> differently from the mechanism
+ expected by the current <productname>PostgreSQL</productname>
+ code.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Row Ordering Differences</title>
+
+ <para>
+You might see differences in which the same rows are output in a
+different order than what appears in the expected file. In most cases
+this is not, strictly speaking, a bug. Most of the regression test
+scripts are not so pedantic as to use an <literal>ORDER BY</literal> for every single
+<literal>SELECT</literal>, and so their result row orderings are not well-defined
+according to the SQL specification. In practice, since we are
+looking at the same queries being executed on the same data by the same
+software, we usually get the same result ordering on all platforms,
+so the lack of <literal>ORDER BY</literal> is not a problem. Some queries do exhibit
+cross-platform ordering differences, however. When testing against an
+already-installed server, ordering differences can also be caused by
+non-C locale settings or non-default parameter settings, such as custom values
+of <varname>work_mem</varname> or the planner cost parameters.
+ </para>
+
+ <para>
+Therefore, if you see an ordering difference, it's not something to
+worry about, unless the query does have an <literal>ORDER BY</literal> that your
+result is violating. However, please report it anyway, so that we can add an
+<literal>ORDER BY</literal> to that particular query to eliminate the bogus
+<quote>failure</quote> in future releases.
+ </para>
+
+ <para>
+You might wonder why we don't order all the regression test queries explicitly
+to get rid of this issue once and for all. The reason is that that would
+make the regression tests less useful, not more, since they'd tend
+to exercise query plan types that produce ordered results to the
+exclusion of those that don't.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Insufficient Stack Depth</title>
+
+ <para>
+ If the <literal>errors</literal> test results in a server crash
+ at the <literal>select infinite_recurse()</literal> command, it means that
+ the platform's limit on process stack size is smaller than the
+ <xref linkend="guc-max-stack-depth"/> parameter indicates. This
+ can be fixed by running the server under a higher stack
+ size limit (4MB is recommended with the default value of
+ <varname>max_stack_depth</varname>). If you are unable to do that, an
+ alternative is to reduce the value of <varname>max_stack_depth</varname>.
+ </para>
+
+ <para>
+ On platforms supporting <function>getrlimit()</function>, the server should
+ automatically choose a safe value of <varname>max_stack_depth</varname>;
+ so unless you've manually overridden this setting, a failure of this
+ kind is a reportable bug.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>The <quote>random</quote> Test</title>
+
+ <para>
+ The <literal>random</literal> test script is intended to produce
+ random results. In very rare cases, this causes that regression
+ test to fail. Typing:
+<programlisting>
+diff results/random.out expected/random.out
+</programlisting>
+ should produce only one or a few lines of differences. You need
+ not worry unless the random test fails repeatedly.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Configuration Parameters</title>
+
+ <para>
+ When running the tests against an existing installation, some non-default
+ parameter settings could cause the tests to fail. For example, changing
+ parameters such as <varname>enable_seqscan</varname> or
+ <varname>enable_indexscan</varname> could cause plan changes that would
+ affect the results of tests that use <command>EXPLAIN</command>.
+ </para>
+ </sect2>
+ </sect1>
+
+<!-- We might want to move the following section into the developer's guide. -->
+ <sect1 id="regress-variant">
+ <title>Variant Comparison Files</title>
+
+ <para>
+ Since some of the tests inherently produce environment-dependent
+ results, we have provided ways to specify alternate <quote>expected</quote>
+ result files. Each regression test can have several comparison files
+ showing possible results on different platforms. There are two
+ independent mechanisms for determining which comparison file is used
+ for each test.
+ </para>
+
+ <para>
+ The first mechanism allows comparison files to be selected for
+ specific platforms. There is a mapping file,
+ <filename>src/test/regress/resultmap</filename>, that defines
+ which comparison file to use for each platform.
+ To eliminate bogus test <quote>failures</quote> for a particular platform,
+ you first choose or make a variant result file, and then add a line to the
+ <filename>resultmap</filename> file.
+ </para>
+
+ <para>
+ Each line in the mapping file is of the form
+<synopsis>
+testname:output:platformpattern=comparisonfilename
+</synopsis>
+ The test name is just the name of the particular regression test
+ module. The output value indicates which output file to check. For the
+ standard regression tests, this is always <literal>out</literal>. The
+ value corresponds to the file extension of the output file.
+ The platform pattern is a pattern in the style of the Unix
+ tool <command>expr</command> (that is, a regular expression with an implicit
+ <literal>^</literal> anchor at the start). It is matched against the
+ platform name as printed by <command>config.guess</command>.
+ The comparison file name is the base name of the substitute result
+ comparison file.
+ </para>
+
+ <para>
+ For example: some systems lack a working <literal>strtof</literal> function,
+ for which our workaround causes rounding errors in the
+ <filename>float4</filename> regression test.
+ Therefore, we provide a variant comparison file,
+ <filename>float4-misrounded-input.out</filename>, which includes
+ the results to be expected on these systems. To silence the bogus
+ <quote>failure</quote> message on <systemitem>HP-UX 10</systemitem>
+ platforms, <filename>resultmap</filename> includes:
+<programlisting>
+float4:out:hppa.*-hp-hpux10.*=float4-misrounded-input.out
+</programlisting>
+ which will trigger on any machine where the output of
+ <command>config.guess</command> matches <literal>hppa.*-hp-hpux10.*</literal>.
+ Other lines in <filename>resultmap</filename> select the variant comparison
+ file for other platforms where it's appropriate.
+ </para>
+
+ <para>
+ The second selection mechanism for variant comparison files is
+ much more automatic: it simply uses the <quote>best match</quote> among
+ several supplied comparison files. The regression test driver
+ script considers both the standard comparison file for a test,
+ <literal><replaceable>testname</replaceable>.out</literal>, and variant files named
+ <literal><replaceable>testname</replaceable>_<replaceable>digit</replaceable>.out</literal>
+ (where the <replaceable>digit</replaceable> is any single digit
+ <literal>0</literal>-<literal>9</literal>). If any such file is an exact match,
+ the test is considered to pass; otherwise, the one that generates
+ the shortest diff is used to create the failure report. (If
+ <filename>resultmap</filename> includes an entry for the particular
+ test, then the base <replaceable>testname</replaceable> is the substitute
+ name given in <filename>resultmap</filename>.)
+ </para>
+
+ <para>
+ For example, for the <literal>char</literal> test, the comparison file
+ <filename>char.out</filename> contains results that are expected
+ in the <literal>C</literal> and <literal>POSIX</literal> locales, while
+ the file <filename>char_1.out</filename> contains results sorted as
+ they appear in many other locales.
+ </para>
+
+ <para>
+ The best-match mechanism was devised to cope with locale-dependent
+ results, but it can be used in any situation where the test results
+ cannot be predicted easily from the platform name alone. A limitation of
+ this mechanism is that the test driver cannot tell which variant is
+ actually <quote>correct</quote> for the current environment; it will just pick
+ the variant that seems to work best. Therefore it is safest to use this
+ mechanism only for variant results that you are willing to consider
+ equally valid in all contexts.
+ </para>
+
+ </sect1>
+
+ <sect1 id="regress-tap">
+ <title>TAP Tests</title>
+
+ <para>
+ Various tests, particularly the client program tests
+ under <filename>src/bin</filename>, use the Perl TAP tools and are run
+ using the Perl testing program <command>prove</command>. You can pass
+ command-line options to <command>prove</command> by setting
+ the <command>make</command> variable <varname>PROVE_FLAGS</varname>, for example:
+<programlisting>
+make -C src/bin check PROVE_FLAGS='--timer'
+</programlisting>
+ See the manual page of <command>prove</command> for more information.
+ </para>
+
+ <para>
+ The <command>make</command> variable <varname>PROVE_TESTS</varname>
+ can be used to define a whitespace-separated list of paths relative
+ to the <filename>Makefile</filename> invoking <command>prove</command>
+ to run the specified subset of tests instead of the default
+ <filename>t/*.pl</filename>. For example:
+<programlisting>
+make check PROVE_TESTS='t/001_test1.pl t/003_test3.pl'
+</programlisting>
+ </para>
+
+ <para>
+ The TAP tests require the Perl module <literal>IPC::Run</literal>.
+ This module is available from CPAN or an operating system package.
+ They also require <productname>PostgreSQL</productname> to be
+ configured with the option <option>--enable-tap-tests</option>.
+ </para>
+
+ <para>
+ Generically speaking, the TAP tests will test the executables in a
+ previously-installed installation tree if you say <literal>make
+ installcheck</literal>, or will build a new local installation tree from
+ current sources if you say <literal>make check</literal>. In either
+ case they will initialize a local instance (data directory) and
+ transiently run a server in it. Some of these tests run more than one
+ server. Thus, these tests can be fairly resource-intensive.
+ </para>
+
+ <para>
+ It's important to realize that the TAP tests will start test server(s)
+ even when you say <literal>make installcheck</literal>; this is unlike
+ the traditional non-TAP testing infrastructure, which expects to use an
+ already-running test server in that case. Some PostgreSQL
+ subdirectories contain both traditional-style and TAP-style tests,
+ meaning that <literal>make installcheck</literal> will produce a mix of
+ results from temporary servers and the already-running test server.
+ </para>
+ </sect1>
+
+ <sect1 id="regress-coverage">
+ <title>Test Coverage Examination</title>
+
+ <para>
+ The PostgreSQL source code can be compiled with coverage testing
+ instrumentation, so that it becomes possible to examine which
+ parts of the code are covered by the regression tests or any other
+ test suite that is run with the code. This is currently supported
+ when compiling with GCC, and it requires the <command>gcov</command>
+ and <command>lcov</command> programs.
+ </para>
+
+ <para>
+ A typical workflow looks like this:
+<screen>
+./configure --enable-coverage ... OTHER OPTIONS ...
+make
+make check # or other test suite
+make coverage-html
+</screen>
+ Then point your HTML browser
+ to <filename>coverage/index.html</filename>.
+ </para>
+
+ <para>
+ If you don't have <command>lcov</command> or prefer text output over an
+ HTML report, you can run
+<screen>
+make coverage
+</screen>
+ instead of <literal>make coverage-html</literal>, which will
+ produce <filename>.gcov</filename> output files for each source file
+ relevant to the test. (<literal>make coverage</literal> and <literal>make
+ coverage-html</literal> will overwrite each other's files, so mixing them
+ might be confusing.)
+ </para>
+
+ <para>
+ You can run several different tests before making the coverage report;
+ the execution counts will accumulate. If you want
+ to reset the execution counts between test runs, run:
+<screen>
+make coverage-clean
+</screen>
+ </para>
+
+ <para>
+ You can run the <literal>make coverage-html</literal> or <literal>make
+ coverage</literal> command in a subdirectory if you want a coverage
+ report for only a portion of the code tree.
+ </para>
+
+ <para>
+ Use <literal>make distclean</literal> to clean up when done.
+ </para>
+ </sect1>
+
+</chapter>