diff --git a/source/_daily_emails/2024-06-05.md b/source/_daily_emails/2024-06-05.md new file mode 100644 index 000000000..f707306b9 --- /dev/null +++ b/source/_daily_emails/2024-06-05.md @@ -0,0 +1,71 @@ +--- +title: Writing assertions first +date: 2024-06-05 +permalink: daily/2024/06/05/writing-assertions-first +tags: + - software-development + - automated-testing + - test-driven-development +cta: testing_course +snippet: | + Sometimes, I write my test assertions first. +--- + +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