Necesitaba automatizar el proceso de ejecutar pruebas en Jest y obtener el coverage de un archivo específico. Creé este script para ayudarme con eso.
#!/bin/bash
# Color definitions
BLUE='\033[0;34m'
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
BOLD='\033[1m'
# Function to display usage
show_usage() {
echo -e "${YELLOW}Usage:${NC} $0 [--find-by-name] <relative-file-path> [additional test options]"
echo -e "${YELLOW}Examples:${NC}"
echo -e " $0 src/components/Button.tsx --watch"
echo -e " $0 src/components/Button.tsx --find-by-name --watch"
exit 1
}
# Initialize variables
FIND_BY_NAME=false
RELATIVE_FILE_PATH=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--find-by-name)
FIND_BY_NAME=true
shift
;;
*)
if [ -z "$RELATIVE_FILE_PATH" ]; then
RELATIVE_FILE_PATH="$1"
else
break # Stop parsing and keep remaining args for test options
fi
shift
;;
esac
done
# Check if a file name is provided
if [ -z "$RELATIVE_FILE_PATH" ]; then
show_usage
fi
# Check if the file exists
if [ ! -f "$RELATIVE_FILE_PATH" ]; then
echo -e "${RED}Error: ${NC}File '${YELLOW}${RELATIVE_FILE_PATH}${NC}' not found. 😕"
exit 1
fi
FILE_PATH=$(echo "$RELATIVE_FILE_PATH" | cut -d'/' -f3-)
# Get just the file name without extension for --find-by-name mode
FILE_NAME=$(basename "$RELATIVE_FILE_PATH")
FILE_NAME_NO_EXT="${FILE_NAME%.*}"
# Construct the corresponding test file path
TEST_FILE_NAME="${FILE_PATH%.*}.test"
if [ "$FIND_BY_NAME" = true ]; then
# Search by file name
TEST_PATH=$(find "tests" -type f \( -name "${FILE_NAME_NO_EXT}.test.tsx" -o -name "${FILE_NAME_NO_EXT}.test.ts" \))
else
# Original search by path
TEST_PATH=$(find "tests" -type f \( -path "*/${TEST_FILE_NAME}.tsx" -o -path "*/${TEST_FILE_NAME}.ts" \))
fi
# Check if the test file exists
if [ -z "$TEST_PATH" ]; then
echo -e "${RED}Error: ${NC}Test file for '${YELLOW}${RELATIVE_FILE_PATH}${NC}' not found in 'tests' directory. 😕"
echo -e "Test file name: ${YELLOW}${FILE_NAME_NO_EXT}.test.tsx${NC}"
echo -e "${YELLOW}Hint:${NC} If you're looking for a file by name, try using the --find-by-name flag."
exit 1
fi
# Print test information with styling
echo -e "\n${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}▶ Running Coverage Test${NC}"
echo -e "${CYAN}📁 Source file:${NC} ${RELATIVE_FILE_PATH}"
echo -e "${CYAN}🧪 Test file:${NC} ${TEST_PATH}"
echo -e "${CYAN}⚙️ Options:${NC} $@"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}\n"
yarn test "$TEST_PATH" --coverage --collectCoverageFrom="$RELATIVE_FILE_PATH" "$@"
Uso
Los casos de prueba están en la carpeta tests
. El script buscará el archivo de prueba por ruta de manera predeterminada. Si deseas buscar por nombre, puedes usar la bandera --find-by-name
.
# Si comparten la misma ruta
./coverage.sh src/components/Button.tsx --watch
# Si el archivo de prueba tiene una ruta diferente pero el mismo nombre
./coverage.sh src/components/Button.tsx --find-by-name --watch