pest icon indicating copy to clipboard operation
pest copied to clipboard

[Bug]: `--bail` gives error when using `--compact`

Open ConorEdwardsCP opened this issue 5 months ago • 8 comments

What Happened

When I use the --bail flag on my tests, I get an error saying:

Unknown option "--bail".

How to Reproduce

We are running the following command in our pipelines:

./vendor/bin/pest --ci --compact --bail --log-junit=test-report.xml --coverage-clover=coverage-route-non-parallel.xml --coverage-cobertura=coverage-cobertura-route-non-parallel.xml --group=fails-in-parallel --testsuite=Route

It then immediately prints out:

[INFO] Unknown option "--bail".

and then fails the tests.

Sample Repository

No response

Pest Version

4.0.3

PHP Version

8.4.11

Operation System

macOS

Notes

This was working prior to Pest 4. I see the --bail flag is still documented on the CLI API Reference page. I also notice that when I run

./vendor/bin/pest -h

It doesn't print it out as a flag option:


   INFO  [33mUsage:[0m

  phpunit [options] <directory|file> ...

Configuration:

  --bootstrap <file>                   A PHP script that is included before the tests run
  -c|--configuration <file>            Read configuration from XML file
  --no-configuration                   Ignore default configuration file (phpunit.xml)
  --extension <class>                  Register test runner extension with bootstrap <class>
  --no-extensions                      Do not register test runner extensions
  --include-path <path(s)>             Prepend PHP's include_path with given path(s)
  -d <key[=value]>                     Sets a php.ini value
  --cache-directory <dir>              Specify cache directory
  --generate-configuration             Generate configuration file with suggested settings
  --migrate-configuration              Migrate configuration file to current format
  --generate-baseline <file>           Generate baseline for issues
  --use-baseline <file>                Use baseline to ignore issues
  --ignore-baseline                    Do not use baseline to ignore issues

Selection:

  --list-suites                        List available test suites
  --testsuite <name>                   Only run tests from the specified test suite(s)
  --exclude-testsuite <name>           Exclude tests from the specified test suite(s)
  --list-groups                        List available test groups
  --group <name>                       Only run tests from the specified group(s)
  --exclude-group <name>               Exclude tests from the specified group(s)
  --covers <name>                      Only run tests that intend to cover <name>
  --uses <name>                        Only run tests that intend to use <name>
  --requires-php-extension <name>      Only run tests that require PHP extension <name>
  --list-test-files                    List available test files
  --list-tests                         List available tests
  --list-tests-xml <file>              List available tests in XML format
  --filter <pattern>                   Filter which tests to run
  --exclude-filter <pattern>           Exclude tests for the specified filter pattern
  --test-suffix <suffixes>             Only search for test in files with specified suffix(es). Default: Test.php,.phpt

Execution:

  --process-isolation                  Run each test in a separate PHP process
  --globals-backup                     Backup and restore $GLOBALS for each test
  --static-backup                      Backup and restore static properties for each test

  --strict-coverage                    Be strict about code coverage metadata
  --strict-global-state                Be strict about changes to global state
  --disallow-test-output               Be strict about output during tests
  --enforce-time-limit                 Enforce time limit based on test size
  --default-time-limit <sec>           Timeout in seconds for tests that have no declared size
  --do-not-report-useless-tests        Do not report tests that do not test anything

  --stop-on-defect                     Stop after first error, failure, warning, or risky test
  --stop-on-error                      Stop after first error
  --stop-on-failure                    Stop after first failure
  --stop-on-warning                    Stop after first warning
  --stop-on-risky                      Stop after first risky test
  --stop-on-deprecation                Stop after first test that triggered a deprecation
  --stop-on-notice                     Stop after first test that triggered a notice
  --stop-on-skipped                    Stop after first skipped test
  --stop-on-incomplete                 Stop after first incomplete test

  --fail-on-empty-test-suite           Signal failure using shell exit code when no tests were run
  --fail-on-warning                    Signal failure using shell exit code when a warning was triggered
  --fail-on-risky                      Signal failure using shell exit code when a test was considered risky
  --fail-on-deprecation                Signal failure using shell exit code when a deprecation was triggered
  --fail-on-phpunit-deprecation        Signal failure using shell exit code when a PHPUnit deprecation was triggered
  --fail-on-phpunit-notice             Signal failure using shell exit code when a PHPUnit notice was triggered
  --fail-on-phpunit-warning            Signal failure using shell exit code when a PHPUnit warning was triggered
  --fail-on-notice                     Signal failure using shell exit code when a notice was triggered
  --fail-on-skipped                    Signal failure using shell exit code when a test was skipped
  --fail-on-incomplete                 Signal failure using shell exit code when a test was marked incomplete
  --fail-on-all-issues                 Signal failure using shell exit code when an issue is triggered

  --do-not-fail-on-empty-test-suite    Do not signal failure using shell exit code when no tests were run
  --do-not-fail-on-warning             Do not signal failure using shell exit code when a warning was triggered
  --do-not-fail-on-risky               Do not signal failure using shell exit code when a test was considered risky
  --do-not-fail-on-deprecation         Do not signal failure using shell exit code when a deprecation was triggered
  --do-not-fail-on-phpunit-deprecation Do not signal failure using shell exit code when a PHPUnit deprecation was triggered
  --do-not-fail-on-phpunit-notice      Do not signal failure using shell exit code when a PHPUnit notice was triggered
  --do-not-fail-on-phpunit-warning     Do not signal failure using shell exit code when a PHPUnit warning was triggered
  --do-not-fail-on-notice              Do not signal failure using shell exit code when a notice was triggered
  --do-not-fail-on-skipped             Do not signal failure using shell exit code when a test was skipped
  --do-not-fail-on-incomplete          Do not signal failure using shell exit code when a test was marked incomplete

  --cache-result                       Write test results to cache file
  --do-not-cache-result                Do not write test results to cache file

  --order-by <order>                   Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size
  --random-order-seed <N>              Use the specified random seed when running tests in random order

Reporting:

  --colors <flag>                      Use colors in output ("never", "auto" or "always")
  --columns <n>                        Number of columns to use for progress output
  --columns max                        Use maximum number of columns for progress output
  --stderr                             Write to STDERR instead of STDOUT

  --no-progress                        Disable output of test execution progress
  --no-results                         Disable output of test results
  --no-output                          Disable all output

  --display-incomplete                 Display details for incomplete tests
  --display-skipped                    Display details for skipped tests
  --display-deprecations               Display details for deprecations triggered by tests
  --display-phpunit-deprecations       Display details for PHPUnit deprecations
  --display-phpunit-notices            Display details for PHPUnit notices
  --display-errors                     Display details for errors triggered by tests
  --display-notices                    Display details for notices triggered by tests
  --display-warnings                   Display details for warnings triggered by tests
  --display-all-issues                 Display details for all issues that are triggered
  --reverse-list                       Print defects in reverse order

  --teamcity                           Replace default progress and result output with TeamCity format
  --testdox                            Replace default result output with TestDox format
  --testdox-summary                    Repeat TestDox output for tests with errors, failures, or issues

  --debug                              Replace default progress and result output with debugging information
  --with-telemetry                     Include telemetry information in debugging information output

Logging:

  --log-junit <file>                   Write test results in JUnit XML format to file
  --log-otr <file>                     Write test results in Open Test Reporting XML format to file
  --include-git-information            Include Git information in Open Test Reporting XML logfile
  --log-teamcity <file>                Write test results in TeamCity format to file
  --testdox-html <file>                Write test results in TestDox format (HTML) to file
  --testdox-text <file>                Write test results in TestDox format (plain text) to file
  --log-events-text <file>             Stream events as plain text to file
  --log-events-verbose-text <file>     Stream events as plain text with extended information to file
  --no-logging                         Ignore logging configured in the XML configuration file

Code Coverage:

  --coverage-clover <file>             Write code coverage report in Clover XML format to file
  --coverage-openclover <file>         Write code coverage report in OpenClover XML format to file
  --coverage-cobertura <file>          Write code coverage report in Cobertura XML format to file
  --coverage-crap4j <file>             Write code coverage report in Crap4J XML format to file
  --coverage-html <dir>                Write code coverage report in HTML format to directory
  --coverage-php <file>                Write serialized code coverage data to file
  --coverage-text=<file>               Write code coverage report in text format to file [default: standard output]
  --only-summary-for-coverage-text     Option for code coverage report in text format: only show summary
  --show-uncovered-for-coverage-text   Option for code coverage report in text format: show uncovered files
  --coverage-xml <dir>                 Write code coverage report in XML format to directory
  --warm-coverage-cache                Warm static analysis cache
  --coverage-filter <dir>              Include <dir> in code coverage reporting
  --path-coverage                      Report path coverage in addition to line coverage
  --disable-coverage-ignore            Disable metadata for ignoring code coverage
  --no-coverage                        Ignore code coverage reporting configured in the XML configuration file

Miscellaneous:

  -h|--help                            Prints this usage information
  --version                            Prints the version and exits
  --atleast-version <min>              Checks that version is greater than <min> and exits
  --check-version                      Checks whether PHPUnit is the latest version and exits
  --check-php-configuration            Checks whether PHP configuration follows best practices.

ConorEdwardsCP avatar Aug 26 '25 18:08 ConorEdwardsCP

I also see --bail (and --todo, and --issue) missing from pest -h, but it works for me in a simple project.

There might still be an issue. I know some options are incompatible, either by design or because of argument transformation to PHPUnit and others. Do you have a simpler/shorter command line that works/breaks?

flap152 avatar Aug 27 '25 17:08 flap152

I see ./vendor/bin/pest --compact --bail fails, but ./vendor/bin/pest --bail succeeds.

And your original command, works if I remove --compact:

./vendor/bin/pest --ci --bail --log-junit=test-report.xml --coverage-clover=coverage-route-non-parallel.xml --coverage-cobertura=coverage-cobertura-route-non-parallel.xml --group=fails-in-parallel --testsuite=Route
    INFO  No tests found.

You might want to reword the issue title to something like: --bail gives error when using --compact

flap152 avatar Aug 27 '25 17:08 flap152

See how we need to check multiple cases? I found that order of arguments matters

./vendor/bin/pest --bail --compact works, but ./vendor/bin/pest --compact --bail doesn't.

flap152 avatar Aug 27 '25 17:08 flap152

That's all great information! We had used this exact same command when we were on Pest 3, and then bumping to Pest 4 broke it. I tried a few things but wouldn't have guessed that --compact being put prior to --bail would have made a difference. It's a good point though! Hopefully that means it'll be an easy fix haha!

ConorEdwardsCP avatar Aug 27 '25 18:08 ConorEdwardsCP

I assumed there was something wrong with the command itself or that it had been removed but documentation had not been updated since it wasn't present in the -h

ConorEdwardsCP avatar Aug 27 '25 18:08 ConorEdwardsCP

I have an open PR fixing another problem rooted in arguments parsing. Your issue made me see a potential problem with my fix and I improved it.

flap152 avatar Aug 27 '25 19:08 flap152

Thanks! I appreciate all your work @flap152! I'm sure the Pest team does as well! Hopefully we can get these issues taken care of soon

ConorEdwardsCP avatar Aug 27 '25 21:08 ConorEdwardsCP

@nunomaduro it's been over a month since this issue was created, and @flap152 has created a PR to fix it. Is there something that needs to be done to get it merged in?

aceman2684 avatar Oct 07 '25 14:10 aceman2684