git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: Jonathan Nieder <jrnieder@gmail.com>
Cc: "Jens Lehmann" <Jens.Lehmann@web.de>,
	"Junio C Hamano" <gitster@pobox.com>,
	"Git Mailing List" <git@vger.kernel.org>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Subject: Re: guarding everything with test_expect_success (Re: [PATCH 6/7] t1303 (config): style tweaks)
Date: Tue, 7 Sep 2010 01:56:37 -0400	[thread overview]
Message-ID: <20100907055636.GA30357@sigill.intra.peff.net> (raw)
In-Reply-To: <20100907051218.GO1182@burratino>

On Tue, Sep 07, 2010 at 12:12:18AM -0500, Jonathan Nieder wrote:

> As you mentioned, it is a big departure from the style of the existing
> tests.  So why push it?  A quick story:
> 
> 1. Long ago, when I first debugged a test script with -v, I was a bit
>    confused because the transcript did not tell the whole story
>    (because some commands are run outside test assertions).  No big
>    deal, but I remembered it.

Yeah, that can be frustrating. However, I have found (as I think you
have, from your point 4 below) that it is not just about seeing the
whole story with "-v", but rather about reaching some state in the test
script which may depend on prior tests. So yes, if everything were in
"-v", you could in theory cut and paste it all into a terminal. But
would you necessarily _want_ to, if it is test 25 in the script?

What I often end up doing is sticking "&& bash" into the test, running
the script, and exploring from that state. Perhaps we could have more
support for that. E.g., something like:

  $ ./t1303-wacky-config.sh --debug=2
  expecting success:
          setup &&
          git config section.key bar &&
          check section.key bar
  ok 1 - modify same key

  entering debug session for test 2; test text is:
        setup &&
        git config section2.key bar &&
        check section.key foo &&
        check section2.key bar

  $ [now try running commands]

The obvious problem is that you're actually in a subshell, not the same
shell. We would probably want to do some behind-the-scenes magic to
import variables and functions from the parent shell (unless you can
think of a clever way to suddenly turn the existing shell interactive).

> 2. Sometimes the setup commands outside of test scripts produce
>    output.  This is annoying, so people silence it.

Yeah, it is annoying. And I am totally in favor of things that might
produce output going into test_expect_success blocks. And...

> 3. Sometimes the setup commands outside of test scripts are broken.
>    Tests do not use "set -e" or check for errors outside of test
>    assertions, so simple typos can go undetected for a long time.

I agree here. And I'm totally in favor of things that might fail going
into test_expect_success blocks. I don't consider running "printf", or
dumping a here-document into a file via cat to be likely to fail.

> 4. What actually provoked me to care about it: when trying to add a
>    test to t9301-fast-import.sh, say, I found myself completely lost.
>    It is really hard to figure out what the state is supposed to be
>    at a particular point in the test script.  Sometimes I am tempted
>    to write a new test script when adding a new behavior, only
>    because I do not understand the existing one on a topic.  All the
>    tests can be well-behaved and follow sane invariants, but that
>    does not matter, because the invariants are not documented anywhere.

To some degree, I addressed this above. But yeah, even with a nice
drop-to-shell debug support, undocumented invariants are going to be a
pain when debugging a test. But I don't think moving them into a
test_expect_success block is going to help that. The problem is subtle
state changes of the test directory.

Things like test_when_finished help with that, and I hope people will
use them. But I fear that tests will always suffer from being somewhat
messier than actual code, and will always be written in a bit of a
procedural fashion. That is, I don't think we will ever achieve a level
of modularity and orthogonality in writing tests that would mean you
could just run some tests in isolation. It's just not worth the effort
most of the time.

Still, I encourage you to try to push in that direction by leading by
example. You obviously have some ideas. My only real complaint about
your patch was that I find the syntax uglier. And your suggestions are
not alone in that. We have tons of ugly quoting because of the need to
double-quote in test_expect_success. Perhaps we could refactor it into a
set of two functions that keep state? E.g., something like:

test_start 'setup'
cat >expect <<EOF
... whatever ...
EOF
test_end success

test_start 'description'
git frob >actual &&
test_cmp expect actual
test_end success

where test_start would set up >&3 and >&4 as usual, and test_end would
check $? and report the status. The biggest problem I see is that we
never have the actual shell script snippet as a string, so we don't have
a way of printing it for "-v" (or on failure). Hmm.

> The result would be:
> 
>  - test commands all shown with "-v", output all suppressed without;
>  - all commands pass at least the sanity check of exiting with 0
>    status;
>  - easy to write a GIT_SKIP_TESTS specification.  Would be possible
>    to add the ability to try a single test (plus all setup tests in
>    that script that precede it);
>  - as long as all the setup tests pass, the list of failed tests
>    from a test failure can be more informative;
>  - state can be tracked by just reading the setup tests.

Again, I think these are great goals. I'm not sure we will ever reach
them, or whether we will find the work that goes into them to be worth
the effort (especially because it is so easy to break these properties
with new tests, and there is not a good test harness for testing how
well you have written your tests).

> I don't know: I think
> 
> 	cat >expect <<-\EOF &&
> 	...
> 	EOF
> 
> is pretty readable.  The problem with sticking to

Yeah, I almost mentioned that, but for some reason in the back of my
mind <<- is not actually portable. Perhaps I am just thinking of the
fact that perl does not support it.

-Peff

  reply	other threads:[~2010-09-07  5:56 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-06 18:39 [PATCH] Several tests: cd inside subshell instead of around Jens Lehmann
2010-09-06 19:06 ` Jonathan Nieder
2010-09-06 20:12   ` Jens Lehmann
2010-09-07  1:41     ` [PATCH 0/7] " Jonathan Nieder
2010-09-07  1:42       ` [PATCH 1/7] tests: subshell indentation stylefix Jonathan Nieder
2010-09-07  3:44         ` Jonathan Nieder
2010-09-07  1:47       ` [PATCH 2/7] t1450 (fsck): remove dangling objects Jonathan Nieder
2010-09-07  1:49       ` [PATCH 3/7] t2105 (gitfile): add missing && Jonathan Nieder
2010-09-07 12:57         ` Brad King
2010-09-07  1:50       ` [PATCH 4/7] t0004 (unwritable files): simplify error handling Jonathan Nieder
2010-09-07  1:52       ` [PATCH 5/7] t1302 (core.repositoryversion): style tweaks Jonathan Nieder
2010-09-07 23:45         ` Nguyen Thai Ngoc Duy
2010-09-07  1:53       ` [PATCH 6/7] t1303 (config): " Jonathan Nieder
2010-09-07  4:30         ` Jeff King
2010-09-07  4:52           ` Junio C Hamano
2010-09-07  5:27             ` Jonathan Nieder
2010-09-07  5:12           ` guarding everything with test_expect_success (Re: [PATCH 6/7] t1303 (config): style tweaks) Jonathan Nieder
2010-09-07  5:56             ` Jeff King [this message]
2010-09-07  6:12               ` Jonathan Nieder
2010-09-07  1:55       ` [PATCH/RFC 7/7] t2016 (checkout -p): use printf for multiline y/n input Jonathan Nieder
2010-09-07  8:06         ` Thomas Rast
2010-09-07  8:22           ` Jonathan Nieder
2010-09-06 23:16 ` [PATCH] Several tests: cd inside subshell instead of around Junio C Hamano
2010-09-07  2:37   ` Jonathan Nieder
2010-09-07  5:08     ` Junio C Hamano
2010-09-07  5:19       ` Jonathan Nieder
2010-09-07 10:29   ` [PATCH] t1020: Get rid of 'cd "$HERE"' at the start of each test Jens Lehmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100907055636.GA30357@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=Jens.Lehmann@web.de \
    --cc=avarab@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).