Skip to content

Instantly share code, notes, and snippets.


mglaman/ Secret

Last active Nov 6, 2020
What would you like to do?
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.

      - SIMPLETEST_DB=mysql://db:db@db:3306/db
      - SIMPLETEST_BASE_URL=http://web
      - BROWSERTEST_OUTPUT_DIRECTORY=/var/www/html/private/browsertest_output
      - 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 is resolved. -->
<!-- PHPUnit expects functional tests to be run with either a privileged user
or your current system user. See core/tests/ and for details.
<phpunit bootstrap="web/core/tests/bootstrap.php" colors="true"
<!-- 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 -->
<!-- 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: '[""]' -->
<env name="MINK_DRIVER_ARGS" value=''/>
<!-- Example for changing the driver args to phantomjs tests MINK_DRIVER_ARGS_PHANTOMJS value: '[""]' -->
<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"]}}, ""]'/>
<testsuite name="unit">
<testsuite name="kernel">
<testsuite name="functional">
<testsuite name="functional-javascript">
<testsuite name="build">
<listener class="\Drupal\Tests\Listeners\DrupalListener">
<!-- The Symfony deprecation listener has to come after the Drupal listener -->
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener">
<!-- Filter for coverage reports. -->
<!-- Extensions can have their own test directories, so exclude those. -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment