[HACKERS] Thoughts on unit testing? - Mailing list pgsql-hackers

From Thomas Munro
Subject [HACKERS] Thoughts on unit testing?
Date
Msg-id CAEepm=2heu+5zwB65jWap3XY-UP6PpJZiKLQRSV2UQH9BmVRXQ@mail.gmail.com
Whole thread Raw
Responses Re: [HACKERS] Thoughts on unit testing?  (Andres Freund <andres@anarazel.de>)
Re: [HACKERS] Thoughts on unit testing?  (Peter Eisentraut <peter.eisentraut@2ndquadrant.com>)
Re: [HACKERS] Thoughts on unit testing?  (Peter Geoghegan <pg@bowt.ie>)
List pgsql-hackers
Hi hackers,

The current regression tests, isolation tests and TAP tests are very
good (though I admit my experience with TAP is limited), but IMHO we
are lacking support for C-level unit testing.  Complicated, fiddly
things with many states, interactions, edge cases etc can be hard to
get full test coverage on from the outside.  Consider
src/backend/utils/mmgr/freepage.c as a case in point.

I guess we could consider the various xUnit systems for C[1] and have
an entirely new kind of test that runs independently of PostgreSQL.  I
guess that'd be difficult politically (choosing external project,
cognitive load) and technically (global state problems as soon as you
get away from completely stand-alone components).

One idea that keeps coming back to me is that we could probably extend
our existing regression tests to cover C tests with automatic
discovery/minimal boilerplate.  Imagine if you just had to create a
file bitmapset.test.c that sits beside bitmapset.c (and perhaps add it
to TEST_OBJS), and in it write tests using a tiny set of macros a bit
like Google Test's[2].  It could get automagically sucked into a test
driver shlib module, perhaps one per source directory/subsystem, that
is somehow discovered, loaded and run inside PostgreSQL as part of the
regression suite, or perhaps it's just explicitly listed in the
regression schedule with a .sql file that loads the module and runs an
entry point function.

One problem is that if this was happening inside an FMGR function it'd
be always in a transaction, which has implications.  There are
probably better ways to do it.

Thoughts, better ideas?

[1] https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C
[2] https://github.com/google/googletest/blob/master/googletest/samples/sample1_unittest.cc

-- 
Thomas Munro
http://www.enterprisedb.com



pgsql-hackers by date:

Previous
From: Merlin Moncure
Date:
Subject: Re: [HACKERS] emergency outage requiring database restart
Next
From: Mark Dilger
Date:
Subject: Re: [HACKERS] Request more documentation for incompatibility of parallelism and plpgsql exec_run_select