oliverdavies.uk/source/_daily_emails/2024-06-05.md

2 KiB

title date permalink tags cta snippet
Writing assertions first 2024-06-05 daily/2024/06/05/writing-assertions-first
software-development
automated-testing
test-driven-development
testing_course Sometimes, I write my test assertions first.

As well as writing comments first, 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:

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:

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:

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.