mirror of
https://github.com/sstephenson/bats.git
synced 2024-11-17 11:42:33 +01:00
Added the todo command for marking tests that may fail as passing, potentially (in pretty print) as a "bonus" if they pass.
This commit is contained in:
parent
03608115df
commit
6b7c9787ca
|
@ -2,7 +2,7 @@
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
version() {
|
version() {
|
||||||
echo "Bats 0.4.0"
|
echo "Bats 0.5.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
|
|
|
@ -79,6 +79,10 @@ skip() {
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
todo() {
|
||||||
|
BATS_TEST_TODO=${1:-1}
|
||||||
|
}
|
||||||
|
|
||||||
bats_test_begin() {
|
bats_test_begin() {
|
||||||
BATS_TEST_DESCRIPTION="$1"
|
BATS_TEST_DESCRIPTION="$1"
|
||||||
if [ -n "$BATS_EXTENDED_SYNTAX" ]; then
|
if [ -n "$BATS_EXTENDED_SYNTAX" ]; then
|
||||||
|
@ -240,27 +244,34 @@ bats_teardown_trap() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bats_exit_trap() {
|
bats_exit_trap() {
|
||||||
local status
|
local status=0
|
||||||
local skipped
|
local skipped=""
|
||||||
|
local todo=""
|
||||||
|
local fail_status=1
|
||||||
trap - err exit
|
trap - err exit
|
||||||
|
|
||||||
skipped=""
|
|
||||||
if [ -n "$BATS_TEST_SKIPPED" ]; then
|
if [ -n "$BATS_TEST_SKIPPED" ]; then
|
||||||
|
fail_status=0
|
||||||
skipped=" # skip"
|
skipped=" # skip"
|
||||||
if [ "1" != "$BATS_TEST_SKIPPED" ]; then
|
if [ "1" != "$BATS_TEST_SKIPPED" ]; then
|
||||||
skipped+=" ($BATS_TEST_SKIPPED)"
|
skipped+=" ($BATS_TEST_SKIPPED)"
|
||||||
fi
|
fi
|
||||||
|
elif [ -n "$BATS_TEST_TODO" ]; then
|
||||||
|
fail_status=0
|
||||||
|
todo=" # todo"
|
||||||
|
if [ "1" != "$BATS_TEST_TODO" ]; then
|
||||||
|
todo+=" $BATS_TEST_TODO"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$BATS_TEST_COMPLETED" ] || [ -z "$BATS_TEARDOWN_COMPLETED" ]; then
|
if [ -z "$BATS_TEST_COMPLETED" ] || [ -z "$BATS_TEARDOWN_COMPLETED" ]; then
|
||||||
echo "not ok $BATS_TEST_NUMBER $BATS_TEST_DESCRIPTION" >&3
|
echo "not ok ${BATS_TEST_NUMBER} ${BATS_TEST_DESCRIPTION}${todo}" >&3
|
||||||
bats_print_stack_trace "${BATS_ERROR_STACK_TRACE[@]}" >&3
|
bats_print_stack_trace "${BATS_ERROR_STACK_TRACE[@]}" >&3
|
||||||
bats_print_failed_command "${BATS_ERROR_STACK_TRACE[${#BATS_ERROR_STACK_TRACE[@]}-1]}" "$BATS_ERROR_STATUS" >&3
|
bats_print_failed_command "${BATS_ERROR_STACK_TRACE[${#BATS_ERROR_STACK_TRACE[@]}-1]}" "$BATS_ERROR_STATUS" >&3
|
||||||
sed -e "s/^/# /" < "$BATS_OUT" >&3
|
sed -e "s/^/# /" < "$BATS_OUT" >&3
|
||||||
status=1
|
status="$fail_status"
|
||||||
else
|
else
|
||||||
echo "ok ${BATS_TEST_NUMBER}${skipped} ${BATS_TEST_DESCRIPTION}" >&3
|
echo "ok ${BATS_TEST_NUMBER}${skipped} ${BATS_TEST_DESCRIPTION}${todo}" >&3
|
||||||
status=0
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f "$BATS_OUT"
|
rm -f "$BATS_OUT"
|
||||||
|
|
|
@ -64,6 +64,14 @@ log() {
|
||||||
clear_color
|
clear_color
|
||||||
}
|
}
|
||||||
|
|
||||||
|
todone() {
|
||||||
|
local reason="$1"
|
||||||
|
[ -z "$reason" ] || reason=": $reason"
|
||||||
|
go_to_column 0
|
||||||
|
printf " ✓ %s ✭ DONE%s" "$name" "$reason"
|
||||||
|
advance
|
||||||
|
}
|
||||||
|
|
||||||
summary() {
|
summary() {
|
||||||
printf "\n%d test%s" "$count" "$(plural "$count")"
|
printf "\n%d test%s" "$count" "$(plural "$count")"
|
||||||
|
|
||||||
|
@ -145,16 +153,24 @@ while IFS= read -r line; do
|
||||||
;;
|
;;
|
||||||
"ok "* )
|
"ok "* )
|
||||||
skip_expr="ok $index # skip (\(([^)]*)\))?"
|
skip_expr="ok $index # skip (\(([^)]*)\))?"
|
||||||
|
todo_expr="ok $index .*# todo([[:space:]]+(.+))?"
|
||||||
if [[ "$line" =~ $skip_expr ]]; then
|
if [[ "$line" =~ $skip_expr ]]; then
|
||||||
let skipped+=1
|
let skipped+=1
|
||||||
buffer skip "${BASH_REMATCH[2]}"
|
buffer skip "${BASH_REMATCH[2]}"
|
||||||
|
elif [[ "$line" =~ $todo_expr ]]; then
|
||||||
|
buffer todone "${BASH_REMATCH[2]}"
|
||||||
else
|
else
|
||||||
buffer pass
|
buffer pass
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
"not ok "* )
|
"not ok "* )
|
||||||
|
todo_expr="ok $index .*# todo([[:space:]]+(.+))?"
|
||||||
|
if [[ "$line" =~ $todo_expr ]]; then
|
||||||
|
buffer pass
|
||||||
|
else
|
||||||
let failures+=1
|
let failures+=1
|
||||||
buffer fail
|
buffer fail
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
"# "* )
|
"# "* )
|
||||||
buffer log "${line:2}"
|
buffer log "${line:2}"
|
||||||
|
|
|
@ -110,6 +110,41 @@ Or you can skip conditionally:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
THE TODO COMMAND
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Tests can be marked as TODO by using the `todo` command at the point in a test before it completes.
|
||||||
|
|
||||||
|
A passing test marked with TODO should be considered a "bonus", but both pass and fail are considered successful.
|
||||||
|
|
||||||
|
See [the TAP specification](http://testanything.org/tap-specification.html) for more details on this feature.
|
||||||
|
|
||||||
|
@test "A test that may fail" {
|
||||||
|
todo
|
||||||
|
run foo
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
}
|
||||||
|
|
||||||
|
Optionally, you may include a reason for marking TODO:
|
||||||
|
|
||||||
|
@test "A test that may fail" {
|
||||||
|
todo "This command will return zero soon, but not now"
|
||||||
|
run foo
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
}
|
||||||
|
|
||||||
|
Or you can mark todo conditionally:
|
||||||
|
|
||||||
|
@test "A test which usually fails on a mac" {
|
||||||
|
if [ $(uname -s) == Darwin ]; then
|
||||||
|
todo "Get this working on a Mac"
|
||||||
|
fi
|
||||||
|
|
||||||
|
run foo
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SETUP AND TEARDOWN FUNCTIONS
|
SETUP AND TEARDOWN FUNCTIONS
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
|
|
@ -262,3 +262,29 @@ fixtures bats
|
||||||
[ $status -eq 0 ]
|
[ $status -eq 0 ]
|
||||||
[ "${lines[1]}" = "ok 1 loop_func" ]
|
[ "${lines[1]}" = "ok 1 loop_func" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "empty passing todo" {
|
||||||
|
run bats -p "$FIXTURE_ROOT/todo_empty_passing.bats"
|
||||||
|
[ $status -eq 0 ]
|
||||||
|
[[ "${lines[0]}" =~ "✭ DONE" ]]
|
||||||
|
[ "${lines[2]}" = "1 test, 0 failures" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "empty failing todo" {
|
||||||
|
run bats -p "$FIXTURE_ROOT/todo_empty_failing.bats"
|
||||||
|
[ $status -eq 0 ]
|
||||||
|
[ "${lines[4]}" = "1 test, 0 failures" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "passing todo with reason" {
|
||||||
|
run bats -p "$FIXTURE_ROOT/todo_reason_passing.bats"
|
||||||
|
[ $status -eq 0 ]
|
||||||
|
[[ "${lines[0]}" =~ "✭ DONE" ]]
|
||||||
|
[ "${lines[2]}" = "1 test, 0 failures" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "failing todo with reason" {
|
||||||
|
run bats -p "$FIXTURE_ROOT/todo_reason_failing.bats"
|
||||||
|
[ $status -eq 0 ]
|
||||||
|
[ "${lines[4]}" = "1 test, 0 failures" ]
|
||||||
|
}
|
||||||
|
|
4
test/fixtures/bats/todo_empty_failing.bats
vendored
Normal file
4
test/fixtures/bats/todo_empty_failing.bats
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
@test "Flaky failing test no reason" {
|
||||||
|
todo
|
||||||
|
false
|
||||||
|
}
|
4
test/fixtures/bats/todo_empty_passing.bats
vendored
Normal file
4
test/fixtures/bats/todo_empty_passing.bats
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
@test "Flaky passing test no reason" {
|
||||||
|
todo
|
||||||
|
true
|
||||||
|
}
|
4
test/fixtures/bats/todo_reason_failing.bats
vendored
Normal file
4
test/fixtures/bats/todo_reason_failing.bats
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
@test "Flaky failing test with reason" {
|
||||||
|
todo "some really good reason"
|
||||||
|
false
|
||||||
|
}
|
4
test/fixtures/bats/todo_reason_passing.bats
vendored
Normal file
4
test/fixtures/bats/todo_reason_passing.bats
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
@test "Flaky passing test with reason" {
|
||||||
|
todo "some really good reason"
|
||||||
|
true
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user