--- 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