4 Commits

Author SHA1 Message Date
Thomas Levine
560b55d1fb TEST_SHELL 2014-11-17 04:49:23 +00:00
Thomas Levine
6f51dd7abb more urchin -x tests 2014-11-17 04:44:51 +00:00
Thomas Levine
284077d1a1 fix the test 2014-11-16 22:40:36 +00:00
Thomas Levine
3470e4b979 moving tests 2014-11-16 22:26:54 +00:00
18 changed files with 47 additions and 92 deletions

View File

@@ -1,11 +1,6 @@
HISTORY HISTORY
------- -------
Version 0.0.5
---------------------
* urchin now unsets `CDPATH`.
* The documentation for `urchin -x` was removed because it was confusing.
Version 0.0.4 Version 0.0.4
--------------------- ---------------------
* Switch urchin -x to urchin -sh and fix some problems with it * Switch urchin -x to urchin -sh and fix some problems with it

View File

@@ -1,2 +0,0 @@
Totally different syntax and similar features, plus TAP output
https://github.com/sstephenson/bats

View File

@@ -6,7 +6,7 @@ for shell in dash bash ksh zsh; do
if which $shell > /dev/null 2> /dev/null; then if which $shell > /dev/null 2> /dev/null; then
echo echo
echo Running urchin tests in $shell echo Running urchin tests in $shell
$shell urchin -s $shell tests | tail -n 3 $shell urchin tests | tail -n 3
else else
echo echo
echo Skipping $shell because it is not in the PATH echo Skipping $shell because it is not in the PATH

View File

@@ -1,6 +1,6 @@
{ {
"name": "urchin", "name": "urchin",
"version": "0.0.5", "version": "0.0.4",
"description": "Test framework for shell", "description": "Test framework for shell",
"main": "urchin", "main": "urchin",
"directories": { "directories": {
@@ -24,9 +24,10 @@
{"name": "Thomas Levine", "email": "_@thomaslevine.com"}, {"name": "Thomas Levine", "email": "_@thomaslevine.com"},
{"name": "David Jones", "email": "drj@pobox.com"}, {"name": "David Jones", "email": "drj@pobox.com"},
{"name": "Francis Irving", "email": "francis@flourish.org"}, {"name": "Francis Irving", "email": "francis@flourish.org"},
{"name": "Zarino Zappia", "email": "mail@zarino.co.uk"}, {"name": "Zarino Zappia", "email": "mail@zarino.co.uk"}
{"name": "Tom Mortimer-Jones", "email": "tom@morty.co.uk"}, {"name": "Tom Mortimer-Jones", "email": "tom@morty.co.uk"}
{"name": "Michael Klement", "email": "mklement0@gmail.com"} {"name": "Michael Klement", "email": "mklement0@gmail.com"}
], ],
"license": "BSD" "license": "BSD",
"readmeFilename": "readme.md"
} }

View File

@@ -12,14 +12,14 @@ other Unix platforms.
Urchin's tests are written in Urchin, so you can run them to see what Urchin Urchin's tests are written in Urchin, so you can run them to see what Urchin
is like. Clone the repository is like. Clone the repository
git clone git://github.com/tlevine/urchin.git git clone git://github.com/scraperwiki/urchin.git
Run the tests Run the tests
cd urchin cd urchin
./urchin tests ./urchin tests
The above command will run the tests in your system's default The above command will run the tests in your systems default
shell, /bin/sh (on recent Ubuntu this is dash, but it could be shell, /bin/sh (on recent Ubuntu this is dash, but it could be
ksh or bash on other systems); to test urchin's cross-shell compatibility, ksh or bash on other systems); to test urchin's cross-shell compatibility,
run this: run this:
@@ -31,7 +31,7 @@ run this:
Download Urchin like so (as root) (or use npm, below): Download Urchin like so (as root) (or use npm, below):
cd /usr/local/bin cd /usr/local/bin
wget https://raw.github.com/tlevine/urchin/master/urchin wget https://raw.github.com/scraperwiki/urchin/master/urchin
chmod +x urchin chmod +x urchin
Can be installed with npm too: Can be installed with npm too:
@@ -86,15 +86,6 @@ Files are only run if they are executable, and files beginning with `.` are
ignored. Thus, fixtures and libraries can be included sloppily within the test ignored. Thus, fixtures and libraries can be included sloppily within the test
directory tree. The test passes if the file exits 0; otherwise, it fails. directory tree. The test passes if the file exits 0; otherwise, it fails.
In case you care about the order in which your tests execute, consider that
urchin looks for files within a directory in the following manner.
for file in *; do
do_something_with_test_file $file
done
Tests within a directory are executed in whatever order `*` returns.
### Writing cross-shell compatibility tests for testing shell code ### Writing cross-shell compatibility tests for testing shell code
While you could write your test scripts to explicitly invoke the functionality While you could write your test scripts to explicitly invoke the functionality
@@ -107,13 +98,6 @@ The specific approach depends on your test scenario:
#### (a) Cross-shell tests with test scripts that _invoke_ shell scripts #### (a) Cross-shell tests with test scripts that _invoke_ shell scripts
First, consider using [shall](https://github.com/mklement0/shall).
#!/usr/bin/env shall
echo This is a test file.
Alternatively, you can use urchin's built-in recognition of the
`TEST_SHELL` environment variable.
In your test scripts, invoke the shell scripts to test via the shell In your test scripts, invoke the shell scripts to test via the shell
specified in environment variable `TEST_SHELL` rather than directly; specified in environment variable `TEST_SHELL` rather than directly;
e.g.: `$TEST_SHELL ../foo bar` (rather than just `../foo bar`). e.g.: `$TEST_SHELL ../foo bar` (rather than just `../foo bar`).
@@ -154,7 +138,6 @@ To test with multiple shells in sequence, use something like:
urchin -s $shell ./tests urchin -s $shell ./tests
done done
<!--
#### (c) Cross shell tests with `urchin -x` (experimental) #### (c) Cross shell tests with `urchin -x` (experimental)
If you run urchin with the `-x` flag, it will be as if you ran If you run urchin with the `-x` flag, it will be as if you ran
`$TEST_SHELL`. Unless `$TEST_SHELL` isn't set, in which case it'll `$TEST_SHELL`. Unless `$TEST_SHELL` isn't set, in which case it'll
@@ -168,13 +151,7 @@ It might make sense if you do this.
export TEST_SHELL=zsh && urchin -x export TEST_SHELL=zsh && urchin -x
export TEST_SHELL=bash && urchin -x export TEST_SHELL=bash && urchin -x
-->
## Alternatives to Urchin ## Alternatives to Urchin
Alternatives to Urchin are discussed in Alternatives to Urchin are discussed in
[this blog post](https://blog.scraperwiki.com/2012/12/how-to-test-shell-scripts/). [this blog post](https://blog.scraperwiki.com/2012/12/how-to-test-shell-scripts/).
## Ideas for new features
* Support [Nagios plugins](https://nagios-plugins.org/doc/guidelines.html)
* Stop running if a test fails so one can use Urchin as a
[setup framework](https://github.com/tlevine/urchin/issues/16).

View File

@@ -1 +0,0 @@
false

View File

@@ -1 +0,0 @@
false

View File

@@ -1 +0,0 @@
false

View File

@@ -1,6 +0,0 @@
#!/bin/sh
cd ..
export CDPATH=$PWD
./urchin -f 'tests/urchin exit code' >/dev/null

View File

@@ -0,0 +1,4 @@
#! ../../../urchin -x
running=$(ps -o comm= -p $$ && :)
echo "Running shell: $running"
[ "$running" = bash ]

View File

@@ -0,0 +1,3 @@
#!/bin/sh
export TEST_SHELL=/bin/zsh
echo '[ "$TEST_SHELL" = /bin/zsh ] ; exit $?' | ../../urchin -x

View File

@@ -0,0 +1,3 @@
#!/bin/sh
test c = $(../../urchin -x .print-arg-3 a 'b b b b' c d e)

View File

@@ -0,0 +1,3 @@
#!/bin/sh
export TEST_SHELL=/bin/zsh
echo 'test -n "$ZSH_VERSION"; exit $?' | ../../urchin -x

View File

@@ -0,0 +1,3 @@
#!/bin/sh
export TEST_SHELL=/bin/bash
../../urchin .test-urchin-x

View File

@@ -1,11 +0,0 @@
tmp=$(mktemp)
../urchin -e -f ./.die-on-fail > $tmp
result=$?
grep '1 should run.' $tmp
grep '2 should run.' $tmp
grep -v '3 should not run.' $tmp
grep -v '4 should not run.' $tmp
rm $tmp
exit $result

54
urchin
View File

@@ -1,9 +1,5 @@
#!/bin/sh #!/bin/sh
# Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably - notably, it can produce output,
# which breaks fullpath().
unset CDPATH
fullpath() { fullpath() {
( (
cd -- "$1" cd -- "$1"
@@ -47,13 +43,6 @@ recurse() {
# $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" 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_dir ] && [ -x teardown_dir ] && ./teardown_dir >> "$stdout_file"
return 1
fi
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file" [ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
done done
@@ -74,6 +63,7 @@ recurse() {
fi fi
exit_code="$?" exit_code="$?"
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file" [ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
indent $indent_level indent $indent_level
@@ -92,10 +82,6 @@ recurse() {
cat "$stdout_file" cat "$stdout_file"
printf '\033[0m' printf '\033[0m'
fi fi
if $exit_on_fail && test 0 -ne $exit_code; then
return 1
fi
fi fi
[ $indent_level -eq 0 ] && rm "$stdout_file" [ $indent_level -eq 0 ] && rm "$stdout_file"
} }
@@ -109,22 +95,19 @@ has_sh_or_no_shebang_line() {
USAGE="usage: $0 [<options>] <test directory>" USAGE="usage: $0 [<options>] <test directory>"
urchin_help() { urchin_help() {
cat <<EOF echo
echo "$USAGE"
$USAGE echo
echo '-s <shell> Invoke test scripts that either have no shebang line or'
-s <shell> Invoke test scripts that either have no shebang line at all or echo ' shebang line "#!/bin/sh" with the specified shell.'
have shebang line "#!/bin/sh" with the specified shell. echo '-f Force running even if the test directory'\''s name does not'
-e Stop running if any single test fails. This is helpful if you want echo ' contain the word "test".'
to use Urchin to run things other than tests, such as a set of echo '-x Run "$TEST_SHELL", falling back on /bin/sh. This might be'
configuration scripts. echo ' useful in the shebang line (experimental).'
-f Force running even if the test directory's name does not echo '-h This help.'
contain the word "test". echo
-h This help. echo 'Go to https://github.com/tlevine/urchin for documentation on writing tests.'
echo
Go to https://github.com/tlevine/urchin for documentation on writing tests.
EOF
} }
plural () { plural () {
@@ -183,17 +166,22 @@ urchin_molly_guard() {
shell_for_sh_tests= shell_for_sh_tests=
force=false force=false
exit_on_fail=false
while [ $# -gt 0 ] while [ $# -gt 0 ]
do do
case "$1" in case "$1" in
-e) exit_on_fail=true;;
-f) force=true;; -f) force=true;;
-s) -s)
shift shift
shell_for_sh_tests=$1 shell_for_sh_tests=$1
which "$shell_for_sh_tests" >/dev/null || { echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2; urchin_help >&2; exit 2; } which "$shell_for_sh_tests" >/dev/null || { echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2; urchin_help >&2; exit 2; }
;; ;;
-x) # `urchin -sh` is equivalent to "$TEST_SHELL"
shift
#current_shell=$(ps -o comm= -p $$ && :)
#urchinsh=${TEST_SHELL:-$current_shell}
export TEST_SHELL=${TEST_SHELL:-/bin/sh}
"$TEST_SHELL" "$@"
exit $?;;
-h|--help) urchin_help -h|--help) urchin_help
exit 0;; exit 0;;
-*) urchin_help >&2 -*) urchin_help >&2