diff --git a/Calibration/PPSAlCaRecoProducer/test/BuildFile.xml b/Calibration/PPSAlCaRecoProducer/test/BuildFile.xml
new file mode 100644
index 0000000000000..045e88b9906a4
--- /dev/null
+++ b/Calibration/PPSAlCaRecoProducer/test/BuildFile.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Calibration/PPSAlCaRecoProducer/test/TestDriver.cpp b/Calibration/PPSAlCaRecoProducer/test/TestDriver.cpp
new file mode 100644
index 0000000000000..9841eb54e4741
--- /dev/null
+++ b/Calibration/PPSAlCaRecoProducer/test/TestDriver.cpp
@@ -0,0 +1,2 @@
+#include "FWCore/Utilities/interface/TestHelper.h"
+RUNTEST()
diff --git a/Calibration/PPSAlCaRecoProducer/test/test_express_AlCaRecoProducer.sh b/Calibration/PPSAlCaRecoProducer/test/test_express_AlCaRecoProducer.sh
index 552a50b3fb7df..3f4698792197f 100755
--- a/Calibration/PPSAlCaRecoProducer/test/test_express_AlCaRecoProducer.sh
+++ b/Calibration/PPSAlCaRecoProducer/test/test_express_AlCaRecoProducer.sh
@@ -1,19 +1,29 @@
#!/bin/bash
+function die { echo $1: status $2; exit $2; }
customise_commands="process.GlobalTag.toGet = cms.VPSet()\
\nprocess.GlobalTag.toGet.append(cms.PSet(record = cms.string(\"AlCaRecoTriggerBitsRcd\"),tag = cms.string(\"AlCaRecoHLTpaths_PPS2022_express_v1\"), connect = cms.string(\"frontier://FrontierProd/CMS_CONDITIONS\")))\
\nprocess.GlobalTag.toGet.append(cms.PSet(record = cms.string(\"PPSTimingCalibrationLUTRcd\"),tag = cms.string(\"PPSDiamondTimingCalibrationLUT_test\"), connect = cms.string(\"frontier://FrontierProd/CMS_CONDITIONS\")))\
\nprocess.ALCARECOPPSCalMaxTracksFilter.TriggerResultsTag = cms.InputTag(\"TriggerResults\",\"\",\"HLTX\")"
-cmsDriver.py testExpressPPSAlCaRecoProducer -s ALCAPRODUCER:PPSCalMaxTracks,ENDJOB \
---process ALCARECO \
---scenario pp \
---era ctpps_2018 \
---conditions auto:run3_data_express \
---data \
---datatier ALCARECO \
---eventcontent ALCARECO \
---nThreads 8 \
---number 100 --filein file:/build/lgrzanka/outputALCAPPS_single.root \
---fileout file:outputALCAPPS_RECO_express.root \
---customise_commands="$customise_commands"
\ No newline at end of file
+INPUTFILE="/store/group/alca_global/pps_alcareco_producer_tests/outputALCAPPS_single.root"
+COMMMAND=`xrdfs cms-xrd-global.cern.ch locate $INPUTFILE`
+STATUS=$?
+echo "xrdfs command status = "$STATUS
+if [ $STATUS -eq 0 ]; then
+ echo "Using file ${INPUTFILE}. Running in ${LOCAL_TEST_DIR}."
+ (cmsDriver.py testExpressPPSAlCaRecoProducer -s ALCAPRODUCER:PPSCalMaxTracks,ENDJOB \
+ --process ALCARECO \
+ --scenario pp \
+ --era ctpps_2018 \
+ --conditions auto:run3_data_express \
+ --data \
+ --datatier ALCARECO \
+ --eventcontent ALCARECO \
+ --nThreads 8 \
+ --number 100 --filein ${INPUTFILE} \
+ --fileout file:outputALCAPPS_RECO_express.root \
+ --customise_commands="$customise_commands") || die 'failed running test_express_AlCaRecoProducer' $?
+else
+ die "SKIPPING test, file ${INPUTFILE} not found" 0
+fi
diff --git a/Calibration/PPSAlCaRecoProducer/test/test_express_PPSAlCaReco_output.sh b/Calibration/PPSAlCaRecoProducer/test/test_express_PPSAlCaReco_output.sh
new file mode 100755
index 0000000000000..07e4322d1c9bf
--- /dev/null
+++ b/Calibration/PPSAlCaRecoProducer/test/test_express_PPSAlCaReco_output.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+function die { echo $1: status $2; exit $2; }
+
+(cmsRun ${LOCAL_TEST_DIR}/test_express_PPSAlCaReco_output.py) || die 'failed running test_express_PPSAlCaReco_output.py' $?
diff --git a/Calibration/PPSAlCaRecoProducer/test/test_prompt_AlCaRecoProducer.sh b/Calibration/PPSAlCaRecoProducer/test/test_prompt_AlCaRecoProducer.sh
index f0de14b286a3d..b02bdd74d4ade 100755
--- a/Calibration/PPSAlCaRecoProducer/test/test_prompt_AlCaRecoProducer.sh
+++ b/Calibration/PPSAlCaRecoProducer/test/test_prompt_AlCaRecoProducer.sh
@@ -1,20 +1,31 @@
#!/bin/bash
+function die { echo $1: status $2; exit $2; }
customise_commands="process.GlobalTag.toGet = cms.VPSet()\
\nprocess.GlobalTag.toGet.append(cms.PSet(record = cms.string(\"AlCaRecoTriggerBitsRcd\"),tag = cms.string(\"AlCaRecoHLTpaths_PPS2022_prompt_v1\"), connect = cms.string(\"frontier://FrontierProd/CMS_CONDITIONS\")))\
\nprocess.GlobalTag.toGet.append(cms.PSet(record = cms.string(\"PPSTimingCalibrationLUTRcd\"),tag = cms.string(\"PPSDiamondTimingCalibrationLUT_test\"), connect = cms.string(\"frontier://FrontierProd/CMS_CONDITIONS\")))\
\nprocess.ALCARECOPPSCalMaxTracksFilter.TriggerResultsTag = cms.InputTag(\"TriggerResults\",\"\",\"HLTX\")"
-# note we currently use `auto:run3_data_express` GT
-# the correct GT (auto:run3_data_prompt) doesn't have LHCInfo record for run 322022 which corresponds to our face ALCARAW file
-cmsDriver.py testPromptPPSAlCaRecoProducer -s ALCAPRODUCER:PPSCalMaxTracks,ENDJOB \
---process ALCARECO \
---scenario pp \
---era ctpps_2018 \
---conditions auto:run3_data_express \
---data \
---datatier ALCARECO \
---eventcontent ALCARECO \
--n 100 --filein file:/build/lgrzanka/outputALCAPPS_single.root \
---fileout file:outputALCAPPS_RECO_prompt.root \
---customise_commands="$customise_commands"
\ No newline at end of file
+INPUTFILE="/store/group/alca_global/pps_alcareco_producer_tests/outputALCAPPS_single.root"
+COMMMAND=`xrdfs cms-xrd-global.cern.ch locate $INPUTFILE`
+STATUS=$?
+echo "xrdfs command status = "$STATUS
+if [ $STATUS -eq 0 ]; then
+ echo "Using file ${INPUTFILE}. Running in ${LOCAL_TEST_DIR}."
+ # note we currently use `auto:run3_data_express` GT
+ # the correct GT (auto:run3_data_prompt) doesn't have LHCInfo record for run 322022 which corresponds to our face ALCARAW file
+ (cmsDriver.py testPromptPPSAlCaRecoProducer -s ALCAPRODUCER:PPSCalMaxTracks,ENDJOB \
+ --process ALCARECO \
+ --scenario pp \
+ --era ctpps_2018 \
+ --conditions auto:run3_data_express \
+ --data \
+ --datatier ALCARECO \
+ --eventcontent ALCARECO \
+ --nThreads 8 \
+ --number 100 --filein ${INPUTFILE} \
+ --fileout file:outputALCAPPS_RECO_prompt.root \
+ --customise_commands="$customise_commands") || die 'failed running test_prompt_AlCaRecoProducer' $?
+else
+ die "SKIPPING test, file ${INPUTFILE} not found" 0
+fi
diff --git a/Calibration/PPSAlCaRecoProducer/test/test_prompt_PPSAlCaReco_output.sh b/Calibration/PPSAlCaRecoProducer/test/test_prompt_PPSAlCaReco_output.sh
new file mode 100755
index 0000000000000..4cf5cd156a31d
--- /dev/null
+++ b/Calibration/PPSAlCaRecoProducer/test/test_prompt_PPSAlCaReco_output.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+function die { echo $1: status $2; exit $2; }
+
+(cmsRun ${LOCAL_TEST_DIR}/test_prompt_PPSAlCaReco_output.py) || die 'failed running test_prompt_PPSAlCaReco_output.py' $?