Add standalone HoneyDueAPITests target for pure-API suites
Split the pure-API integration tests (no UI) out of the UITest target into a dedicated standalone unit-test target that runs in seconds without launching the simulator app. - HoneyDueAPITests target: standalone unit-test bundle (no TEST_HOST — touches no app code), shares the API client/seeder/cleaner support files from the UITest target via explicit references, with its own shared scheme. - MultiUserSharingTests -> HoneyDueAPITests/SharingAPITests.swift (18 tests). Runs in ~2.3s vs. ~40-140s per UI test. - run_ui_tests.sh: new Phase 1b runs the API target (fast) between Seed and the parallel UI phase; the helper now takes a scheme so each phase targets the right one; summary reports the API result. Both targets build green; SharingAPITests passes (18/18) against the live stack. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+41
-24
@@ -1,17 +1,18 @@
|
||||
#!/bin/bash
|
||||
# run_ui_tests.sh — Phased UI test runner.
|
||||
# run_ui_tests.sh — Phased test runner for the HoneyDue iOS suites.
|
||||
#
|
||||
# Architecture: every test mints its OWN isolated Kratos account (see
|
||||
# Architecture: every UI test mints its OWN isolated Kratos account (see
|
||||
# Core/Fixtures/TestAccount.swift + AuthenticatedUITestCase), so suites are
|
||||
# fully independent and the parallel phase scales to many workers with no
|
||||
# cross-suite data races. There is no per-suite ordering and no Suite6
|
||||
# special-casing anymore.
|
||||
# cross-suite data races. Pure-API tests live in a separate standalone target
|
||||
# (HoneyDueAPITests) that runs in seconds without launching the app.
|
||||
#
|
||||
# Phases:
|
||||
# 0. Smoke gate — fast launch/login sanity. Abort the run if it fails.
|
||||
# 1. Seed — ensure baseline accounts exist (AAA_SeedTests).
|
||||
# 2. Parallel — the WHOLE target minus the four phase-managed suites, via
|
||||
# -skip-testing. New suites are auto-included (no hand-
|
||||
# 1b. API — standalone HoneyDueAPITests (no app launch; ~seconds).
|
||||
# 2. Parallel — the WHOLE UI target minus the four phase-managed suites,
|
||||
# via -skip-testing. New suites are auto-included (no hand-
|
||||
# maintained list to drift), run at $WORKERS workers.
|
||||
# 3. Sweep — clear-all-data + delete leaked uit_* Kratos identities
|
||||
# (SuiteZZ_CleanupTests). Non-blocking.
|
||||
@@ -23,12 +24,14 @@
|
||||
# ./run_ui_tests.sh --skip-cleanup # skip phase 3
|
||||
# ./run_ui_tests.sh --only-parallel # only phase 2
|
||||
# ./run_ui_tests.sh --smoke # only phase 0
|
||||
# ./run_ui_tests.sh --only-api # only phase 1b
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT="$SCRIPT_DIR/honeyDue.xcodeproj"
|
||||
SCHEME="HoneyDueUITests"
|
||||
API_SCHEME="HoneyDueAPITests"
|
||||
TARGET="HoneyDueUITests"
|
||||
DESTINATION="platform=iOS Simulator,name=iPhone 17 Pro"
|
||||
WORKERS=8
|
||||
@@ -41,11 +44,7 @@ PHASE_MANAGED=(
|
||||
"$TARGET/AppLaunchUITests"
|
||||
)
|
||||
|
||||
SKIP_SEED=false
|
||||
SKIP_CLEANUP=false
|
||||
ONLY_PARALLEL=false
|
||||
ONLY_SMOKE=false
|
||||
|
||||
SKIP_SEED=false; SKIP_CLEANUP=false; ONLY_PARALLEL=false; ONLY_SMOKE=false; ONLY_API=false
|
||||
POSITIONAL_ARGS=()
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
@@ -53,6 +52,7 @@ for arg in "$@"; do
|
||||
--skip-cleanup) SKIP_CLEANUP=true ;;
|
||||
--only-parallel) ONLY_PARALLEL=true; SKIP_SEED=true; SKIP_CLEANUP=true ;;
|
||||
--smoke) ONLY_SMOKE=true ;;
|
||||
--only-api) ONLY_API=true ;;
|
||||
*) POSITIONAL_ARGS+=("$arg") ;;
|
||||
esac
|
||||
done
|
||||
@@ -66,11 +66,12 @@ mkdir -p "$RESULTS_DIR" "$DERIVED_DATA"
|
||||
BOLD='\033[1m'; GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[0;33m'; RESET='\033[0m'
|
||||
phase_header() { echo ""; echo -e "${BOLD}════════════════════════════════════════════════════${RESET}"; echo -e "${BOLD} $1${RESET}"; echo -e "${BOLD}════════════════════════════════════════════════════${RESET}"; echo ""; }
|
||||
|
||||
# run_xcodebuild <result-name> <scheme> [extra xcodebuild args...]
|
||||
run_xcodebuild() {
|
||||
local result_path="$RESULTS_DIR/$1.xcresult"; shift
|
||||
local result_path="$RESULTS_DIR/$1.xcresult"; local scheme="$2"; shift 2
|
||||
rm -rf "$result_path"
|
||||
xcodebuild test \
|
||||
-project "$PROJECT" -scheme "$SCHEME" -destination "$DESTINATION" \
|
||||
-project "$PROJECT" -scheme "$scheme" -destination "$DESTINATION" \
|
||||
-derivedDataPath "$DERIVED_DATA" -resultBundlePath "$result_path" \
|
||||
"$@" 2>&1 | tail -40
|
||||
return ${PIPESTATUS[0]}
|
||||
@@ -78,16 +79,20 @@ run_xcodebuild() {
|
||||
|
||||
OVERALL_START=$(date +%s)
|
||||
|
||||
# ── Phase 1b only ──────────────────────────────────────────────
|
||||
if [ "$ONLY_API" = true ]; then
|
||||
phase_header "API tests (standalone)"
|
||||
run_xcodebuild "API" "$API_SCHEME" && exit 0 || exit 1
|
||||
fi
|
||||
|
||||
# ── Phase 0: Smoke gate ────────────────────────────────────────
|
||||
if [ "$ONLY_PARALLEL" = false ]; then
|
||||
phase_header "Phase 0: Smoke gate"
|
||||
if run_xcodebuild "Smoke" \
|
||||
-only-testing:"$TARGET/SmokeUITests" \
|
||||
-only-testing:"$TARGET/AppLaunchUITests"; then
|
||||
if run_xcodebuild "Smoke" "$SCHEME" \
|
||||
-only-testing:"$TARGET/SmokeUITests" -only-testing:"$TARGET/AppLaunchUITests"; then
|
||||
echo -e "${GREEN}✓ Smoke passed${RESET}"
|
||||
else
|
||||
echo -e "${RED}✗ Smoke FAILED — aborting (app can't launch/log in).${RESET}"
|
||||
exit 1
|
||||
echo -e "${RED}✗ Smoke FAILED — aborting (app can't launch/log in).${RESET}"; exit 1
|
||||
fi
|
||||
[ "$ONLY_SMOKE" = true ] && exit 0
|
||||
fi
|
||||
@@ -95,19 +100,30 @@ fi
|
||||
# ── Phase 1: Seed ──────────────────────────────────────────────
|
||||
if [ "$SKIP_SEED" = false ]; then
|
||||
phase_header "Phase 1: Seed baseline accounts"
|
||||
if run_xcodebuild "Seed" -only-testing:"$TARGET/AAA_SeedTests"; then
|
||||
if run_xcodebuild "Seed" "$SCHEME" -only-testing:"$TARGET/AAA_SeedTests"; then
|
||||
echo -e "${GREEN}✓ Seed passed${RESET}"
|
||||
else
|
||||
echo -e "${RED}✗ Seed FAILED — aborting.${RESET}"; exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── Phase 2: Parallel (whole target minus phase-managed) ───────
|
||||
phase_header "Phase 2: Parallel suite ($WORKERS workers)"
|
||||
# ── Phase 1b: API contract tests (fast, standalone) ────────────
|
||||
API_PASSED=true
|
||||
if [ "$ONLY_PARALLEL" = false ]; then
|
||||
phase_header "Phase 1b: API tests (standalone bundle, no app launch)"
|
||||
if run_xcodebuild "API" "$API_SCHEME"; then
|
||||
echo -e "${GREEN}✓ API tests passed${RESET}"
|
||||
else
|
||||
API_PASSED=false; echo -e "${RED}✗ API tests FAILED${RESET}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── Phase 2: Parallel (whole UI target minus phase-managed) ────
|
||||
phase_header "Phase 2: Parallel UI suite ($WORKERS workers)"
|
||||
SKIP_ARGS=()
|
||||
for t in "${PHASE_MANAGED[@]}"; do SKIP_ARGS+=( -skip-testing:"$t" ); done
|
||||
PARALLEL_START=$(date +%s)
|
||||
if run_xcodebuild "Parallel" \
|
||||
if run_xcodebuild "Parallel" "$SCHEME" \
|
||||
-only-testing:"$TARGET" "${SKIP_ARGS[@]}" \
|
||||
-parallel-testing-enabled YES -parallel-testing-worker-count "$WORKERS"; then
|
||||
PARALLEL_PASSED=true; echo -e "${GREEN}✓ Parallel phase passed${RESET}"
|
||||
@@ -119,7 +135,7 @@ PARALLEL_END=$(date +%s)
|
||||
# ── Phase 3: Sweep ─────────────────────────────────────────────
|
||||
if [ "$SKIP_CLEANUP" = false ]; then
|
||||
phase_header "Phase 3: Sweep leaked accounts + data"
|
||||
if run_xcodebuild "Sweep" -only-testing:"$TARGET/SuiteZZ_CleanupTests"; then
|
||||
if run_xcodebuild "Sweep" "$SCHEME" -only-testing:"$TARGET/SuiteZZ_CleanupTests"; then
|
||||
echo -e "${GREEN}✓ Sweep passed${RESET}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠ Sweep failed (non-blocking)${RESET}"
|
||||
@@ -130,9 +146,10 @@ fi
|
||||
phase_header "Summary"
|
||||
echo " Total time: $(( $(date +%s) - OVERALL_START ))s"
|
||||
echo " Parallel: $(( PARALLEL_END - PARALLEL_START ))s @ $WORKERS workers"
|
||||
echo " API tests: $([ "$API_PASSED" = true ] && echo passed || echo FAILED)"
|
||||
echo " Results: $RESULTS_DIR/"
|
||||
echo ""
|
||||
if [ "${PARALLEL_PASSED:-false}" = true ]; then
|
||||
if [ "${PARALLEL_PASSED:-false}" = true ] && [ "$API_PASSED" = true ]; then
|
||||
echo -e " ${GREEN}${BOLD}ALL TESTS PASSED${RESET}"; exit 0
|
||||
else
|
||||
echo -e " ${RED}${BOLD}TESTS FAILED${RESET} — open $RESULTS_DIR/"; exit 1
|
||||
|
||||
Reference in New Issue
Block a user