[AJUDA] Dúvida sobre testes.
Introdução ao problema
Olá, gostaria de retirar uma dúvida sobre testes com um exemplo abaixo. Estou estudando essa matéria há alguns dias, mas surgiu-me uma dúvida e gostaria de saná-la com vocês. Creio que, por ser uma dúvida conceitual, você não precisa entender PHP ou PHPUnit para saná-la. Ainda assim, deixei alguns exemplos de código para expressar melhor a minha dúvida.
Cenário do problema
Suponha que, na aplicação, tenhamos a seguinte classe no diretório ./src/Models:
namespace App\Models;
class User
{
public function __construct(
private string $firstName,
private string $lastName,
private int $age
)
{
/**
* Essa é uma funcionalidade da versão 8.0 do PHP.
* Com ela, podemos fazer com que os parâmetros do método
* construtor tornem-se propriedades.
*/
}
public function getName(): string
{
return "{$this->firstName} {$this->lastName}";
}
public function isAdult(): bool
{
return $this->age >= 18;
}
}
Essa classe é simples, mas será suficiente para explicar a minha dúvida.
Agora, no diretório ./test/Models teremos a seguinte classe de teste.
namespace Test\Model;
use PHPUnit\Framework\TestCase;
/**
*@covers App\Model\User
*/
//A annotation acima serve apenas para explicitar qual
//classe estamos testando.
class UserTest extends TestCase
{
/**
*@dataProvider usersProvider
*/
public function testIfUserIsAnAdultOrNot($firstName, $lastName, $age): void
{
$user = new User($firstName, $lastName, $age);
$age >= 18 ? self::assertEquals(true, $user->isAdult()) : self::assertEquals(false, $user->isAdult());
}
//O método estático abaixo retornará um conjunto de dados que podem ser
//utilizados no teste acima
public static function usersProvider(): array
{
return [
'firstUser' => ['Natan', 'Matos', 19],
'secondUser' => ['Oliver', 'Souza', 27],
'thirdUser' => ['Giovanna', 'Matsumoto', 16]
];
}
}
Cerne da dúvida
Repare na maneira como realizamos o teste do método isAdult. Essa maneira é correta? Digo isso porque o teste possui asserções condicionais. O que é um pouco estranho. Será que a melhor maneira seria testar esse método com dois métodos de teste diferentes? Exemplo
- testIfUserIsAnAdult: possui apenas uma asserção, onde insiro apenas dados onde o usuário é um adulto, aguardando que o valor final seja true.
- testIfUserIsNotAnAdult: possui apenas uma asserção, onde insiro apenas dados onde o usuário não é um adulto, aguandando que o valor final seja false.
Agradeço por terem lido até aqui!