Thread (22 messages) 22 messages, 5 authors, 2020-12-03

Re: [PATCH 6/6] fixup! reftable: rest of library

From: Jeff King <hidden>
Date: 2020-12-02 12:44:38

On Wed, Dec 02, 2020 at 12:01:49PM +0100, Han-Wen Nienhuys wrote:
quoted
I'm not sure if the long-term goal is to have this opaque unit-test
program or not. If it is, I was likewise going to suggest that its
ad-hoc output be replaced with TAP. But it looks like on your branch
that "test-tool reftable" does not produce output at all. So I may be a
bit behind on what the current state and forward plans are...
The most important requirement is that something fails if the
unittests don't work. I surmised that that meant running tests from
test-helper in some way, so this is what happens now. Looking for
"unit.?test" across the git codebase didn't turn up much info. Happy
to explore other solutions if you can give me pointers.
Normally we do a combination of:

  - git plumbing exposes scriptable commands, and we make sure those
    work. This is a much coarser-grained unit than testing individual C
    functions, but produces resilient tests because that interface is
    user-visible and stable (and in fact seeing test breakages is often
    a sign that one will be breaking real users).

    These are obviously driven by shell script tests emulating what
    users might run.

  - for unit tests of individual data types where it's not appropriate
    to have a user-facing command, we often add a test-tool helper that
    exposes specific functions (e.g., t/helper/test-date.c exposes date
    parsing and formatting routines, test-oid-array.c exercises methods
    of that data type, etc).

    The C parts of these are usually generic, and then are driven by
    shell scripts providing the actual data in individual tests (and
    handling success/failure, skipping tests, etc).

    This is still coarser than you might get unit-testing inside C.
    E.g., you could not generally check the difference between passing
    an empty array vs NULL to a function. But our philosophy has
    generally been _not_ to test at that level. The C interfaces are
    internal, and Git is not that big a project. If there's a function
    whose caller does something unexpected, it's usually easier to fix
    the caller and add a test that triggers the caller's code path.

I agree that a test that simply runs a bunch of C code and either exits
with failure or success is better than nothing, in the sense of finding
tests. And wrapping that with a single test_expect_success does that.
But it's unfortunate that we get none of the fine-grained control that
the test suite provides, nor much support in debugging failing tests.

One middle ground would be for a battery of C tests to output
TAP-compatible output (outputting "ok 1 - foo works", and "not ok 2 -
bar does not work", etc). That at least gives more info on what fails,
and does it in a way that the rest of the test suite can interpret
(though not manipulate).

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help