Direction for test frameworks: Perl TAP vs. Python/pytest - Mailing list pgsql-hackers

From Andrew Dunstan
Subject Direction for test frameworks: Perl TAP vs. Python/pytest
Date
Msg-id cdaaf722-4529-435b-9340-cedf1a3a277f@dunslane.net
Whole thread
Responses Re: Direction for test frameworks: Perl TAP vs. Python/pytest
List pgsql-hackers
Hi,


We now have several pieces of test-infrastructure work in flight that 
point in
different directions, and I'd like the community to settle the direction 
before
more effort is expended on directions we might not want to follow.

Several things exist today:

1. My PostgreSQL::Test::Session work, which gives the Perl TAP framework
    in-process libpq sessions instead of forking psql per query. Part of the
    motivation is that BackgroundPsql is fragile and has a habit of 
swallowing
    errors; a real session object sidesteps that. It also means far less
    forking, so things run a good deal more efficiently -- especially on
    Windows, where process creation is expensive. The Perl framework is 
still
    gaining features. It currently relies on FFI::Platypus, and it's not 
clear
    that's available everywhere we build Postgres -- if not, we'd need 
to fall
    back on an XS wrapper. ("Pq Session object plus TAP test improvements",
    CF #6834 [1]; origin thread "Using LibPq in TAP tests via FFI" [2].)

2. Jelte Fennema-Nio's proposed minimal Python/pytest framework
    (src/test/pytest), aimed mainly at new tests. It already carries an
    in-process ctypes libpq layer of its own -- and note that on the Python
    side this needs no FFI module or XS wrapper at all, since ctypes is 
in the
    standard library and can bind to libpq natively. ("RFC: adding 
pytest as a
    supported test framework", CF #6045 [3].)

3. Two full ports of the existing TAP suite (~300 tests plus the 
framework) to
    that pytest shape, both validated against the existing suite. Greg 
Burd's [4]
    is a fully additive port: it leaves the existing Perl suite in place 
and runs
    a Python twin of each test beside it. Queries go through psql by default
    (matching safe_psql), with an opt-in in-process ctypes libpq layer for
    protocol-level tests. Mine [5] builds on Jelte's framework rather than
    standing apart from it: I've modularised and extended its libpq 
layer into a
    full Session along the lines of Test::Session, expanded the server and
    fixture helpers to cover replication, logical decoding, backups, and 
log and
    connection/auth checks, and added harness support for the SSL, LDAP,
    Kerberos and OAuth suites along with a pg_regress runner. I did this 
partly
    to show that we have an adequate basis for porting even if we never 
declare
    a flag day, and partly because, for what it's worth, I think the
    Test::Session model is a much more solid foundation for a port than the
    current framework is.

So the work supports more than one strategy. The question is which we want:

(A) Wholesale port with a flag day -- Python becomes *the* framework,
migrate the existing tests, stop accepting and eventually remove the 
Perl one.
One framework to learn and maintain, but a large disruptive change with real
dependency questions (which Python, which libpq binding, buildfarm 
minimums).

(B) Minimal Python framework for new tests, Perl preserved alongside.
Less disruptive, but commits us to two frameworks for some time.

(C) Something in between -- adopt the Python framework and port over 
just the
most fragile tests (the ones leaning on BackgroundPsql, say), leaving 
the rest
in Perl for now. This gets the worst pain points onto a sounder footing
without committing to a full migration up front.

(D) Keep both, but put each on a sounder footing: land the Test::Session 
work
so the Perl side stops depending on BackgroundPsql, and adopt the Python
framework alongside it for new tests. This addresses the fragility 
within Perl
rather than by porting, and doesn't force a migration either way.

If we land on (B), (C) or (D), I think we have to answer these questions:

- Do we implement new infrastructure features (e.g. the Session work) twice,
   or let the two frameworks drift?
- When an existing Perl test needs substantial new coverage, do we extend it
   in Perl or port it? "Port on touch" front-loads cost onto bug fixers.

Having shown a full port is feasible, my inclination is that the maintenance
argument favours converging on one framework -- but I'm wary of the 
disruption,
so I could see (D) as a sane and fairly safe option.

So how would people like to proceed?

cheers

andrew

[1] https://commitfest.postgresql.org/patch/6834/
[2] 
https://www.postgresql.org/message-id/997f67ac-cc02-4076-9fda-db465e89c622%40dunslane.net
[3] https://commitfest.postgresql.org/patch/6045/
[4] https://github.com/gburd/postgres/pull/24
[5] https://github.com/adunstan/pgdev/pull/5


--
Andrew Dunstan
EDB: https://www.enterprisedb.com




pgsql-hackers by date:

Previous
From: Ethan Mertz
Date:
Subject: Re: [PATCH] Improving index selection for logical replication apply with replica identity full
Next
From: Robert Haas
Date:
Subject: Re: use of SPI by postgresImportForeignStatistics