the bat, use
set APACHE_TEST_PERL=C:/Strawberry/perl/bin/perl.exe and
--httpd=..\httpd.exe and --conf=..\httpd.conf to an install httpd in the box.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1937083 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/test/pytest_suite/runtests.bat b/test/pytest_suite/runtests.bat
new file mode 100644
index 0000000..ca67973
--- /dev/null
+++ b/test/pytest_suite/runtests.bat
@@ -0,0 +1,126 @@
+@echo off
+rem
+rem runtests.bat -- run the Apache httpd pytest suite on Windows.
+rem
+rem This is the Windows equivalent of runtests.sh.  It needs a built
+rem Apache httpd (the server under test) located via apxs, and
+rem optionally a php-fpm binary to run the PHP tests.
+rem
+rem Usage:
+rem   runtests.bat                       -- auto-detect apxs/httpd/php-fpm on PATH
+rem   runtests.bat --apxs C:\path\apxs   -- point at a specific build
+rem   runtests.bat tests\t\modules       -- run a subset (any pytest args pass through)
+rem   runtests.bat -k status -v          -- extra pytest args pass through too
+rem
+rem Environment overrides (used when the matching --flag is not supplied):
+rem   APXS       path to apxs
+rem   HTTPD      path to httpd
+rem   PHP_FPM    path to php-fpm
+rem
+
+setlocal enabledelayedexpansion
+
+set "HERE=%~dp0"
+rem Remove trailing backslash
+if "%HERE:~-1%"=="\" set "HERE=%HERE:~0,-1%"
+
+cd /d "%HERE%"
+
+rem --- python location
+set PYTHON=%LOCALAPPDATA%\Programs\Python\Python314\python.exe
+
+rem --- ensure the venv exists and is current ----------------------------------
+set "PYTEST=%HERE%\.venv\Scripts\pytest.exe"
+
+set "NEED_SYNC=0"
+if not exist "%PYTEST%" set "NEED_SYNC=1"
+
+rem Check if pyproject.toml is newer than .venv (approximate: compare timestamps
+rem via xcopy /D /L which lists files that are newer than the destination).
+if exist "%HERE%\.venv" (
+    for /f %%F in ('xcopy /D /L /Y "%HERE%\pyproject.toml" "%HERE%\.venv\" 2^>nul ^| C:\Windows\System32\find.exe /c "pyproject.toml"') do (
+        if %%F gtr 0 set "NEED_SYNC=1"
+    )
+) else (
+    set "NEED_SYNC=1"
+)
+
+if "%NEED_SYNC%"=="1" (
+    %PYTHON% -m uv --version >nul 2>&1
+    if errorlevel 1 (
+        echo runtests.bat: ERROR: 'uv' is required but not installed. >&2
+        echo   Install it from https://docs.astral.sh/uv/ and re-run. >&2
+        echo   %PYTHON% -m pip install uv >&2
+        exit /b 1
+    )
+    echo runtests.bat: ^(re^)creating %HERE%\.venv via 'uv sync'... >&2
+    %PYTHON% -m uv sync --project "%HERE%"
+    if errorlevel 1 exit /b 1
+    rem Touch .venv so the staleness check won't retrigger
+    copy /b "%HERE%\.venv" +,, "%HERE%\.venv" >nul 2>&1
+)
+
+rem --- discover apxs / httpd / php-fpm ----------------------------------------
+if not defined APXS (
+    for %%C in (apxs.exe) do (
+        if "!APXS!"=="" (
+            for /f "delims=" %%P in ('where %%C 2^>nul') do (
+                if "!APXS!"=="" set "APXS=%%P"
+            )
+        )
+    )
+)
+
+if not defined PHP_FPM (
+    for %%C in (php-fpm.exe php-fpm8.3.exe php-fpm83.exe php-fpm8.2.exe php-fpm82.exe) do (
+        if "!PHP_FPM!"=="" (
+            for /f "delims=" %%P in ('where %%C 2^>nul') do (
+                if "!PHP_FPM!"=="" set "PHP_FPM=%%P"
+            )
+        )
+    )
+)
+
+rem Build the default flag set only for values the user did not pass explicitly.
+set "AUTO_ARGS="
+
+rem Check if user passed --apxs or --httpd on the command line.
+set "HAS_SERVER_FLAG=0"
+for %%A in (%*) do (
+    echo %%A | findstr /b /c:"--apxs" /c:"--httpd" >nul 2>&1 && set "HAS_SERVER_FLAG=1"
+)
+
+if "%HAS_SERVER_FLAG%"=="0" (
+    if defined APXS (
+        set "AUTO_ARGS=--apxs=!APXS!"
+    ) else if defined HTTPD (
+        set "AUTO_ARGS=--httpd=!HTTPD!"
+    ) else (
+        echo runtests.bat: ERROR: no apxs/httpd found. >&2
+        echo   Pass --apxs=C:\path\to\apxs, or set APXS=... or HTTPD=... >&2
+        exit /b 1
+    )
+)
+
+rem Check if user passed --php-fpm on the command line.
+set "HAS_PHP_FLAG=0"
+for %%A in (%*) do (
+    echo %%A | findstr /b /c:"--php-fpm" >nul 2>&1 && set "HAS_PHP_FLAG=1"
+)
+
+if "%HAS_PHP_FLAG%"=="0" (
+    if defined PHP_FPM (
+        set "AUTO_ARGS=!AUTO_ARGS! --php-fpm=!PHP_FPM!"
+    ) else (
+        echo runtests.bat: note: no php-fpm found; PHP tests will skip. >&2
+        echo   Set PHP_FPM=C:\path\to\php-fpm to run them. >&2
+    )
+)
+
+rem A stale mod_cgid socket in t\logs can break a fresh run; clear it first.
+del /q "%HERE%\t\logs\cgisock*" 2>nul
+
+rem --- run --------------------------------------------------------------------
+echo runtests.bat: %PYTEST% %AUTO_ARGS% %* >&2
+"%PYTEST%" %AUTO_ARGS% %*
+exit /b %errorlevel%