From: Jonathan Nieder <jrnieder@gmail.com>
To: Jeff King <peff@peff.net>
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: guarding everything with test_expect_success (Re: [PATCH 6/7] t1303 (config): style tweaks)
Date: Tue, 7 Sep 2010 00:12:18 -0500 [thread overview]
Message-ID: <20100907051218.GO1182@burratino> (raw)
In-Reply-To: <20100907043050.GA13291@sigill.intra.peff.net>
(+cc: Ævar in case he is interested)
Hi,
Jeff King wrote:
> So I dunno. Most of it I am fine with, though I question whether it is
> really worth the effort. But I really don't want to be too draconian
> about "everything must go into test_expect_success".
Thanks for the comments; that is very useful. I'm sure you won't
be surprised to hear that that is a part I am more attached to than
the () vs {}, say. I think I did not explain it well.
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.
2. Sometimes the setup commands outside of test scripts produce
output. This is annoying, so people silence it.
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.
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.
How to fix that? I would like to see tests look roughly like this:
test_description='description of purpose
description of state maintained between tests
'
. ./test-lib.sh
test_expect_success 'setup' '
...
'
test_expect_success 'some good thing holds' '
... commands that do not break global state ...
'
test_expect_success 'another good thing holds' '
... more peaceful test commands ...
'
test_expect_success 'setup: update global state somehow' '
...
'
...
test_done
Some of my other puzzling patches (test_might_fail, test_when_finished)
are also meant for this purpose. Of course, it will take a while.
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.
> Sure, if you are
> executing commands that might have output, or might be of interest to
> the user, put them there. But I find this a lot more readable:
>
> cat >expect <<'EOF'
> ... some expected output ...
> EOF
> test_expect_success 'frob it' '
I don't know: I think
cat >expect <<-\EOF &&
...
EOF
is pretty readable. The problem with sticking to
cat >expect <<\EOF
...
EOF
is that once someone wants to include a commit id, they change
it to
cat >expect <<EOF
... $(git rev-parse ... )
...
EOF
and we have nontrivial code outside the test now.
On the other hand:
> , but IMO you are
> making at least one of them less readable, because you have to deal with
> the extra quoting layer of test_expect_success. IOW:
>
>> -SECTION="test.q\"s\\sq'sp e.key"
>> test_expect_success 'make sure git config escapes section names properly' '
>> + SECTION="test.q\"s\\sq'\''sp e.key" &&
>
> seems like a net loss to me.
I wholeheartedly agree, and maybe I should have done
apos="'\''" &&
SECTION="test.q\"s\\sq${apos}sp e.key" &&
or something; this detail of quoting has never brought much happiness
to me.
Sorry for the ramble. Thoughts welcome.
Jonathan
next prev parent reply other threads:[~2010-09-07 5:14 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 ` Jonathan Nieder [this message]
2010-09-07 5:56 ` guarding everything with test_expect_success (Re: [PATCH 6/7] t1303 (config): style tweaks) Jeff King
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=20100907051218.GO1182@burratino \
--to=jrnieder@gmail.com \
--cc=Jens.Lehmann@web.de \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/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).