In less than 12 months, Drupal 7 will be end-of-life and no longer supported. Plan your upgrade to Drupal 10 now.

Finding the best test base

As well as different base classes for types of tests - i.e. functional, kernel and unit - there are other test base classes within those that can be used to simplify things.

For example, if we have this test:

<?php

namespace Drupal\Tests\example\Kernel;

use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\node\Traits\NodeCreationTrait;
use Drupal\Tests\user\Traits\UserCreationTrait;

class ExampleTest extends KernelTestBase {

  use NodeCreationTrait;
  use UserCreationTrait;

  protected static $modules = [
    'node',
    'user',
  ];

  public function setUp(): void {
    parent::setUp();

    $this->installEntitySchema(entity_type_id: 'node');
    $this->installEntitySchema(entity_type_id: 'user');
  }

  public function testExample(): void {
    $user = $this->createUser();

    $article = $this->createNode([
      'title' => 'Test article',
      'uid' => $user,
    ]);

    self::assertSame('1', $article->getOwnerId());
  }

}

Both creation traits must be imported, the node and user modules must be enabled, and the entity tables must be installed.

When writing a lot of tests, this can result in duplication and more complex tests that take longer to write.

This can be simplified using EntityKernelTestBase instead of KernelTestBase:

<?php

use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
use Drupal\Tests\node\Traits\NodeCreationTrait;

class ExampleTest extends EntityKernelTestBase {

  use NodeCreationTrait;

  protected static $modules = [
    'node',
  ];

  public function testExample(): void {
    $user = $this->createUser();

    $article = $this->createNode([
      'title' => 'Test article',
      'uid' => $user,
    ]);

    self::assertSame('1', $article->getOwnerId());
  }

}

The class is simpler, fewer modules must be specified, and the entity schemas are automatically installed.

As well as the core modules, some contrib modules also provide their own base test cases.

If you're using the Webform module, you may want to use WebformAccessTestBase instead of the standard UnitTestCase.

It's definitely worth spending some time looking at what base test cases are available and which are the best ones to use for your own tests.

- Oliver

P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 10? Book a Drupal 7 upgrade consultation call or an upgrade roadmap.

Was this useful?

Sign up here and get more like this delivered straight to your inbox every day.

About me

Picture of Oliver

I'm an Acquia-certified Drupal Triple Expert with 17 years of experience, an open-source software maintainer and Drupal core contributor, public speaker, live streamer, and host of the Beyond Blocks podcast.