14 Commits

Author SHA1 Message Date
Thomas Levine
dc0a030f71 change tests that need series flag to be series 2016-02-26 17:28:04 +00:00
Thomas Levine
41a63f003c better waiting 2016-02-26 17:27:14 +00:00
Thomas Levine
aa05b95715 add wait and stuff still works 2016-02-26 17:17:00 +00:00
Thomas Levine
c611667152 add --b, --series parser 2016-02-26 16:54:25 +00:00
Thomas Levine
80ebf28da9 test skipping idea 2016-02-26 16:39:53 +00:00
Thomas Levine
3f0e925975 move molly-guard change from todo to history 2016-02-26 16:26:22 +00:00
Thomas Levine
43674f12e2 more accepting molly-guard 2016-02-26 16:23:41 +00:00
Thomas Levine
9bb1366549 simpler truth test 2016-02-26 16:19:32 +00:00
Thomas Levine
643a1bf576 test a more accepting molly-guard 2016-02-26 16:18:49 +00:00
Thomas Levine
08ea7bb88f specify version in readme 2016-02-26 16:14:54 +00:00
Thomas Levine
e5ada4899a task runner ideas 2016-02-26 15:57:21 +00:00
Thomas Levine
c818033faa list alternatives 2016-02-14 16:38:02 +00:00
Thomas Levine
88572b6c90 to support single file runs 2016-02-14 07:44:07 +00:00
Thomas Levine
3e5e7334e8 sourcing idea 2016-02-11 20:18:35 +00:00
12 changed files with 104 additions and 26 deletions

View File

@@ -1,6 +1,13 @@
HISTORY HISTORY
======= =======
Version 0.0.7
---------------------
The Molly-guard is now more accepting. For example, you no longer need to
pass -f in this case: https://github.com/creationix/nvm/issues/357
Version 0.0.6 Version 0.0.6
--------------------- ---------------------

57
TODO
View File

@@ -1,12 +1,17 @@
Things I want Things I want
============= =============
Molly guard Skip tests
------------- -------------
The Molly-guard should be more accepting so that people don't have to use it I want tests to be able to decide to skip themselves. For example, if a test
all the time and thus get used to using it. For example, you shouldn't need to requires some dependancy, it might look for the dependency and then skip if it
pass -f in this case. does not see the dependency. It might look like this.
https://github.com/creationix/nvm/issues/357
#!/bin/sh
if which parallel > /dev/null; then
exit 3 # status code 3 for skip
fi
parallel blah blah ...
Test speed Test speed
------------- -------------
@@ -115,3 +120,45 @@ Nagios plugins
It would be cool to run Nagios plugins with Urchin. This is already possible, It would be cool to run Nagios plugins with Urchin. This is already possible,
actually, but it might be worth giving some special thought to it. actually, but it might be worth giving some special thought to it.
https://nagios-plugins.org/doc/guidelines.html https://nagios-plugins.org/doc/guidelines.html
Source setup and teardown
--------------------
If setup and teardown are sourced instead of executed, maybe we can more
cleanly create and teardown temporary files.
(
. ./setup
./$thetestfile
. ./teardown
)
On the other hand, this could just be sourced explicitly in the test file,
without the special setup and teardown feature.
Run on a file
----------------
Presently you can run urchin only on a directory.
It would be neat if you could run it on a file as well.
This occurred to me when I wanted to run
urchin test/fast/Unit\ tests/nvm_ls_current
on the nvm tests. I wound up running this instead.
urchin test/fast/Unit\ tests/ | grep nvm_ls_current
The Molly guard would be assessed, and the corresponding setup, setup_dir,
teardown, and teardown_dir files would be run in the appropriate order.
Running automated tasks
-------------------------
Urchin might be appropriate for if you have lots of tasks that you want to run
periodically; add an urchin call to your crontab, and call all of your other
tasks with urchin. Here are some features that might make urchin better for
this sort of thing.
* Time how long each test/job takes
* Optionally kill tests/jobs after a specific timeout threshold
* Send output of different tests/jobs to different files for each file
descriptor (STDOUT, STDERR)

View File

@@ -1,2 +1,9 @@
Totally different syntax and similar features, plus TAP output Totally different syntax and similar features, plus TAP output
https://github.com/sstephenson/bats https://github.com/sstephenson/bats
Relatively similar interface
https://github.com/mlafeldt/sharness
Lists of alternatives
https://thomaslevine.com/!/shell-testing/
https://github.com/mlafeldt/sharness#alternatives

View File

@@ -36,7 +36,7 @@ Urchin is contained in a single file, so you can install it by copying it to a
directory in your `PATH`. For example, you can run the following as root. directory in your `PATH`. For example, you can run the following as root.
cd /usr/local/bin cd /usr/local/bin
wget https://raw.github.com/tlevine/urchin/master/urchin wget https://raw.githubusercontent.com/tlevine/urchin/v0.0.6/urchin
chmod +x urchin chmod +x urchin
Urchin can be installed with npm too. Urchin can be installed with npm too.

View File

@@ -1,5 +1,5 @@
tmp=$(mktemp) tmp=$(mktemp)
../urchin -e -f ./.die-on-fail > $tmp ../urchin -e -b -f ./.die-on-fail > $tmp
result=$? result=$?
grep '1 should run.' $tmp grep '1 should run.' $tmp

View File

@@ -1,4 +1,4 @@
tmp=$(mktemp) tmp=$(mktemp)
../../urchin -t .testsuite/ | sed 1d > $tmp ../../urchin -b -t .testsuite/ | sed 1d > $tmp
diff $tmp .expected-output diff $tmp .expected-output

View File

@@ -1,3 +1,5 @@
#!/bin/sh #!/bin/sh
! ../../urchin ./.chainsaw tmp=$(mktemp -d)/blah
echo '#!/usr/bin/env true' > $tmp
! ../../urchin $tmp

38
urchin
View File

@@ -67,17 +67,23 @@ recurse() {
[ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file" [ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file"
# $2 instead of $indent_level so it doesn't clash # $2 instead of $indent_level so it doesn't clash
recurse "${test}" $(( $2 + 1 )) "$shell_for_sh_tests" (
exit_code=$? recurse "${test}" $(( $2 + 1 )) "$shell_for_sh_tests"
exit_code=$?
if $exit_on_fail && test $exit_code -ne 0; then
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file" [ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
[ -f teardown_dir ] && [ -x teardown_dir ] && ./teardown_dir >> "$stdout_file" exit $exit_code
return 1 ) &
fi
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file" if $single_process; then
wait $!
exit_code=$?
if $exit_on_fail && test $exit_code -ne 0; then
[ -f teardown_dir ] && [ -x teardown_dir ] && ./teardown_dir >> "$stdout_file"
return 1
fi
fi
done done
wait
[ -f teardown_dir ] && [ -x teardown_dir ] && ./teardown_dir >> "$stdout_file" [ -f teardown_dir ] && [ -x teardown_dir ] && ./teardown_dir >> "$stdout_file"
) )
if $tap_format; then if $tap_format; then
@@ -98,6 +104,7 @@ recurse() {
else else
TEST_SHELL="$TEST_SHELL" ./"$potential_test" > "$stdout_file" 2>&1 TEST_SHELL="$TEST_SHELL" ./"$potential_test" > "$stdout_file" 2>&1
fi fi
exit_code="$?" exit_code="$?"
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file" [ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
@@ -182,6 +189,8 @@ $USAGE
-s <shell> Invoke test scripts that either have no shebang line at all or -s <shell> Invoke test scripts that either have no shebang line at all or
have shebang line "#!/bin/sh" with the specified shell. have shebang line "#!/bin/sh" with the specified shell.
-b, --series Run all tests in series in a single process. The default
is to run tests from the same directory in parallel.
-e Stop running if any single test fails. This is helpful if you want -e Stop running if any single test fails. This is helpful if you want
to use Urchin to run things other than tests, such as a set of to use Urchin to run things other than tests, such as a set of
configuration scripts. configuration scripts.
@@ -267,6 +276,7 @@ urchin_molly_guard() {
exit 1 exit 1
} }
single_process=false
shell_for_sh_tests= shell_for_sh_tests=
force=false force=false
exit_on_fail=false exit_on_fail=false
@@ -274,6 +284,7 @@ tap_format=false
while [ $# -gt 0 ] while [ $# -gt 0 ]
do do
case "$1" in case "$1" in
-b|--series) single_process=true;;
-e) exit_on_fail=true;; -e) exit_on_fail=true;;
-f) force=true;; -f) force=true;;
-s) -s)
@@ -282,7 +293,7 @@ do
which "$shell_for_sh_tests" > /dev/null || { which "$shell_for_sh_tests" > /dev/null || {
echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2 echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2
urchin_help >&2 urchin_help >&2
exit 2 exit 3
} ;; } ;;
-t) tap_format=true;; -t) tap_format=true;;
-h|--help) urchin_help -h|--help) urchin_help
@@ -301,7 +312,12 @@ if [ "$#" != '1' ] || [ ! -d "$1" ]
then then
[ -n "$1" ] && [ ! -d "$1" ] && echo "Not a directory: '$1'" >&2 [ -n "$1" ] && [ ! -d "$1" ] && echo "Not a directory: '$1'" >&2
echo "$USAGE" >&2 echo "$USAGE" >&2
exit 2 exit 3
fi
if $exit_on_fail && ! $single_process; then
echo 'You must specify -b/--series in order to use -e.' >&2
exit 3
fi fi
# Constants # Constants
@@ -309,7 +325,7 @@ logfile=$(fullpath "$1")/.urchin.log
stdout_file=$(fullpath "$1")/.urchin_stdout stdout_file=$(fullpath "$1")/.urchin_stdout
# Run or present the Molly guard. # Run or present the Molly guard.
if basename "$(fullpath "$1")" | grep -Fi 'test' > /dev/null || $force if fullpath "$1" | grep -Fi 'test' > /dev/null || $force
then then
urchin_go "$1" "$shell_for_sh_tests" urchin_go "$1" "$shell_for_sh_tests"
else else