2024-06-08 22:20:04 +00:00
|
|
|
---
|
|
|
|
title: Writing assertions first
|
|
|
|
date: 2024-06-05
|
|
|
|
permalink: daily/2024/06/05/writing-assertions-first
|
|
|
|
tags:
|
2024-09-08 22:09:54 +00:00
|
|
|
- software-development
|
|
|
|
- automated-testing
|
|
|
|
- test-driven-development
|
2024-06-08 22:20:04 +00:00
|
|
|
cta: testing_course
|
|
|
|
snippet: |
|
2024-09-08 22:09:54 +00:00
|
|
|
Sometimes, I write my test assertions first.
|
2024-06-08 22:20:04 +00:00
|
|
|
---
|
|
|
|
|
|
|
|
As well as [writing comments first][0], when writing tests, I sometimes like to write my tests backwards and start by writing the assertions first.
|
|
|
|
|
|
|
|
I know what I want to assert in the test, so it's an easy place to start.
|
|
|
|
|
|
|
|
I'll run it, see the error, fix it and continue working backwards.
|
|
|
|
|
|
|
|
For example, I could start with this:
|
|
|
|
|
|
|
|
```php
|
|
|
|
public function testOnlyPostNodesAreShown(): void {
|
|
|
|
$assert = $this->assertSession();
|
|
|
|
$assert->pageTextContains('Post one');
|
|
|
|
$assert->pageTextContains('Post two');
|
|
|
|
$assert->pageTextNotContains('This is not a post');
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
This test will fail when I run it, but it makes me think about what I need to do to fix the error and how to do so in the best way.
|
|
|
|
|
|
|
|
In this case, I need to make a request to the page that should render the text:
|
|
|
|
|
|
|
|
```php
|
|
|
|
public function testOnlyPostNodesAreShown(): void {
|
|
|
|
$this->drupalGet('/blog');
|
|
|
|
|
|
|
|
$assert = $this->assertSession();
|
|
|
|
$assert->pageTextContains('Post one');
|
|
|
|
$assert->pageTextContains('Post two');
|
|
|
|
$assert->pageTextNotContains('This is not a post');
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
This will still fail, as I also need to create the required posts:
|
|
|
|
|
|
|
|
```php
|
|
|
|
public function testOnlyPostNodesAreShown(): void {
|
|
|
|
PostBuilder::create()->setTitle('Post one')->getPost();
|
|
|
|
PostBuilder::create()->setTitle('Post two')->getPost();
|
|
|
|
|
|
|
|
$this->createNode([
|
|
|
|
'title' => 'This is not a post',
|
|
|
|
'type' => 'page',
|
|
|
|
]);
|
|
|
|
|
|
|
|
$this->drupalGet('/blog');
|
|
|
|
|
|
|
|
$assert = $this->assertSession();
|
|
|
|
$assert->pageTextContains('Post one');
|
|
|
|
$assert->pageTextContains('Post two');
|
|
|
|
$assert->pageTextNotContains('This is not a post');
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Now the test passes.
|
|
|
|
|
|
|
|
Doing test-driven development keeps my code clean and minimal, and I find this approach keeps my test clean, too.
|
|
|
|
|
|
|
|
[0]: {{site.url}}/daily/2024/06/03/writing-comments-first
|