2024-01-03 20:00:00 +00:00
---
title: >
2024-09-08 22:09:54 +00:00
Finding the best test base
2024-01-03 20:00:00 +00:00
pubDate: 2023-11-27
permalink: >-
2024-12-19 20:26:33 +00:00
daily/2023/11/27/finding-the-best-test-base
2024-01-03 20:00:00 +00:00
tags:
2024-09-08 22:09:54 +00:00
- software-development
- automated-testing
- test-driven-development
- php
- drupal
2024-01-03 20:00:00 +00:00
---
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:
2024-02-18 01:35:59 +00:00
```language-php
2024-01-03 20:00:00 +00:00
< ?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` :
2024-02-18 01:35:59 +00:00
```language-php
2024-01-03 20:00:00 +00:00
< ?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.