diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0bc45d58c..fc8539063 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,7 +33,7 @@ jobs: env: COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - php-version: 8.1 + php-version: 8.2 - name: Install dependencies run: composer install --prefer-dist --no-progress diff --git a/RoboFile.php b/RoboFile.php index cb6a82e2f..d8cce2d4d 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -10,8 +10,7 @@ class RoboFile extends \Robo\Tasks use DocumentationHelpers; const REPO_BLOB_URL = 'https://github.com/Codeception/Codeception/blob'; - const BRANCH_4x = '4.2'; - const BRANCH_5x = '5.1'; + const BRANCH_5x = '5.3'; const BRANCH_MAIN = 'main'; function post() @@ -413,102 +412,34 @@ private function postProcessFile($pageName, $documentationFile) file_put_contents($documentationFile, $contents); } - public function buildPhar80() + public function buildPhar82() { - $version = self::BRANCH_5x . '.' . date('Ymd'); - $releaseDir = "releases/$version"; - $this->stopOnFail(); - - $this->taskFilesystemStack()->mkdir('build/80')->run(); - $this->setCodeceptionVersionTo('^' . self::BRANCH_5x); - $this->setPlatformVersionTo('8.0.2'); - $buildFile = 'build/80/codecept.phar'; - $this->buildPhar($buildFile); - $this->updateVersionFile($buildFile, 'php80/codecept.version'); - $versionedFile = "$releaseDir/codecept.phar"; - $this->taskFilesystemStack() - ->stopOnFail() - ->mkdir($releaseDir) - ->copy($buildFile, $versionedFile) - ->remove('php80/codecept.phar') - ->symlink("../$versionedFile", 'php80/codecept.phar') - ->run(); - } + $ignoredPlatformReqs = array( + 'ext-apcu', + 'ext-mongodb', + 'ext-phalcon', + ); - public function buildPhar72() - { - $version = self::BRANCH_4x . '.' . date('Ymd'); + $version = self::BRANCH_5x . '.' . date('Ymd'); $releaseDir = "releases/$version"; $this->stopOnFail(); - - $this->taskFilesystemStack()->mkdir('build/72')->run(); - $this->setCodeceptionVersionTo('^4.1'); - $this->setPlatformVersionTo('7.2.0'); - $this->requireHoaConsole(); - $buildFile = 'build/72/codecept.phar'; + $this->taskFilesystemStack()->mkdir('build/82')->run(); + $this->setCodeceptionVersionTo('^' . self::BRANCH_5x, $ignoredPlatformReqs); + $this->setPlatformVersionTo('8.2.0', $ignoredPlatformReqs); + $buildFile = 'build/82/codecept.phar'; $this->buildPhar($buildFile); - $this->updateVersionFile($buildFile, 'codecept.version'); + $this->updateVersionFile($buildFile, 'php82/codecept.version'); $versionedFile = "$releaseDir/codecept.phar"; $this->taskFilesystemStack() ->stopOnFail() ->mkdir($releaseDir) ->copy($buildFile, $versionedFile) - ->remove('codecept.phar') - ->symlink($versionedFile, 'codecept.phar') + ->remove('php82/codecept.phar') + ->symlink("../$versionedFile", 'php82/codecept.phar') ->run(); } - public function buildPhar56() - { - $version = self::BRANCH_4x . '.' . date('Ymd'); - $releaseDir = "releases/$version"; - $this->stopOnFail(); - - $this->taskFilesystemStack()->mkdir('build/56')->run(); - $this->setCodeceptionVersionTo('^4.1'); - $this->setPlatformVersionTo('5.6.4'); - $this->requireHoaConsole(); - //filenames must be different, because Phar refuses to build second file with the same name - $buildFile = 'build/56/codecept.phar'; - $this->buildPhar($buildFile); - $this->updateVersionFile($buildFile, 'php56/codecept.version'); - $versionedFile = "$releaseDir/php56/codecept.phar"; - $this->taskFilesystemStack() - ->stopOnFail() - ->mkdir("$releaseDir/php56") - ->copy($buildFile, $versionedFile) - ->remove('php56/codecept.phar') - ->symlink("../$versionedFile", 'php56/codecept.phar') - ->run(); - } - - private function requireHoaConsole(): void - { - $this->taskComposerRequire() - ->dependency('hoa/console') - ->workingDir('package') - ->run(); - } - - public function release() - { - $version = self::BRANCH_4x . '.' . date('Ymd'); - $releaseDir = "releases/$version"; - $this->updateBuildsPage(); - - $this->taskGitStack() - ->stopOnFail() - ->checkout('-- package/composer.json') - ->add('builds.markdown') - ->add('codecept.phar') - ->add('codecept.version') - ->add('php56/codecept.phar') - ->add('php56/codecept.version') - ->add($releaseDir) - ->run(); - } - - public function release80() + public function release82() { $version = self::BRANCH_5x . '.' . date('Ymd'); $releaseDir = "releases/$version"; @@ -518,23 +449,30 @@ public function release80() ->stopOnFail() ->checkout('-- package/composer.json') ->add('builds.markdown') - ->add('php80/codecept.phar') - ->add('php80/codecept.version') + ->add('php82/codecept.phar') + ->add('php82/codecept.version') ->add($releaseDir) ->run(); } - private function setPlatformVersionTo($version) + private function setPlatformVersionTo($version, $ignoredPlatformReqs = array()) { $this->taskComposerConfig()->workingDir('package')->set('platform.php', $version)->run(); - $this->taskComposerUpdate()->preferDist()->optimizeAutoloader()->workingDir('package')->run(); + $composerUpdate = $this->taskComposerUpdate(); + foreach ($ignoredPlatformReqs as $ignoredPlatformReq) { + $composerUpdate->option('--ignore-platform-req', $ignoredPlatformReq); + } + $composerUpdate->preferDist()->optimizeAutoloader()->workingDir('package')->run(); } - private function setCodeceptionVersionTo($version) + private function setCodeceptionVersionTo($version, $ignoredPlatformReqs = array()) { - $this->taskComposerRequire() - ->dependency('codeception/codeception', $version) - ->workingDir('package') + $composerRequire = $this->taskComposerRequire() + ->dependency('codeception/codeception', $version); + foreach ($ignoredPlatformReqs as $ignoredPlatformReq) { + $composerRequire->option('--ignore-platform-req', $ignoredPlatformReq); + } + $composerRequire->workingDir('package') ->run(); } @@ -639,7 +577,7 @@ public function processChangelog() $repo = $release['repo'] ?? 'Codeception'; $changelog .= sprintf("\n\n### %s %s: %s\n\n", $repo, $release['tag_name'], $release['name']); - $changelog .= sprintf("Released by [ %s](%s) on %s", + $changelog .= sprintf('Released by [{:height="16" width="16"} %s](%s) on %s', $release['author']['avatar_url'] . '&s=16', $release['author']['login'], $release['author']['html_url'], @@ -696,8 +634,10 @@ public function updateBuildsPage() $releaseFile->line("*Requires: PHP 5.4 and higher + CURL*\n"); } elseif ($major < 5) { $releaseFile->line("*Requires: PHP 5.6 and higher + CURL*\n"); - } else { + } elseif ($minor < 3) { $releaseFile->line("*Requires: PHP 8.0 and higher + CURL*\n"); + } else { + $releaseFile->line("*Requires: PHP 8.2 and higher + CURL*\n"); } $releaseFile->line("* **[Download Latest $branch Release]($downloadUrl)**"); } diff --git a/_data/modules.yml b/_data/modules.yml index 6b8b770e3..d36e1192f 100644 --- a/_data/modules.yml +++ b/_data/modules.yml @@ -15,6 +15,10 @@ link: https://github.com/walterwhites/Appium-codeception-module description: Easy Appium integration, iOS Automation +- name: Axeception + link: https://github.com/flowdgmbh/codeception-axeception + description: Run axe-core acceptance tests in codeception + - name: BrowserMob link: https://github.com/edno/codeception-browsermob description: Codeception module for BrowserMob Proxy. @@ -87,10 +91,14 @@ description: Codeception module to test email using MailCare.io (Free, Open Source or paid services). color: "#e65722" +- name: Mailpit + image: ../images/mailpit.svg + link: https://github.com/koehnlein/codeception-email-mailpit + description: Mailpit is a standalone local SMTP server to test email deliveries. The Codeception module provides assertions such as `$I->haveUnreadEmails();` or `$I->seeInOpenedEmailHtmlBody()`. + - name: MailCatcher link: https://github.com/captbaritone/codeception-mailcatcher-module description: MailCatcher is a standalone software which can be configured to catch *any* email sent by your development server, and display it on a webpage. The MailCatcher Module allows you to test the contents of those emails in an acceptance test. - color: "#FFF5C4" - name: MailSMTP link: https://github.com/AhmedSamy/codeception-smtp-mail @@ -161,3 +169,7 @@ - name: Yandex link: https://github.com/portrino/codeception-yandex-module description: Validation of structured data via yandex API. + +- name: Grpc + link: https://github.com/MercerMorning/codeception-grpc-module + description: Validation of grpc server. diff --git a/_includes/extensions.md b/_includes/extensions.md index eb280dea2..0552d693e 100644 --- a/_includes/extensions.md +++ b/_includes/extensions.md @@ -5,7 +5,7 @@ [See Source](https://github.com/Codeception/Codeception/blob/main/ext/DotReporter.php) DotReporter provides less verbose output for test execution. -Like PHPUnit printer it prints dots "." for successful testes and "F" for failures. +Like PHPUnit printer it prints dots "." for successful tests and "F" for failures.  @@ -68,14 +68,14 @@ extensions: [See Source](https://github.com/Codeception/Codeception/blob/main/ext/Recorder.php) -Saves a screenshot of each step in acceptance tests and shows them as a slideshow on one HTML page (here's an [example](https://codeception.com/images/recorder.gif)) -Activated only for suites with WebDriver module enabled. +Saves a screenshot of each step in acceptance tests and shows them as a slideshow on one HTML page (here's an [example](https://codeception.com/images/recorder.gif)). +Works only for suites with WebDriver module enabled. The screenshots are saved to `tests/_output/record_*` directories, open `index.html` to see them as a slideshow. #### Installation -Add this to the list of enabled extensions in `codeception.yml` or `acceptance.suite.yml`: +Add this to the list of enabled extensions in `codeception.yml` or `Acceptance.suite.yml`: ``` yaml extensions: @@ -106,7 +106,7 @@ extensions: ``` #### Skipping recording of steps with annotations -It is also possible to skip recording of steps for specified tests by using the @skipRecording annotation. +It is also possible to skip recording of steps for specified tests by using the `@skipRecording` annotation. ```php /** @@ -122,7 +122,6 @@ public function testLogin(AcceptanceTester $I) - ## RunBefore [See Source](https://github.com/Codeception/Codeception/blob/main/ext/RunBefore.php) @@ -158,7 +157,7 @@ HINT: you can use different configurations per environment. [See Source](https://github.com/Codeception/Codeception/blob/main/ext/RunFailed.php) -Saves failed tests into tests/_output/failed in order to rerun failed tests. +Saves failed tests into `tests/_output/failed` in order to rerun failed tests. To rerun failed tests just run the `failed` group: @@ -170,9 +169,9 @@ To change failed group name add: ``` --override "extensions: config: Codeception\Extension\RunFailed: fail-group: another_group1" ``` -Remember: if you run tests and they generated custom-named fail group, to run this group, you should add override too +Remember: If you run tests and they generated custom-named fail group, to run this group, you should add override too -Starting from Codeception 2.1 **this extension is enabled by default**. +**This extension is enabled by default.** ``` yaml extensions: @@ -188,12 +187,13 @@ On each execution failed tests are logged and saved into `tests/_output/failed` [See Source](https://github.com/Codeception/Codeception/blob/main/ext/RunProcess.php) Extension to start and stop processes per suite. -Can be used to start/stop selenium server, chromedriver, mailcatcher, etc. +Can be used to start/stop selenium server, chromedriver, etc. +Each command is executed only once, at the beginning of the test suite. To execute a command before each test, see [Before/After Attributes](https://codeception.com/docs/AdvancedUsage#BeforeAfter-Attributes). -Can be configured in suite config: +Can be enabled in suite config: ```yaml -# acceptance.suite.yml +# Acceptance.suite.yml extensions: enabled: - Codeception\Extension\RunProcess: @@ -203,8 +203,7 @@ extensions: Multiple parameters can be passed as array: ```yaml -# acceptance.suite.yml - +# Acceptance.suite.yml extensions: enabled: - Codeception\Extension\RunProcess: @@ -214,19 +213,18 @@ extensions: In the end of a suite all launched processes will be stopped. -To wait for the process to be launched use `sleep` option. -In this case you need configuration to be specified as object: +To wait for the process to be launched use the `sleep` option. In this case you need configuration to be specified as object: ```yaml extensions: enabled: - Codeception\Extension\RunProcess: - 0: java -jar ~/selenium-server.jar - 1: mailcatcher - sleep: 5 # wait 5 seconds for processes to boot + 0: php -S 127.0.0.1:8000 -t tests/data/app + 1: java -jar ~/selenium-server.jar + sleep: 5 # wait 5 seconds for the processes to boot ``` -HINT: you can use different configurations per environment. +HINT: You can use different configurations per environment. @@ -239,3 +237,9 @@ Recommended to be used for development purposes only. +## SuiteInitSubscriberTrait + +[See Source](https://github.com/Codeception/Codeception/blob/main/ext/SuiteInitSubscriberTrait.php) + + + diff --git a/_layouts/bootstrap.html b/_layouts/bootstrap.html index 4b62edd6b..299f8ffea 100644 --- a/_layouts/bootstrap.html +++ b/_layouts/bootstrap.html @@ -90,7 +90,7 @@