Functional testing
Running functional tests
Run functional tests
# Run TYPO3 functional tests
Build/Scripts/runTests.sh -s functional
# Alternative: Via Composer script
composer ci:test:php:functional
Copied!
Functional test example
Example: Functional test
<?php
namespace Netresearch\NrLlm\Tests\Functional\Repository;
use Netresearch\NrLlm\Domain\Model\PromptTemplate;
use Netresearch\NrLlm\Domain\Repository\PromptTemplateRepository;
use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
class PromptTemplateRepositoryTest extends FunctionalTestCase
{
protected array $testExtensionsToLoad = [
'netresearch/nr-llm',
];
private PromptTemplateRepository $repository;
protected function setUp(): void
{
parent::setUp();
$this->repository = $this->get(PromptTemplateRepository::class);
}
public function testFindByIdentifierReturnsTemplate(): void
{
$this->importCSVDataSet(__DIR__ . '/Fixtures/prompt_templates.csv');
$template = $this->repository->findByIdentifier('test-template');
$this->assertInstanceOf(PromptTemplate::class, $template);
$this->assertEquals('Test Template', $template->getName());
}
}
Copied!
Test fixtures
CSV fixtures
Tests/Functional/Fixtures/prompt_templates.csv
"tx_nrllm_prompt_template"
"uid","pid","identifier","name","template","variables"
1,0,"test-template","Test Template","Hello {name}!","name"
Copied!
JSON response fixtures
Tests/Fixtures/openai_chat_response.json
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"model": "gpt-5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Test response"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 10,
"completion_tokens": 5,
"total_tokens": 15
}
}
Copied!
Mutation testing
The extension uses Infection for mutation testing to ensure test quality.
Running mutation tests
Run mutation tests
# Run mutation tests via runTests.sh
Build/Scripts/runTests.sh -s mutation
# Alternative: Via Composer script
composer ci:test:php:mutation
Copied!
Interpreting results
- MSI (Mutation Score Indicator): Percentage of mutations killed.
- Target: >60% MSI indicates good test quality.
- Current: 58% MSI (459 tests).
Mutation testing results
Mutation Score Indicator (MSI): 58%
Mutation Code Coverage: 85%
Covered Code MSI: 68%
Copied!
Best practices
- Isolate tests: Each test should be independent.
- Mock external APIs: Never call real APIs in unit tests.
- Use data providers: For testing multiple scenarios.
- Test edge cases: Empty inputs, null values, boundaries.
- Descriptive names: Test method names should describe behavior.
- Arrange-Act-Assert: Follow AAA pattern.
- Fast tests: Unit tests should complete in milliseconds.
- Coverage goals: Aim for >80% line coverage.