oliverdavies.uk/source/_daily_emails/2023-11-27.md

2.4 KiB

title pubDate permalink tags
Finding the best test base 2023-11-27 daily/2023/11/27/finding-the-best-test-base
software-development
automated-testing
test-driven-development
php
drupal

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.