-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathrun_tests.sh
More file actions
executable file
·138 lines (122 loc) · 4.65 KB
/
run_tests.sh
File metadata and controls
executable file
·138 lines (122 loc) · 4.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/bash
# =============================================================================
# Enhanced Test Runner Script for Backtrader
# =============================================================================
# Description: Run pytest with parallel execution, timeout, and colored output
# Usage: ./run_tests_clean.sh [options]
# Options:
# -n NUM Number of parallel workers (default: 8)
# -t SEC Timeout per test in seconds (default: 45)
# -p PATH Test path (default: tests)
# -k EXPR Only run tests matching expression
# -v Verbose output
# -h Show this help
# =============================================================================
set -o pipefail
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
# Default configuration
WORKERS=8
TIMEOUT=45
TEST_PATH="tests"
VERBOSE=""
FILTER=""
# Parse command line arguments
while getopts "n:t:p:k:vh" opt; do
case $opt in
n) WORKERS="$OPTARG" ;;
t) TIMEOUT="$OPTARG" ;;
p) TEST_PATH="$OPTARG" ;;
k) FILTER="-k $OPTARG" ;;
v) VERBOSE="-v" ;;
h)
head -15 "$0" | tail -12
exit 0
;;
\?) echo "Invalid option: -$OPTARG" >&2; exit 1 ;;
esac
done
# Ensure we're in the correct directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR" || exit 1
# Print header
echo -e "${BLUE}============================================================${NC}"
echo -e "${CYAN}Backtrader Test Runner${NC}"
echo -e "${BLUE}============================================================${NC}"
echo -e "Test Path: ${YELLOW}$TEST_PATH${NC}"
echo -e "Workers: ${YELLOW}$WORKERS${NC}"
echo -e "Timeout: ${YELLOW}${TIMEOUT}s${NC} per test"
echo -e "Filter: ${YELLOW}${FILTER:-none}${NC}"
echo -e "${BLUE}============================================================${NC}"
# Create temp file to capture output
TEMP_OUTPUT=$(mktemp)
trap "rm -f $TEMP_OUTPUT" EXIT
# Execute tests
START_TIME=$(date +%s)
python -m pytest "$TEST_PATH" \
-n "$WORKERS" \
--timeout="$TIMEOUT" \
--timeout-method=thread \
--tb=short \
--strict-markers \
--disable-warnings \
--color=yes \
-q \
$VERBOSE \
$FILTER 2>&1 | tee "$TEMP_OUTPUT"
EXIT_CODE=${PIPESTATUS[0]}
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
# Extract statistics
FAILED_TESTS=$(grep -E "FAILED.*::" "$TEMP_OUTPUT" 2>/dev/null | wc -l | xargs)
TIMEOUT_TESTS=$(grep "Timeout >" "$TEMP_OUTPUT" 2>/dev/null | wc -l | xargs)
PASSED_TESTS=$(grep -oE "[0-9]+ passed" "$TEMP_OUTPUT" 2>/dev/null | head -1 | grep -oE "[0-9]+" | head -1)
FAILED_TESTS=${FAILED_TESTS:-0}
TIMEOUT_TESTS=${TIMEOUT_TESTS:-0}
PASSED_TESTS=${PASSED_TESTS:-0}
# Print summary
echo ""
echo -e "${BLUE}============================================================${NC}"
echo -e "${CYAN}Test Summary${NC}"
echo -e "${BLUE}============================================================${NC}"
echo -e "Duration: ${YELLOW}${DURATION}s${NC}"
echo -e "Exit Code: ${YELLOW}$EXIT_CODE${NC}"
echo -e "${BLUE}------------------------------------------------------------${NC}"
echo -e "Passed: ${GREEN}$PASSED_TESTS${NC}"
echo -e "Failed: ${RED}$FAILED_TESTS${NC}"
echo -e "Timeout: ${YELLOW}$TIMEOUT_TESTS${NC}"
echo -e "${BLUE}------------------------------------------------------------${NC}"
if [ $EXIT_CODE -eq 0 ]; then
echo -e "Status: ${GREEN}✅ ALL TESTS PASSED${NC}"
elif [ $EXIT_CODE -eq 1 ]; then
echo -e "Status: ${RED}❌ SOME TESTS FAILED${NC}"
elif [ $EXIT_CODE -eq 2 ]; then
echo -e "Status: ${YELLOW}⚠️ TEST EXECUTION INTERRUPTED${NC}"
elif [ $EXIT_CODE -eq 5 ]; then
echo -e "Status: ${YELLOW}⚠️ NO TESTS COLLECTED${NC}"
else
echo -e "Status: ${RED}❌ ERROR (code: $EXIT_CODE)${NC}"
fi
# Show failed tests if any
if [ "$FAILED_TESTS" -gt 0 ]; then
echo ""
echo -e "${BLUE}============================================================${NC}"
echo -e "${RED}Failed Tests:${NC}"
echo -e "${BLUE}============================================================${NC}"
grep -E "FAILED.*::" "$TEMP_OUTPUT" | sed 's/^/ /'
fi
# Show timeout tests if any
if [ "$TIMEOUT_TESTS" -gt 0 ]; then
echo ""
echo -e "${BLUE}============================================================${NC}"
echo -e "${YELLOW}Timeout Tests (>${TIMEOUT}s):${NC}"
echo -e "${BLUE}============================================================${NC}"
grep -B5 "Timeout >" "$TEMP_OUTPUT" | grep -E "::test_" | sed 's/^/ /' | sort -u
fi
echo -e "${BLUE}============================================================${NC}"
exit $EXIT_CODE