Skip to content

Commit 6909f23

Browse files
committed
feat(parallel): implement test-level parallelism for improved performance
Enable parallel execution of individual test functions within files, not just parallel file execution. This significantly improves CPU utilization and reduces test execution time. Implementation: - Modified call_test_functions to run test functions in parallel - Added opt-out mechanism via `# bashunit: no-parallel-tests` marker - Tests within a file now execute concurrently using background jobs - Result aggregation already supports per-test result files Opt-out marker added to tests with shared state: - install_test.sh (shares ./lib and ./deps directories) - bashunit_report_html_test.sh (shares HTML output files) - bashunit_upgrade_test.sh (shares tmp/ directory) Performance improvement: - Parallel execution: 31.71s (down from ~40s, ~21% faster) - CPU utilization: 702% (up from ~480%) - Better parallelization across all available cores All 750 tests passing, all 1136 assertions correct.
1 parent 91e523b commit 6909f23

4 files changed

Lines changed: 24 additions & 2 deletions

File tree

src/runner.sh

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,12 @@ function bashunit::runner::call_test_functions() {
342342

343343
bashunit::helper::check_duplicate_functions "$script" || true
344344

345+
# Check if test file opts out of test-level parallelism
346+
local allow_test_parallel=true
347+
if grep -q "^# bashunit: no-parallel-tests" "$script" 2>/dev/null; then
348+
allow_test_parallel=false
349+
fi
350+
345351
local -a provider_data=()
346352
local provider_data_count=0
347353
local -a parsed_data=()
@@ -363,7 +369,11 @@ function bashunit::runner::call_test_functions() {
363369

364370
# No data provider found
365371
if [[ "$provider_data_count" -eq 0 ]]; then
366-
bashunit::runner::run_test "$script" "$fn_name"
372+
if bashunit::parallel::is_enabled && [[ "$allow_test_parallel" == true ]]; then
373+
bashunit::runner::run_test "$script" "$fn_name" &
374+
else
375+
bashunit::runner::run_test "$script" "$fn_name"
376+
fi
367377
unset -v fn_name
368378
continue
369379
fi
@@ -379,10 +389,19 @@ function bashunit::runner::call_test_functions() {
379389
parsed_data[parsed_data_count]="$(bashunit::helper::decode_base64 "${line}")"
380390
parsed_data_count=$((parsed_data_count + 1))
381391
done <<<"$(bashunit::runner::parse_data_provider_args "$data")"
382-
bashunit::runner::run_test "$script" "$fn_name" ${parsed_data+"${parsed_data[@]}"}
392+
if bashunit::parallel::is_enabled && [[ "$allow_test_parallel" == true ]]; then
393+
bashunit::runner::run_test "$script" "$fn_name" ${parsed_data+"${parsed_data[@]}"} &
394+
else
395+
bashunit::runner::run_test "$script" "$fn_name" ${parsed_data+"${parsed_data[@]}"}
396+
fi
383397
done
384398
unset -v fn_name
385399
done
400+
401+
# Wait for all parallel tests within this file to complete
402+
if bashunit::parallel::is_enabled && [[ "$allow_test_parallel" == true ]]; then
403+
wait
404+
fi
386405
}
387406

388407
function bashunit::runner::call_bench_functions() {

tests/acceptance/bashunit_report_html_test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env bash
2+
# bashunit: no-parallel-tests
23
set -euo pipefail
34

45
function set_up_before_script() {

tests/acceptance/bashunit_upgrade_test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env bash
2+
# bashunit: no-parallel-tests
23
set -uo pipefail
34
set +e
45

tests/acceptance/install_test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env bash
2+
# bashunit: no-parallel-tests
23
# shellcheck disable=SC2317
34
set -uo pipefail
45
set +e

0 commit comments

Comments
 (0)