Apple’s Xcode 27 release notes document a Test Plan severity option for application crashes in UI tests. The winner is a stage-based CI gate: set warning, failure, or release blocking according to test purpose, then verify the actual pipeline result with representative tests. Do not block every crash by default, and do not treat a Test Plan setting as proof that a release is safe.
For CI platform engineers: map test outcomes to job status and preserve enough evidence to debug the mapping.
For QA leads: separate expected app crashes from unexpected crashes and test-run failures.
For technical owners: approve stage-specific policy and require repeatable acceptance evidence.
Last updated November 2, 2026. Version and feature references were checked against Apple’s Xcode 27 release notes, Xcode 27.2 release notes, and Apple’s Xcode system requirements. Recheck these sources when Apple updates Xcode or its Test Plan documentation.
Start with the CI policy, not the severity control
An Xcode Test Plan setting describes how Xcode classifies a configured test condition. It does not, by itself, define whether a pull request may merge or a release may ship. CI runners and pipeline adapters still need an explicit policy for converting test results into job outcomes.
That distinction prevents a common governance mistake: copying an available tool setting into every pipeline and assuming the resulting status matches the team’s risk tolerance. A warning can be appropriate while investigating an issue, but it is not equivalent to a release pass. Conversely, a failed test should not automatically block every workflow if the test is intentionally exercising an app crash and the expected outcome is documented.
The Xcode 27.2 release notes and the current Xcode system requirements should be checked for the runner’s version context. The Test Plan editing guide describes Test Plan configuration. Confirm the actual control and available choices in the Xcode version installed on the CI Mac; do not assume that labels or behavior are identical across versions.
A useful policy separates three conditions before assigning a gate:
- Expected application crash: the test deliberately exercises a crash path, and the test owner has defined what counts as success.
- Unexpected application crash: the app terminated in a test that expects continued operation; the result needs investigation and may be release-critical.
- Test-run or automation failure: the test did not produce a trustworthy app-level result, for example because the automation flow did not complete. Treat this as a separate diagnostic category until evidence identifies its cause.
These are classification prompts, not universal diagnoses. Project maintainers should review the test source, result bundle, and repeat run before assigning a cause. Apple’s XCUIAutomation documentation and guidance on handling UI interruptions provide relevant context for automation behavior, but they do not determine an organization’s release policy.
Set ownership across the application team
Application developers and test maintainers should inventory the existing XCTest UI tests before a gate is introduced. For each test that can encounter an app crash, record the intended behavior, the app state the test expects afterward, and the owner who can confirm the expected result.
The inventory matters because the same visible symptom can have different meanings. A test may intentionally exercise a crash-handling path; another may reveal a regression; a third may fail before it can establish whether the app itself crashed. A generic label such as “UI test crash” hides those distinctions and can create either noisy blocking or false confidence.
Keep evidence close to the classification. A useful record includes the test identifier, relevant Test Plan, Xcode version, runner environment, result bundle, and a short statement from the test owner. Use Apple’s test execution and result interpretation guidance to understand the artifacts Xcode provides. Do not claim a root cause from a job summary alone.
The Xcode command-line tool reference documents the available command-line tools. A team can use its existing xcodebuild invocation, provided the job captures the result bundle and the selected scheme and Test Plan are unambiguous. For example:
xcodebuild test \
-scheme "$SCHEME" \
-destination "$DESTINATION" \
-resultBundlePath "$RESULT_BUNDLE"
This is an invocation pattern, not a promise about a particular runner’s status mapping. Confirm the accepted options and destination against the installed Xcode and the project’s build configuration. Keep the result bundle as evidence; avoid reducing the test outcome to a single pass/fail string before the team has established what the runner reports for the relevant crash condition.
An illustrative internal record could look like this:
Xcode: recorded from the runner
Scheme and Test Plan: recorded from the job
Test identifier: recorded from the result bundle
Observed app/test outcome: reviewed by the test owner
CI job status: captured from the pipeline
Policy decision: warning / fail / release block
This is a record template, not a sample test result. Populate it from a real run rather than copying a hypothetical status into a release decision.
Give QA a stage-specific decision boundary
QA should define what each pipeline is intended to prove. Pull-request checks prioritize fast, useful feedback on proposed changes. Regression runs assess a broader test set. Release qualification supports a decision about shipping. Those purposes can justify different handling, but only if the difference is explicit and the release stage retains a defensible blocking rule for required coverage.
A permissive setting is not a substitute for triage. If a pull-request job reports a warning, require an owner and a follow-up path; otherwise, the warning can become invisible background noise. If a release-stage test is configured to block, identify which tests are in scope and who can approve an exception. The policy should say what happens when the test result is incomplete or the runner cannot establish the expected outcome.
For each stage, define the following in plain language:
- Test scope: which scheme, Test Plan, and test group run here.
- Crash significance: expected, unexpected, or unresolved pending review.
- Pipeline outcome: report only, fail the job, or prevent release approval.
- Owner: the person or team responsible for classification and action.
- Exception route: who can authorize a temporary waiver and where the evidence is stored.
This creates a durable boundary between Xcode’s available severity behavior and the organization’s CI policy. It also makes differences between pull-request and release pipelines reviewable instead of accidental.
Have the CI engineer validate the mapping
Before enabling a gate broadly, CI engineers should select representative tests that exercise the conditions the policy is meant to handle. Use a non-production or isolated pipeline so a test of the mapping cannot unexpectedly block a live release. Keep the test case controlled, review it with its owner, and capture the result for every relevant Test Plan configuration supported by the runner.
A practical verification sequence:
- Record the Xcode version and runner environment. Check that the version is supported by the team’s intended macOS environment using Apple’s system requirements.
- Record the scheme and Test Plan selected by the job. Verify that the intended plan is actually passed to the test command rather than assumed from an interactive Xcode session.
- Choose representative tests with documented expected outcomes. Include an expected crash path only if the application team has confirmed its purpose.
- Run the tests in an isolated pipeline, preserving the result bundle and full job log.
- Compare the Test Plan’s observed classification with the CI job status and any merge or release decision produced by the pipeline.
- Repeat the verification when the Xcode version, Test Plan, runner image, or CI result adapter changes.
The comparison in the fifth step is the key acceptance check. If Xcode reports a result that the pipeline adapter interprets differently than expected, stop rollout and investigate the adapter or policy. Do not compensate by relabeling a test without review. Likewise, a green job is not evidence that a crash was handled correctly unless the team has verified which test ran and how its result reached the final status.
Keep release approval accountable
Release owners should define which outcomes can automatically block a release and which require human review. A confirmed unexpected crash in a required release test may be a candidate for automatic blocking. A warning from an exploratory or non-required test may instead need a documented review. The correct boundary depends on the release’s test scope and risk; Xcode does not prescribe it.
Preserve the evidence needed to reconstruct the decision: Test Plan configuration, runner and Xcode version, test result bundle, CI status, and any exception approval. Establish who can change the gate and who reviews the change. For a high-impact release policy, require review from the relevant CI owner and QA or application owner rather than allowing a severity adjustment to silently alter release eligibility.
If a run ends without a trustworthy result, do not convert the uncertainty into an automatic pass. Retain the artifacts, mark the status for investigation, and route it to the designated owner. This prevents infrastructure or automation uncertainty from being mistaken for evidence that the app passed its crash checks.
Compare the gate options before rollout
The table below is a decision aid for team policy, not a statement that Apple prescribes these outcomes. Match each option to the test’s purpose and verify how the installed Xcode and CI adapter produce the final status.
| Policy option | Suitable use | CI or release effect | Required safeguard |
|---|---|---|---|
| Report as a warning | Early investigation or a test whose release significance is not yet established | Makes the result visible without automatically blocking the workflow | Assign an owner and review deadline; do not let warnings become unowned |
| Fail the job | A test stage where the team requires a trustworthy passing result before proceeding | Marks the job unsuccessful; downstream handling depends on pipeline policy | Confirm whether the failure blocks merge, deployment, or only the current job |
| Block release approval | A verified, release-critical test condition | Prevents release approval under the team’s stated policy | Define scope, exception authority, retained evidence, and escalation route |
Before rollout, run an acceptance review that covers the following:
- The configured Test Plan matches the one selected by the CI job.
- A representative task produces an observed result that the team can explain.
- The final pipeline status matches the written policy.
- A warning has an owner and a documented follow-up route.
- Release blocking and exception approval have named owners.
- The result bundle and logs can be retrieved for review.
- The policy has an approval record and a review trigger for future Xcode or runner changes.
The technical owner should approve broad adoption only after these checks pass. If the result cannot be reproduced or the CI status cannot be traced to the Test Plan outcome, keep the change limited to the isolated workflow and resolve the discrepancy first.
Compare the verification approaches
A Test Plan setting is only one part of the decision. Choose a verification method that tests the full chain from configuration to release action, rather than checking only the visible setting.
| Verification approach | What it confirms | What it does not confirm | Best use |
|---|---|---|---|
| Inspect the Test Plan in Xcode | The selected plan and displayed crash-severity configuration | How the CI runner or adapter maps the test result | Configuration review |
| Run a representative test in isolation | The observed test behavior and captured artifacts in that environment | Whether another pipeline stage uses the same plan or policy | Initial mapping validation |
| Trace a CI job from command to final status | Whether the selected plan, result bundle, adapter, and job status align | Whether the test set represents all release risks | Gate acceptance |
| Review a release decision record | Whether owners applied the approved policy and retained evidence | Whether the underlying test coverage is sufficient | Release governance |
Use more than a UI inspection when the outcome affects release approval. A configuration screenshot can show what was selected, but it cannot establish how a CI runner translated a test result into a job status. The release record should connect the configuration to an observed run and the action taken.
Frequently asked questions
Where the severity setting belongs
Check the UI-testing configuration in the Test Plan used by the job. Apple’s Xcode 27 release notes describe an application-crash severity option, and Apple’s Test Plan editing guide explains plan configuration. Because the available controls can depend on the installed Xcode version, verify the setting in the runner’s actual environment and preserve the plan used for the run.
Whether an XCTest UI test crash should fail CI
Not in every workflow. First establish whether the app crash is expected, unexpected, or part of an incomplete test run. Then apply the policy for that stage. A warning can be useful during diagnosis, while a release-critical and confirmed failure may require blocking. Record the reasoning and owner so the outcome is not inferred from a generic crash label.
Different rules for pull requests and releases
A team can use different policies for pull-request, regression, and release pipelines. Define the purpose, scope, outcome, and owner for each. For example, a non-blocking signal early in development must not be mistaken for release approval. Confirm that the final release workflow still enforces the required test boundary and documents who can approve exceptions.
Evidence that Test Plan severity affects CI
Run a controlled test in an isolated workflow and capture the Xcode version, runner environment, selected Test Plan, result bundle, and final job status. Compare the observed result with the intended policy. Repeat the check when the runner or adapter changes. Treat the result as a team validation record, not a guarantee that the same mapping applies to every workflow.
An Xcode 27.2 UI test crash CI gate is reliable only when the Test Plan choice, the runner’s observed result, and the team’s release rule agree. A local Mac can suit stable, continuous workloads where the team wants direct hardware control, but it requires hardware procurement, maintenance, and capacity planning; a generic hosted runner may add environment and access constraints when a native Mac test environment is required. For a temporary or isolated Mac CI validation environment, ViewMini’s Mac access options can be assessed alongside those alternatives. Review the test workflow and environment requirements with ViewMini before choosing a rental; compatibility and test outcomes must be verified by the team, not assumed.
Frequently asked questions
Where do I configure the application-crash severity for UI tests in Xcode 27.2?
Check the UI testing section of the relevant Test Plan in the Xcode version used by the runner. Apple documents the severity option in its Xcode 27 release notes and Test Plan editing guidance. Confirm the control and its available values in your installed version rather than relying on a screenshot or a setting copied from another Xcode release.
Should an XCTest UI test crash always fail the CI job?
Not automatically. First identify whether the test expects the app to crash, whether the crash is unexpected, or whether the test process itself failed. A warning can preserve visibility during investigation, while a verified, release-critical failure may justify blocking. Keep the mapping explicit in the CI policy; a Test Plan value alone does not define your merge or release rules.
Can pull-request and release pipelines use different crash gates?
Yes. A team can assign different outcomes by pipeline purpose, provided the policy is deliberate and visible. A pull-request run might report a non-blocking warning while a release qualification run blocks on a confirmed crash in a required test. Record the test scope, owner, and required follow-up for each stage so a permissive early signal cannot silently become release approval.
How can I verify that Test Plan crash severity changes the CI result?
Run a controlled, representative UI test in an isolated pipeline and capture the Xcode version, Test Plan, execution environment, result bundle, and CI job status. Compare the observed result with the intended mapping for each setting supported by your installed Xcode. Do not infer the CI outcome from the Test Plan configuration alone; verify how your runner and CI adapter interpret the completed test run.
Run Your UI Test Gate on a Dedicated Mac
Rent a dedicated Apple Silicon Mac from ViewMini and configure it as your CI runner.
