Beste praktijken voor het testen van PHPUnit
PHPUnit-testen van beste praktijken in XOOPS
Section titled “PHPUnit-testen van beste praktijken in XOOPS”Testen is essentieel voor het waarborgen van de codekwaliteit, het voorkomen van regressies en het mogelijk maken van betrouwbare refactoring.
PHPUnit installeren
Section titled “PHPUnit installeren”# Using Composercomposer require --dev phpunit/phpunit ^9.0
# Run tests./vendor/bin/phpunitphpunit.xml-configuratie
Section titled “phpunit.xml-configuratie”<?xml version="1.0" encoding="UTF-8"?><phpunit bootstrap="tests/bootstrap.php" colors="true" verbose="true"> <testsuites> <testsuite name="Unit"> <directory>tests/unit</directory> </testsuite> <testsuite name="Integration"> <directory>tests/integration</directory> </testsuite> </testsuites>
<coverage processUncoveredFiles="true"> <include> <directory suffix=".php">class</directory> </include> <report> <html outputDirectory="coverage"/> </report> </coverage></phpunit>Eenheidstests schrijven
Section titled “Eenheidstests schrijven”<?phpnamespace Xoops\Module\Mymodule\Tests\Unit;
use PHPUnit\Framework\TestCase;use Xoops\Module\Mymodule\Service\UserService;
class UserServiceTest extends TestCase{ private $userService; private $mockRepository;
protected function setUp(): void { parent::setUp(); $this->mockRepository = $this->createMock( \Xoops\Module\Mymodule\Repository\UserRepositoryInterface::class ); $this->userService = new UserService($this->mockRepository); }
public function testRegisterSuccess() { // Arrange $this->mockRepository->expects($this->once()) ->method('findByUsername') ->willReturn(null);
$this->mockRepository->expects($this->once()) ->method('save') ->willReturn(1);
// Act $result = $this->userService->register('user', 'test@test.com', 'pass');
// Assert $this->assertNotNull($result); }
public function testRegisterDuplicate() { // Arrange $existingUser = new \stdClass(); $this->mockRepository->expects($this->once()) ->method('findByUsername') ->willReturn($existingUser);
// Act & Assert $this->expectException(\Exception::class); $this->userService->register('user', 'test@test.com', 'pass'); }}?>Gegevensobjecten testen
Section titled “Gegevensobjecten testen”<?phpclass UserDTOTest extends TestCase{ public function testDTOCreation() { $user = new User(); $user->setId(1) ->setUsername('testuser') ->setEmail('test@test.com');
$dto = new UserDTO($user);
$this->assertEquals(1, $dto->getId()); $this->assertEquals('testuser', $dto->getUsername()); }
public function testDTOToArray() { $user = new User(); $user->setId(1)->setUsername('testuser');
$dto = new UserDTO($user); $array = $dto->toArray();
$this->assertIsArray($array); $this->assertEquals(1, $array['id']); }}?>Codedekking
Section titled “Codedekking”# Generate coverage report./vendor/bin/phpunit --coverage-html coverage
# View coverage percentage./vendor/bin/phpunit --coverage-textBeste praktijken
Section titled “Beste praktijken”- Schrijf één test per methode/scenario
- Gebruik beschrijvende testnamen
- Volg het Arrange-Act-Assert-patroon
- Mock externe afhankelijkheden
- Houd tests gericht en onafhankelijk
- Streef naar meer dan 80% codedekking
- Testfoutcondities
- Test grensgevallen
Testorganisatie
Section titled “Testorganisatie”tests/├── unit/│ ├── UserServiceTest.php│ ├── UserRepositoryTest.php│ └── UserDTOTest.php├── integration/│ ├── UserControllerTest.php│ └── UserServiceTest.php├── fixtures/│ └── users.php├── bootstrap.php└── phpunit.xmlGerelateerde documentatie
Section titled “Gerelateerde documentatie”Zie ook:
- Foutafhandeling voor het testen van uitzonderingen
- ../Patterns/Repository-Pattern voor het testen van repository’s
- ../Patterns/Service-Layer voor servicetests
- Code-organisatie voor teststructuur
Tags: #best-practices #testen #phpunit #code-coverage #module-ontwikkeling