Olha não entendo bulhufas de PHP, muito menos testes exclusivamente em PHP, mas existem coisas que funcionam para testes em qualquer linguagem.
Um teste unitário em primeiro lugar deve testar apenas uma coisa. Não é boa prática testar vários retornos em um teste unitário, da mesma forma que você expôs. Então deveria ficar algo como:
public function testIfUserIsAnAdult($firstName, $lastName, $age): void
{
$user = new User($firstName, $lastName, $age);
self::assertEquals(true, $user->isAdult());
}
public function testIfUserIsNotAnAdult($firstName, $lastName, $age): void
{
$user = new User($firstName, $lastName, $age);
self::assertEquals(false, $user->isAdult());
}
Se atente também a massa de testes, deve ser adequada a execução. Você não conseguirá testar todos os cenários com o mesmo resultado. Eu diria até mesmo para realizar a inserção da massa dentro do método de teste. Construa o objeto dentro do teste e construa o teste, com o cenário esperado.
Existem outras boas práticas para testes unitários, como nomeclatura. Isso depende muito dos idioms usados em sua empresa, mas em geral existe a prática given_when_then, ou Dado_Quando_Então. Isso servirá de documentação para outros usuários que lerem seu teste.
Um teste deve ter a possibilidade de falhar. Isso é uma prática excelente quando citamos resiliência de regras de negócio. Geralmente fazemos isso criando um outro cenário para encontrar essas falhas.
Por fim, devemos ter em mente que testes unitários não garantem 100% de segurança ou resiliência a bugs em produção. Bons testes em software são além de testes unitários, testes de integração, end to end, carga, smoke, api, e por ai vai. Dependendo do escopo, empregue tudo que for possível.