I'm using Bats (Bash Automated Testing System) to automate some bash unit testing. Some of these bash tests might hang forever, so I want some global timeout on my tests. I want to achieve this in my .bats
file.
I'm trying set a timeout on all of my tests in my .bats
file. I read the documentation provided by the bats wiki and found the $BATS_TEST_TIMEOUT
variable, which is exactly what I need. I set the variable in my setup_file()
as follows:
setup_file(){
BATS_TEST_TIMEOUT=5
}
@test "Dummy Loop test" {
./loop.sh
}
but my dummy infinite loop test still ran forever. Blocked by this, I tried setting other variables, like $BATS_TEST_RETRIES, and that didn't work either. I've drawn the conclusion that I must be setting them incorrectly somehow. Any ideas?
Those variables must be set in the environment of the bats
process itself, so you can:
export BATS_TEST_TIMEOUT=5
bats .
Or:
BATS_TEST_TIMEOUT=5 bats .
Etc.
For example, given this test in mytest.bats
:
@test "Dummy sleep test" {
sleep 30
}
If I run bats
like this:
BATS_TEST_TIMEOUT=5 bats .
I see:
./mytest.bats
✗ Dummy sleep test [timeout: 5s]
(in test file ./mytest.bats, line 6)
`sleep 30' failed due to timeout
Terminated
1 test, 0 failures, 1 timed out
If you don't want to have to set this every time, add some sort of run-tests.sh
script to your project that sets whatever variables you want and then calls bats
.