git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 1/3] test-lib: allow selecting tests by substring/glob with --run

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Oct 16, 2020, 11:40 UTC
Message-ID
<2b757512-793d-a6e0-0a50-368061e122dd@gmail.com>
In-Reply-To
<9c8b6a1a943261635fa09bed22ae36e368686f15.1602710025.git.gitgitgadget@gmail.com>
Hi Elijah
On 14/10/2020 22:13, Elijah Newren via GitGitGadget wrote:
Show 21 quoted lines
> From: Elijah Newren <newren@gmail.com>
> 
> Many of our test scripts have several "setup" tests.  It's a lot easier
> to say
> 
>     ./t0050-filesystem.sh --run=setup,9
> 
> in order to run all the setup tests as well as test #9, than it is to
> track down what all the setup tests are and enter all their numbers in
> the list.  Also, I often find myself wanting to run just one or a couple
> tests from the test file, but I don't know the numbering of any of the
> tests -- to get it I either have to first run the whole test file (or
> start counting by hand or figure out some other clever but non-obvious
> tricks).  It's really convenient to be able to just look at the test
> description(s) and then run
> 
>     ./t6416-recursive-corner-cases.sh --run=symlink
> 
> or
> 
>     ./t6402-merge-rename.sh --run='setup,unnecessary update'
The beginning of match_test_selector_list() looks like
match_test_selector_list () {
	title="$1"
	shift
	arg="$1"
	shift
	test -z "$1" && return 0
	# Both commas and whitespace are accepted as separators.
	OLDIFS=$IFS
	IFS=' 	,'
	set -- $1
	IFS=$OLDIFS
	# If the first selector is negative we include by default.
	include=
	case "$1" in
		!*) include=t ;;
	esac
	for selector
	do

If I'm reading it correctly the selectors are split on commas and whitespace which would mean we cannot match on "unnecessary update". I think we definitely want the ability to include whitespace in the selectors in order to be able to narrow down the tests that are run. I'm not sure that there is much value in splitting numbers on whitespace as it would mean the user has to quote them on the command line so we can probably just do 'IFS=,'. We'd also need to keep IFS as ',' in the case statement you add below as well rather than restoring it straight after the 'set' statement above.

Best Wishes
Phillip
Show 170 quoted lines
> Add such an ability to test selection which relies on merely matching
> against the test description.
> 
> Signed-off-by: Elijah Newren <newren@gmail.com>
> ---
>   t/README         | 29 +++++++++++++++++++----------
>   t/t0000-basic.sh | 41 +++++++++++++++++++++++++----------------
>   t/test-lib.sh    | 16 ++++++++++------
>   3 files changed, 54 insertions(+), 32 deletions(-)
> 
> diff --git a/t/README b/t/README
> index 2adaf7c2d2..0a8b60b5c7 100644
> --- a/t/README
> +++ b/t/README
> @@ -258,16 +258,13 @@ For an individual test suite --run could be used to specify that
>   only some tests should be run or that some tests should be
>   excluded from a run.
>   
> -The argument for --run is a list of individual test numbers or
> -ranges with an optional negation prefix that define what tests in
> -a test suite to include in the run.  A range is two numbers
> -separated with a dash and matches a range of tests with both ends
> -been included.  You may omit the first or the second number to
> -mean "from the first test" or "up to the very last test"
> -respectively.
> -
> -Optional prefix of '!' means that the test or a range of tests
> -should be excluded from the run.
> +The argument for --run, <test-selector>, is a list of description
> +substrings or globs or individual test numbers or ranges with an
> +optional negation prefix (of '!') that define what tests in a test
> +suite to include (or exclude, if negated) in the run.  A range is two
> +numbers separated with a dash and matches a range of tests with both
> +ends been included.  You may omit the first or the second number to
> +mean "from the first test" or "up to the very last test" respectively.
>   
>   If --run starts with an unprefixed number or range the initial
>   set of tests to run is empty. If the first item starts with '!'
> @@ -317,6 +314,18 @@ test in the test suite except from 7 up to 11:
>   
>       $ sh ./t9200-git-cvsexport-commit.sh --run='!7-11'
>   
> +Sometimes there may be multiple tests with e.g. "setup" in their name
> +that are needed and rather than figuring out the number for all of them
> +we can just use "setup" as a substring/glob to match against the test
> +description:
> +
> +    $ sh ./t0050-filesystem.sh --run=setup,9-11
> +
> +or one could select both the setup tests and the rename ones (assuming all
> +relevant tests had those words in their descriptions):
> +
> +    $ sh ./t0050-filesystem.sh --run=setup,rename
> +
>   Some tests in a test suite rely on the previous tests performing
>   certain actions, specifically some tests are designated as
>   "setup" test, so you cannot _arbitrarily_ disable one test and
> diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
> index 923281af93..07105b2078 100755
> --- a/t/t0000-basic.sh
> +++ b/t/t0000-basic.sh
> @@ -705,7 +705,31 @@ test_expect_success '--run empty selectors' "
>   	EOF
>   "
>   
> -test_expect_success '--run invalid range start' "
> +test_expect_success '--run substring selector' "
> +	run_sub_test_lib_test run-substring-selector \
> +		'--run empty selectors' \
> +		--run='relevant' <<-\\EOF &&
> +	test_expect_success \"relevant test\" 'true'
> +	for i in 1 2 3 4 5 6
> +	do
> +		test_expect_success \"other test #\$i\" 'true'
> +	done
> +	test_done
> +	EOF
> +	check_sub_test_lib_test run-substring-selector <<-\\EOF
> +	> ok 1 - relevant test
> +	> ok 2 # skip other test #1 (--run)
> +	> ok 3 # skip other test #2 (--run)
> +	> ok 4 # skip other test #3 (--run)
> +	> ok 5 # skip other test #4 (--run)
> +	> ok 6 # skip other test #5 (--run)
> +	> ok 7 # skip other test #6 (--run)
> +	> # passed all 7 test(s)
> +	> 1..7
> +	EOF
> +"
> +
> +test_expect_success '--run keyword selection' "
>   	run_sub_test_lib_test_err run-inv-range-start \
>   		'--run invalid range start' \
>   		--run='a-5' <<-\\EOF &&
> @@ -735,21 +759,6 @@ test_expect_success '--run invalid range end' "
>   	EOF_ERR
>   "
>   
> -test_expect_success '--run invalid selector' "
> -	run_sub_test_lib_test_err run-inv-selector \
> -		'--run invalid selector' \
> -		--run='1?' <<-\\EOF &&
> -	test_expect_success \"passing test #1\" 'true'
> -	test_done
> -	EOF
> -	check_sub_test_lib_test_err run-inv-selector \
> -		<<-\\EOF_OUT 3<<-\\EOF_ERR
> -	> FATAL: Unexpected exit with code 1
> -	EOF_OUT
> -	> error: --run: invalid non-numeric in test selector: '1?'
> -	EOF_ERR
> -"
> -
>   
>   test_set_prereq HAVEIT
>   haveit=no
> diff --git a/t/test-lib.sh b/t/test-lib.sh
> index ef31f40037..a040d54a76 100644
> --- a/t/test-lib.sh
> +++ b/t/test-lib.sh
> @@ -769,6 +769,8 @@ match_pattern_list () {
>   }
>   
>   match_test_selector_list () {
> +	operation="$1"
> +	shift
>   	title="$1"
>   	shift
>   	arg="$1"
> @@ -805,13 +807,13 @@ match_test_selector_list () {
>   			*-*)
>   				if expr "z${selector%%-*}" : "z[0-9]*[^0-9]" >/dev/null
>   				then
> -					echo "error: $title: invalid non-numeric in range" \
> +					echo "error: $operation: invalid non-numeric in range" \
>   						"start: '$orig_selector'" >&2
>   					exit 1
>   				fi
>   				if expr "z${selector#*-}" : "z[0-9]*[^0-9]" >/dev/null
>   				then
> -					echo "error: $title: invalid non-numeric in range" \
> +					echo "error: $operation: invalid non-numeric in range" \
>   						"end: '$orig_selector'" >&2
>   					exit 1
>   				fi
> @@ -819,9 +821,11 @@ match_test_selector_list () {
>   			*)
>   				if expr "z$selector" : "z[0-9]*[^0-9]" >/dev/null
>   				then
> -					echo "error: $title: invalid non-numeric in test" \
> -						"selector: '$orig_selector'" >&2
> -					exit 1
> +					case "$title" in *${selector}*)
> +						include=$positive
> +						;;
> +					esac
> +					continue
>   				fi
>   		esac
>   
> @@ -1031,7 +1035,7 @@ test_skip () {
>   		skipped_reason="GIT_SKIP_TESTS"
>   	fi
>   	if test -z "$to_skip" && test -n "$run_list" &&
> -	   ! match_test_selector_list '--run' $test_count "$run_list"
> +	   ! match_test_selector_list '--run' "$1" $test_count "$run_list"
>   	then
>   		to_skip=t
>   		skipped_reason="--run"
> 
Previous: Elijah Newren via GitGitGadgetNext: Elijah Newren
Message 50 of 71 in “Make test selection easier by specifying description substrings instead of just numeric counters”
  1. 0/3 Make test selection easier by specifying description substrings instead of just numeric countersElijah Newren via GitGitGadget, Oct 12, 2020
  2. 1/3 test-lib: allow selecting tests by substring/regex with --runElijah Newren via GitGitGadget, Oct 12, 2020
  3. Taylor BlauOct 13, 2020
  4. Elijah NewrenOct 13, 2020
  5. Taylor BlauOct 13, 2020
  6. Elijah NewrenOct 13, 2020
  7. 3/3 test-lib: reduce verbosity of skipped testsElijah Newren via GitGitGadget, Oct 12, 2020
  8. Taylor BlauOct 13, 2020
  9. Elijah NewrenOct 13, 2020
  10. Junio C HamanoOct 13, 2020
  11. 2/3 t6006, t6012: adjust tests to use 'setup' instead of synonymsElijah Newren via GitGitGadget, Oct 12, 2020
  12. Phillip WoodOct 13, 2020
  13. Johannes SchindelinOct 15, 2020
  14. Phillip WoodOct 15, 2020
  15. 0/3 Make test selection easier by specifying description substrings instead of just numeric countersElijah Newren via GitGitGadget, Oct 13, 2020
  16. 1/3 test-lib: allow selecting tests by substring/regex with --runElijah Newren via GitGitGadget, Oct 13, 2020
  17. Jeff KingOct 14, 2020
  18. Junio C HamanoOct 14, 2020
  19. Jeff KingOct 14, 2020
  20. Junio C HamanoOct 14, 2020
  21. Elijah NewrenOct 14, 2020
  22. Jeff KingOct 14, 2020
  23. Junio C HamanoOct 15, 2020
  24. Junio C HamanoOct 15, 2020
  25. Elijah NewrenOct 14, 2020
  26. Junio C HamanoOct 14, 2020
  27. Elijah NewrenOct 14, 2020
  28. Junio C HamanoOct 15, 2020
  29. Jeff KingOct 14, 2020
  30. Elijah NewrenOct 14, 2020
  31. Junio C HamanoOct 15, 2020
  32. Jeff KingOct 15, 2020
  33. Junio C HamanoOct 15, 2020
  34. Jeff KingOct 16, 2020
  35. Junio C HamanoOct 16, 2020
  36. Junio C HamanoOct 16, 2020
  37. Jeff KingOct 16, 2020
  38. Junio C HamanoOct 16, 2020
  39. 2/3 t6006, t6012: adjust tests to use 'setup' instead of synonymsElijah Newren via GitGitGadget, Oct 13, 2020
  40. 3/3 test-lib: reduce verbosity of skipped testsElijah Newren via GitGitGadget, Oct 13, 2020
  41. Jeff KingOct 14, 2020
  42. Elijah NewrenOct 14, 2020
  43. Jeff KingOct 14, 2020
  44. Elijah NewrenOct 14, 2020
  45. Taylor BlauOct 13, 2020
  46. 0/3 Make test selection easier by specifying description substrings instead of just numeric countersElijah Newren via GitGitGadget, Oct 14, 2020
  47. 2/3 t6006, t6012: adjust tests to use 'setup' instead of synonymsElijah Newren via GitGitGadget, Oct 14, 2020
  48. 3/3 test-lib: reduce verbosity of skipped testsElijah Newren via GitGitGadget, Oct 14, 2020
  49. 1/3 test-lib: allow selecting tests by substring/glob with --runElijah Newren via GitGitGadget, Oct 14, 2020
  50. Phillip WoodOct 16, 2020
  51. Elijah NewrenOct 16, 2020
  52. Phillip WoodOct 16, 2020
  53. Junio C HamanoOct 16, 2020
  54. Jeff KingOct 16, 2020
  55. Jeff KingOct 15, 2020
  56. 0/3 Make test selection easier by specifying description substrings instead of just numeric countersElijah Newren via GitGitGadget, Oct 16, 2020
  57. 1/3 test-lib: allow selecting tests by substring/glob with --runElijah Newren via GitGitGadget, Oct 16, 2020
  58. 3/3 test-lib: reduce verbosity of skipped testsElijah Newren via GitGitGadget, Oct 16, 2020
  59. 2/3 t6006, t6012: adjust tests to use 'setup' instead of synonymsElijah Newren via GitGitGadget, Oct 16, 2020
  60. Junio C HamanoOct 16, 2020
  61. Elijah NewrenOct 16, 2020
  62. 0/3 Make test selection easier by specifying description substrings instead of just numeric countersElijah Newren via GitGitGadget, Oct 16, 2020
  63. 2/3 t6006, t6012: adjust tests to use 'setup' instead of synonymsElijah Newren via GitGitGadget, Oct 16, 2020
  64. 3/3 test-lib: reduce verbosity of skipped testsElijah Newren via GitGitGadget, Oct 16, 2020
  65. 1/3 test-lib: allow selecting tests by substring/glob with --runElijah Newren via GitGitGadget, Oct 16, 2020
  66. Andrei RybakOct 16, 2020
  67. Elijah NewrenOct 17, 2020
  68. 0/3 Make test selection easier by specifying description substrings instead of just numeric countersElijah Newren via GitGitGadget, Oct 18, 2020
  69. 1/3 test-lib: allow selecting tests by substring/glob with --runElijah Newren via GitGitGadget, Oct 18, 2020
  70. 2/3 t6006, t6012: adjust tests to use 'setup' instead of synonymsElijah Newren via GitGitGadget, Oct 18, 2020
  71. 3/3 test-lib: reduce verbosity of skipped testsElijah Newren via GitGitGadget, Oct 18, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.