Skip to content

Instantly share code, notes, and snippets.

@mglaman
Last active November 6, 2020 02:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mglaman/efcdb804dcced6ddc856e9e0050aad1e to your computer and use it in GitHub Desktop.
Save mglaman/efcdb804dcced6ddc856e9e0050aad1e to your computer and use it in GitHub Desktop.
Drupal CiviCRM PHPUnit

Drupal CiviCRM PHPUnit

Running Drupal's PHPUnit test suite on CiviCRM integration modules!

This assumes you're in a Composer build for Drupal (notes on how to adjust if you're not will be provided.)

You'll need:

  • a webserver pointed at the site – Apache, Nginx, or PHP Built-in server.
  • MySQL – CiviCRM does not work with SQLite
  • Chromedriver – brew cask install chromedriver

Run Chromedriver with its default settings, for example just: chromedriver.

Add the phpunit.xml to the root of your Drupal project. If you're not in a Composer project build, remove the /web prefix from any paths.

Edit the phpunit.xml to set the appropriate environment variables, or set them in your environment manually:

Here's some example settings from a Docker Compose file.

      - SYMFONY_DEPRECATIONS_HELPER=weak
      - SIMPLETEST_DB=mysql://db:db@db:3306/db
      - SIMPLETEST_BASE_URL=http://web
      - BROWSERTEST_OUTPUT_DIRECTORY=/var/www/html/private/browsertest_output
      - BROWSERTEST_OUTPUT_BASE_URL=$DDEV_PRIMARY_URL
      - MINK_DRIVER_ARGS_WEBDRIVER=["chrome", {"browserName":"chrome","chromeOptions":{"args":["--disable-gpu","--headless", "--no-sandbox"]}}, "http://chromedriver:9515"]

Here's a quick explaination

  • SYMFONY_DEPRECATIONS_HELPER: stops deprecations from causing PHPUnit to fail
  • SIMPLETEST_DB: the database connection string of mysql://USER:PASS@HOST:PORT/DB_NAME
  • SIMPLETEST_BASE_URL: the URL to your codebase over the webserver
  • BROWSERTEST_OUTPUT_DIRECTORY: provide a directory to save HTML output to
  • BROWSERTEST_OUTPUT_BASE_URL: optional, if the links in generated output are different than the server URL
  • MINK_DRIVER_ARGS_WEBDRIVER: the Chromedriver args. The phpunit.xml in this gist has it preconfigured.

With the phpunit.xml copied to your Drupal directory you can run the tests:

./vendor/bin/phpunit web/modules/contrib/webform_civicrm

Note: Make sure chromedriver is running in another terminal window for FunctionalJavascript tests

<?xml version="1.0" encoding="UTF-8"?>
<!-- TODO set checkForUnintentionallyCoveredCode="true" once https://www.drupal.org/node/2626832 is resolved. -->
<!-- PHPUnit expects functional tests to be run with either a privileged user
or your current system user. See core/tests/README.md and
https://www.drupal.org/node/2116263 for details.
-->
<phpunit bootstrap="web/core/tests/bootstrap.php" colors="true"
beStrictAboutTestsThatDoNotTestAnything="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutChangesToGlobalState="true"
printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter">
<php>
<!-- Set error reporting to E_ALL. -->
<ini name="error_reporting" value="32767"/>
<!-- Do not limit the amount of memory tests take to run. -->
<ini name="memory_limit" value="-1"/>
<!-- Example SIMPLETEST_BASE_URL value: http://localhost -->
<env name="SIMPLETEST_BASE_URL" value=""/>
<!-- Example SIMPLETEST_DB value: mysql://username:password@localhost/databasename#table_prefix -->
<env name="SIMPLETEST_DB" value=""/>
<!-- Example BROWSERTEST_OUTPUT_DIRECTORY value: /path/to/webroot/sites/simpletest/browser_output -->
<env name="BROWSERTEST_OUTPUT_DIRECTORY" value=""/>
<!-- To disable deprecation testing completely uncomment the next line. -->
<!-- <env name="SYMFONY_DEPRECATIONS_HELPER" value="disabled"/> -->
<!-- Example for changing the driver class for mink tests MINK_DRIVER_CLASS value: 'Drupal\FunctionalJavascriptTests\DrupalSelenium2Driver' -->
<env name="MINK_DRIVER_CLASS" value=''/>
<!-- Example for changing the driver args to mink tests MINK_DRIVER_ARGS value: '["http://127.0.0.1:8510"]' -->
<env name="MINK_DRIVER_ARGS" value=''/>
<!-- Example for changing the driver args to phantomjs tests MINK_DRIVER_ARGS_PHANTOMJS value: '["http://127.0.0.1:8510"]' -->
<env name="MINK_DRIVER_ARGS_PHANTOMJS" value=''/>
<!-- Example for changing the driver args to webdriver tests MINK_DRIVER_ARGS_WEBDRIVER value: '["chrome", { "chromeOptions": { "w3c": false } }, "http://localhost:4444/wd/hub"]' For using the Firefox browser, replace "chrome" with "firefox" -->
<env name="MINK_DRIVER_ARGS_WEBDRIVER" value='["chrome", {"browserName":"chrome","chromeOptions":{"args":["--disable-gpu","--headless", "--no-sandbox"]}}, "http://127.0.0.1:9515"]'/>
</php>
<testsuites>
<testsuite name="unit">
<file>./web/core/tests/TestSuites/UnitTestSuite.php</file>
</testsuite>
<testsuite name="kernel">
<file>./web/core/tests/TestSuites/KernelTestSuite.php</file>
</testsuite>
<testsuite name="functional">
<file>./web/core/tests/TestSuites/FunctionalTestSuite.php</file>
</testsuite>
<testsuite name="functional-javascript">
<file>./web/core/tests/TestSuites/FunctionalJavascriptTestSuite.php</file>
</testsuite>
<testsuite name="build">
<file>./web/core//tests/TestSuites/BuildTestSuite.php</file>
</testsuite>
</testsuites>
<listeners>
<listener class="\Drupal\Tests\Listeners\DrupalListener">
</listener>
<!-- The Symfony deprecation listener has to come after the Drupal listener -->
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener">
</listener>
</listeners>
<!-- Filter for coverage reports. -->
<filter>
<whitelist>
<directory>./web/core/includes</directory>
<directory>./web/core/lib</directory>
<!-- Extensions can have their own test directories, so exclude those. -->
<directory>./web/core/modules</directory>
<exclude>
<directory>./web/core/modules/*/src/Tests</directory>
<directory>./web/core/modules/*/tests</directory>
</exclude>
<directory>./web/modules</directory>
<exclude>
<directory>./web/modules/*/src/Tests</directory>
<directory>./web/modules/*/tests</directory>
<directory>./web/modules/*/*/src/Tests</directory>
<directory>./web/modules/*/*/tests</directory>
</exclude>
<directory>./web/sites</directory>
</whitelist>
</filter>
</phpunit>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment