diff --git a/Build/phpstan/phpstan-baseline.neon b/Build/phpstan/phpstan-baseline.neon
index 83dc831b781a5e75673dc53d567a45541bff31a3..b332e03d2b5dcf80d6f098669157c3e3dfdd1dd5 100644
--- a/Build/phpstan/phpstan-baseline.neon
+++ b/Build/phpstan/phpstan-baseline.neon
@@ -1681,7 +1681,7 @@ parameters:
 			path: ../../typo3/sysext/extbase/Tests/Unit/Mvc/Controller/MvcPropertyMappingConfigurationServiceTest.php
 
 		-
-			message: "#^Property class@anonymous/extbase/Tests/Unit/Mvc/View/JsonViewTest\\.php\\:106\\:\\:\\$prohibited is unused\\.$#"
+			message: "#^Property class@anonymous/extbase/Tests/Unit/Mvc/View/JsonViewTest\\.php\\:108\\:\\:\\$prohibited is unused\\.$#"
 			count: 1
 			path: ../../typo3/sysext/extbase/Tests/Unit/Mvc/View/JsonViewTest.php
 
diff --git a/typo3/sysext/adminpanel/Tests/Unit/Middleware/AdminPanelInitiatorTest.php b/typo3/sysext/adminpanel/Tests/Unit/Middleware/AdminPanelInitiatorTest.php
index ef62c9041f9d3e21891ff4724a983a73da0e716a..094a314443e01289eff0b0ad69d26e8c60c9059f 100644
--- a/typo3/sysext/adminpanel/Tests/Unit/Middleware/AdminPanelInitiatorTest.php
+++ b/typo3/sysext/adminpanel/Tests/Unit/Middleware/AdminPanelInitiatorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Adminpanel\Tests\Unit\Middleware;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
@@ -29,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AdminPanelInitiatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function processCallsInitialize(): void
     {
         $tsConfig = [
@@ -62,9 +61,7 @@ final class AdminPanelInitiatorTest extends UnitTestCase
         $adminPanelInitiator->process($request, $handler);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processDoesNotCallInitializeIfAdminPanelIsNotEnabledInUC(): void
     {
         $tsConfig = [
@@ -82,9 +79,7 @@ final class AdminPanelInitiatorTest extends UnitTestCase
         $this->checkAdminPanelDoesNotCallInitialize($tsConfig, $uc);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processDoesNotCallInitializeIfNoAdminPanelModuleIsEnabled(): void
     {
         $tsConfig = [
diff --git a/typo3/sysext/adminpanel/Tests/Unit/Modules/PreviewModuleTest.php b/typo3/sysext/adminpanel/Tests/Unit/Modules/PreviewModuleTest.php
index 1b6e361eab4af17783e29c7f515c0dd7e64891f7..8eb5c008259785b69ea5a1b239d68d33ced7cb89 100644
--- a/typo3/sysext/adminpanel/Tests/Unit/Modules/PreviewModuleTest.php
+++ b/typo3/sysext/adminpanel/Tests/Unit/Modules/PreviewModuleTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Adminpanel\Tests\Unit\Modules;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Adminpanel\Modules\PreviewModule;
 use TYPO3\CMS\Adminpanel\Service\ConfigurationService;
 use TYPO3\CMS\Core\Context\Context;
@@ -45,10 +47,8 @@ final class PreviewModuleTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider simulateDateDataProvider
-     */
+    #[DataProvider('simulateDateDataProvider')]
+    #[Test]
     public function initializeFrontendPreviewSetsDateForSimulation(string $dateToSimulate, int $expectedExecTime, int $expectedAccessTime): void
     {
         $configurationService = $this->getMockBuilder(ConfigurationService::class)->disableOriginalConstructor()->getMock();
@@ -71,9 +71,7 @@ final class PreviewModuleTest extends UnitTestCase
         self::assertSame($GLOBALS['SIM_ACCESS_TIME'], $expectedAccessTime, 'ACCESS_TIME');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeFrontendPreviewSetsUserGroupForSimulation(): void
     {
         $request = (new ServerRequest())->withAttribute('frontend.user', $this->getMockBuilder(FrontendUserAuthentication::class)->getMock());
diff --git a/typo3/sysext/adminpanel/Tests/Unit/Service/ConfigurationServiceTest.php b/typo3/sysext/adminpanel/Tests/Unit/Service/ConfigurationServiceTest.php
index 93c29777959c98e914ceb023b825ecd270d5b972..1b07e45b6a862347c32d56f66761ba703390f48e 100644
--- a/typo3/sysext/adminpanel/Tests/Unit/Service/ConfigurationServiceTest.php
+++ b/typo3/sysext/adminpanel/Tests/Unit/Service/ConfigurationServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Adminpanel\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Adminpanel\Service\ConfigurationService;
@@ -36,9 +38,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $GLOBALS['BE_USER'] = $this->beUser;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMainConfigurationReturnsTsConfigFromUser(): void
     {
         $userTsAdmPanelConfig = [
@@ -54,9 +54,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         self::assertSame($userTsAdmPanelConfig, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOptionReturnsEmptyStringIfNoConfigurationFound(): void
     {
         $configurationService = new ConfigurationService();
@@ -64,9 +62,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         self::assertSame('', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOptionReturnsOverrideOptionIfSet(): void
     {
         $this->setUpUserTsConfigForAdmPanel(
@@ -85,9 +81,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         self::assertSame('1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOptionCastsResultToString(): void
     {
         $this->setUpUserTsConfigForAdmPanel(
@@ -124,10 +118,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getConfigurationOptionEmptyArgumentDataProvider
-     */
+    #[DataProvider('getConfigurationOptionEmptyArgumentDataProvider')]
+    #[Test]
     public function getConfigurationOptionThrowsExceptionOnEmptyArgument(string $identifier, string $option): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -137,9 +129,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->getConfigurationOption($identifier, $option);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOptionReturnsSettingFromUcIfNoOverrideGiven(): void
     {
         $this->setUpUserTsConfigForAdmPanel([]);
@@ -155,9 +145,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         self::assertSame('1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function saveConfigurationTriggersOnSubmitOnEnabledModules(): void
     {
         $requestMock = $this->getMockBuilder(ServerRequestInterface::class)->getMock();
@@ -178,9 +166,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->saveConfiguration($modules, $requestMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function saveConfigurationSavesMergedExistingAndNewConfiguration(): void
     {
         // existing configuration from UC
diff --git a/typo3/sysext/adminpanel/Tests/Unit/Service/ModuleLoaderTest.php b/typo3/sysext/adminpanel/Tests/Unit/Service/ModuleLoaderTest.php
index 4ba686f5e84409bbef1785757f4d3dd855f7ed70..006e6706e0387b9e17a50b0e0e82a6b58f144d0c 100644
--- a/typo3/sysext/adminpanel/Tests/Unit/Service/ModuleLoaderTest.php
+++ b/typo3/sysext/adminpanel/Tests/Unit/Service/ModuleLoaderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Adminpanel\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Adminpanel\Service\ModuleLoader;
 use TYPO3\CMS\Adminpanel\Tests\Unit\Fixtures\DisabledMainModuleFixture;
 use TYPO3\CMS\Adminpanel\Tests\Unit\Fixtures\MainModuleFixture;
@@ -26,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ModuleLoaderTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validateSortAndInitializeModulesReturnsEmptyArrayIfNoModulesAreConfigured(): void
     {
         $moduleLoader = new ModuleLoader();
@@ -45,10 +45,8 @@ final class ModuleLoaderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider missingConfigurationDataProvider
-     */
+    #[DataProvider('missingConfigurationDataProvider')]
+    #[Test]
     public function validateSortAndInitializeModulesThrowsExceptionIfModuleHasMissingConfiguration(array $configuration): void
     {
         $this->expectException(\RuntimeException::class);
@@ -84,10 +82,8 @@ final class ModuleLoaderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidConfigurationDataProvider
-     */
+    #[DataProvider('invalidConfigurationDataProvider')]
+    #[Test]
     public function validateSortAndInitializeModulesThrowsExceptionIfModuleHasInvalidConfiguration(array $configuration): void
     {
         $this->expectException(\RuntimeException::class);
@@ -97,9 +93,7 @@ final class ModuleLoaderTest extends UnitTestCase
         $moduleLoader->validateSortAndInitializeModules($configuration);
     }
 
-    /**
-    * @test
-    */
+    #[Test]
     public function validateSortAndInitializeModulesOrdersModulesWithDependencyOrderingService(): void
     {
         $config = [
@@ -117,9 +111,7 @@ final class ModuleLoaderTest extends UnitTestCase
         $moduleLoader->validateSortAndInitializeModules($config);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateSortAndInitializeModulesInstantiatesMainModulesOnlyIfEnabled(): void
     {
         $config = [
diff --git a/typo3/sysext/adminpanel/Tests/Unit/Utility/StateUtilityTest.php b/typo3/sysext/adminpanel/Tests/Unit/Utility/StateUtilityTest.php
index 13551dec7a81498c1d527a456207188fd2236c89..36ce074b0811e5df63fd47ae18ae15e0d0e180c9 100644
--- a/typo3/sysext/adminpanel/Tests/Unit/Utility/StateUtilityTest.php
+++ b/typo3/sysext/adminpanel/Tests/Unit/Utility/StateUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Adminpanel\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Adminpanel\Utility\StateUtility;
 use TYPO3\CMS\Backend\FrontendBackendUserAuthentication;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -24,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class StateUtilityTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function isEnabledReturnsFalseIfNoBackendUserExists(): void
     {
         $GLOBALS['BE_USER'] = false;
@@ -34,9 +34,7 @@ final class StateUtilityTest extends UnitTestCase
         self::assertFalse($isEnabled);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isEnabledReturnsFalseIfNoBackendUserInFrontendContextIsLoggedIn(): void
     {
         $GLOBALS['BE_USER'] = $this->getMockBuilder(BackendUserAuthentication::class)->disableOriginalConstructor()->getMock();
@@ -68,10 +66,8 @@ final class StateUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider tsConfigEnabledDataProvider
-     */
+    #[DataProvider('tsConfigEnabledDataProvider')]
+    #[Test]
     public function isEnabledReturnsTrueIfAtLeastOneModuleIsEnabled(array $tsConfig): void
     {
         $beUserMock = $this->getMockBuilder(FrontendBackendUserAuthentication::class)->disableOriginalConstructor()->getMock();
@@ -104,10 +100,8 @@ final class StateUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider tsConfigDisabledDataProvider
-     */
+    #[DataProvider('tsConfigDisabledDataProvider')]
+    #[Test]
     public function isEnabledReturnsFalseIfNoModulesEnabled(array $tsConfig): void
     {
         $beUserMock = $this->getMockBuilder(FrontendBackendUserAuthentication::class)->disableOriginalConstructor()->getMock();
@@ -143,10 +137,8 @@ final class StateUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider tsConfigHideDataProvider
-     */
+    #[DataProvider('tsConfigHideDataProvider')]
+    #[Test]
     public function isHiddenForUserReturnsCorrectValue(array $tsConfig, bool $expected): void
     {
         $beUserMock = $this->getMockBuilder(FrontendBackendUserAuthentication::class)->disableOriginalConstructor()->getMock();
@@ -156,9 +148,7 @@ final class StateUtilityTest extends UnitTestCase
         self::assertSame($expected, $isEnabled);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHiddenForUserReturnsFalseIfUserIsNotAvailable(): void
     {
         $GLOBALS['BE_USER'] = null;
@@ -192,10 +182,8 @@ final class StateUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider ucDisplayOpenDataProvider
-     */
+    #[DataProvider('ucDisplayOpenDataProvider')]
+    #[Test]
     public function isOpenForUserReturnsCorrectValue(array $uc, bool $expected): void
     {
         $beUser = new FrontendBackendUserAuthentication();
@@ -205,9 +193,7 @@ final class StateUtilityTest extends UnitTestCase
         self::assertSame($expected, $isOpen);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isOpenForUserReturnsFalseIfUserIsNotAvailable(): void
     {
         $GLOBALS['BE_USER'] = null;
@@ -241,10 +227,8 @@ final class StateUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider typoScriptDataProvider
-     */
+    #[DataProvider('typoScriptDataProvider')]
+    #[Test]
     public function isActivatedInTypoScriptReturnsCorrectValue(array $typoScript, bool $expected): void
     {
         $tsfe = new \stdClass();
diff --git a/typo3/sysext/backend/Tests/Unit/Configuration/BackendUserConfigurationTest.php b/typo3/sysext/backend/Tests/Unit/Configuration/BackendUserConfigurationTest.php
index 66b486e001ea83ea96b80a1900c8c46cc03f3c34..3581a27519acb600e1452724ca0b14b1affc6e69 100644
--- a/typo3/sysext/backend/Tests/Unit/Configuration/BackendUserConfigurationTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Configuration/BackendUserConfigurationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Configuration\BackendUserConfiguration;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -34,9 +35,7 @@ final class BackendUserConfigurationTest extends UnitTestCase
         $this->backendUserConfiguration = new BackendUserConfiguration($this->backendUserMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getsConfiguration(): void
     {
         $this->backendUserMock->uc = [
@@ -50,9 +49,7 @@ final class BackendUserConfigurationTest extends UnitTestCase
         self::assertEquals('B', $this->backendUserConfiguration->get('nested.key'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getsAllConfiguration(): void
     {
         $configuration = [
@@ -64,9 +61,7 @@ final class BackendUserConfigurationTest extends UnitTestCase
         self::assertEquals($configuration, $this->backendUserConfiguration->getAll());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setsConfiguration(): void
     {
         $this->backendUserMock->uc = [
@@ -89,9 +84,7 @@ final class BackendUserConfigurationTest extends UnitTestCase
         self::assertEquals($expected, $this->backendUserMock->uc);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addsToListConfigurationOption(): void
     {
         $this->backendUserMock->uc = [
@@ -116,9 +109,7 @@ final class BackendUserConfigurationTest extends UnitTestCase
         self::assertEquals($expected, $this->backendUserMock->uc);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removesFromListConfigurationOption(): void
     {
         $this->backendUserMock->uc = [
@@ -142,18 +133,14 @@ final class BackendUserConfigurationTest extends UnitTestCase
         self::assertEquals($expected, $this->backendUserMock->uc);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearsConfiguration(): void
     {
         $this->backendUserMock->expects(self::atLeastOnce())->method('resetUC');
         $this->backendUserConfiguration->clear();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unsetsConfigurationOption(): void
     {
         $this->backendUserMock->uc = [
diff --git a/typo3/sysext/backend/Tests/Unit/Configuration/TranslationConfigurationProviderTest.php b/typo3/sysext/backend/Tests/Unit/Configuration/TranslationConfigurationProviderTest.php
index b1172f0e9adc9b9b4633aa154a79193efab55ed7..3ed66a7adb6280ec2ba55e56a7e95b50567ece70 100644
--- a/typo3/sysext/backend/Tests/Unit/Configuration/TranslationConfigurationProviderTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Configuration/TranslationConfigurationProviderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Configuration\TranslationConfigurationProvider;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Localization\LanguageService;
@@ -40,9 +41,7 @@ final class TranslationConfigurationProviderTest extends UnitTestCase
         $GLOBALS['LANG'] = $this->createMock(LanguageService::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultLanguageIsAlwaysReturned(): void
     {
         $languageService = $this->createMock(LanguageService::class);
@@ -58,9 +57,7 @@ final class TranslationConfigurationProviderTest extends UnitTestCase
         self::assertArrayHasKey(0, $languages);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSystemLanguagesAggregatesLanguagesOfAllSitesForRootLevel(): void
     {
         $siteFinderMock = $this->createMock(SiteFinder::class);
@@ -70,9 +67,7 @@ final class TranslationConfigurationProviderTest extends UnitTestCase
         self::assertCount(3, $languages);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSystemLanguagesConcatenatesTitlesOfLanguagesForRootLevel(): void
     {
         $siteFinderMock = $this->createMock(SiteFinder::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/EditDocumentControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/EditDocumentControllerTest.php
index 7ba17662d0725e70886f1789d5a8a805db4d5d5b..ac2ff665ceaacc90f6a097f08e02385fde5f8293 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/EditDocumentControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/EditDocumentControllerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\EditDocumentController;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -24,10 +26,8 @@ final class EditDocumentControllerTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     * @dataProvider slugDependentFieldsAreAddedToColumnsOnlyDataProvider
-     */
+    #[DataProvider('slugDependentFieldsAreAddedToColumnsOnlyDataProvider')]
+    #[Test]
     public function slugDependentFieldsAreAddedToColumnsOnly(string $result, string $selectedFields, string $tableName, array $configuration): void
     {
         $GLOBALS['TCA'][$tableName]['columns'] = $configuration;
@@ -115,10 +115,8 @@ final class EditDocumentControllerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resolvePreviewRecordIdDataProvider
-     */
+    #[DataProvider('resolvePreviewRecordIdDataProvider')]
+    #[Test]
     public function resolvePreviewRecordIdReturnsExpectedUid(int $expected, array $previewConfiguration): void
     {
         $recordArray = ['uid' => 2, 'l10n_parent' => 1];
@@ -148,10 +146,8 @@ final class EditDocumentControllerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resolvePreviewRecordIdForNonTranslatableTableDataProvider
-     */
+    #[DataProvider('resolvePreviewRecordIdForNonTranslatableTableDataProvider')]
+    #[Test]
     public function resolvePreviewRecordIdReturnsExpectedUidForNonTranslatableTable(int $expected, array $previewConfiguration): void
     {
         $recordArray = ['uid' => 2];
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/Event/AfterPageTreeItemsPreparedEventTest.php b/typo3/sysext/backend/Tests/Unit/Controller/Event/AfterPageTreeItemsPreparedEventTest.php
index 1676c8770ef8640723402e45e18909898660f29a..9d914546265a2e7b829ee3ce0f161f1493875491 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/Event/AfterPageTreeItemsPreparedEventTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/Event/AfterPageTreeItemsPreparedEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\Event\AfterPageTreeItemsPreparedEvent;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Http\Uri;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AfterPageTreeItemsPreparedEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $request = new ServerRequest(new Uri('https://example.com'));
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/Event/ModifyNewContentElementWizardItemsEventTest.php b/typo3/sysext/backend/Tests/Unit/Controller/Event/ModifyNewContentElementWizardItemsEventTest.php
index d2a7633e7d2cce60c4d26c87afba897fb44474d3..7631ad8198b99513bdfd3ee75098f2b0283c21f2 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/Event/ModifyNewContentElementWizardItemsEventTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/Event/ModifyNewContentElementWizardItemsEventTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller\Event;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\Event\ModifyNewContentElementWizardItemsEvent;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -45,9 +47,7 @@ final class ModifyNewContentElementWizardItemsEventTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function wizardItemsModifyTest(): void
     {
         self::assertCount(3, $this->subject->getWizardItems());
@@ -214,10 +214,8 @@ final class ModifyNewContentElementWizardItemsEventTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addWizardItemTestDataProvider
-     */
+    #[DataProvider('addWizardItemTestDataProvider')]
+    #[Test]
     public function addWizardItemTest(string $identifier, array $configuration, array $position, array $expected): void
     {
         $this->subject->setWizardItem($identifier, $configuration, $position);
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/File/FileControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/File/FileControllerTest.php
index 24e2954ef5f77d67378fc360f4921caeeba49203..bf7a21c40a2736ec2a34ec52c8ec0afbcd7cd143 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/File/FileControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/File/FileControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller\File;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Controller\File\FileController;
 use TYPO3\CMS\Backend\Routing\UriBuilder;
@@ -48,9 +49,7 @@ final class FileControllerTest extends UnitTestCase
         $this->fileResourceMock->method('getParentFolder')->willReturn(null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flattenResultDataValueReturnsAnythingElseAsIs(): void
     {
         $subject = $this->getAccessibleMock(FileController::class, ['init', 'main'], [], '', false);
@@ -58,9 +57,7 @@ final class FileControllerTest extends UnitTestCase
         self::assertSame([], $subject->_call('flattenResultDataValue', []));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flattenResultDataValueFlattensFile(): void
     {
         $iconFactoryMock = $this->createMock(IconFactory::class);
@@ -92,9 +89,7 @@ final class FileControllerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processAjaxRequestDeleteProcessActuallyDoesNotChangeFileData(): void
     {
         $subject = $this->getAccessibleMock(
@@ -114,9 +109,7 @@ final class FileControllerTest extends UnitTestCase
         $subject->processAjaxRequest(new ServerRequest());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processAjaxRequestEditFileProcessActuallyDoesNotChangeFileData(): void
     {
         $subject = $this->getAccessibleMock(
@@ -136,9 +129,7 @@ final class FileControllerTest extends UnitTestCase
         $subject->processAjaxRequest(new ServerRequest());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processAjaxRequestReturnsStatus200IfNoErrorOccurs(): void
     {
         $subject = $this->getAccessibleMock(
@@ -158,9 +149,7 @@ final class FileControllerTest extends UnitTestCase
         self::assertEquals(200, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processAjaxRequestReturnsStatus500IfErrorOccurs(): void
     {
         $flashMessageService = new FlashMessageService();
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/File/ThumbnailControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/File/ThumbnailControllerTest.php
index 87e093292e38dbae34691320e3722135b4eb52cb..0fc5790bdd2cf4f08271c7dec818e2e0a24c10e0 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/File/ThumbnailControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/File/ThumbnailControllerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller\File;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Controller\File\ThumbnailController;
 use TYPO3\CMS\Core\Http\Response;
@@ -52,10 +54,9 @@ final class ThumbnailControllerTest extends UnitTestCase
 
     /**
      * @param string|null $hmac
-     *
-     * @test
-     * @dataProvider exceptionIsThrownOnInvalidHMACDataProvider
      */
+    #[DataProvider('exceptionIsThrownOnInvalidHMACDataProvider')]
+    #[Test]
     public function exceptionIsThrownOnInvalidHMAC(string $hmac = null): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -82,10 +83,9 @@ final class ThumbnailControllerTest extends UnitTestCase
 
     /**
      * @param array|null $parameters
-     *
-     * @test
-     * @dataProvider generateThumbnailIsInvokedDataProvider
      */
+    #[DataProvider('generateThumbnailIsInvokedDataProvider')]
+    #[Test]
     public function generateThumbnailIsInvoked(array $parameters = null): void
     {
         $this->subject->expects(self::once())
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/FormInlineAjaxControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/FormInlineAjaxControllerTest.php
index 1a8433685e67a2cb3d78ce89d8c74772d474c4d7..db7bde71f90871e38cf974fb55ca351e719db161 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/FormInlineAjaxControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/FormInlineAjaxControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\FormInlineAjaxController;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -30,9 +31,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createActionThrowsExceptionIfContextIsEmpty(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -47,9 +46,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->createAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createActionThrowsExceptionIfContextConfigSectionIsEmpty(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -64,9 +61,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->createAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createActionThrowsExceptionIfContextConfigSectionDoesNotValidate(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -88,9 +83,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->createAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function detailsActionThrowsExceptionIfContextIsEmpty(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -105,9 +98,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->detailsAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function detailsActionThrowsExceptionIfContextConfigSectionIsEmpty(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -122,9 +113,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->detailsAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function detailsActionThrowsExceptionIfContextConfigSectionDoesNotValidate(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -146,9 +135,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->detailsAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function synchronizeLocalizeActionThrowsExceptionIfContextIsEmpty(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -163,9 +150,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->synchronizeLocalizeAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function synchronizeLocalizeActionThrowsExceptionIfContextConfigSectionIsEmpty(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -180,9 +165,7 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
         (new FormInlineAjaxController())->synchronizeLocalizeAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function synchronizeLocalizeActionThrowsExceptionIfContextConfigSectionDoesNotValidate(): void
     {
         $request = (new ServerRequest())->withQueryParams(
@@ -207,9 +190,8 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
     /**
      * Fallback for IRRE items without inline view attribute
      * @see https://forge.typo3.org/issues/76561
-     *
-     * @test
      */
+    #[Test]
     public function getInlineExpandCollapseStateArraySwitchesToFallbackIfTheBackendUserDoesNotHaveAnUCInlineViewProperty(): void
     {
         $backendUser = $this->createMock(BackendUserAuthentication::class);
@@ -230,9 +212,8 @@ final class FormInlineAjaxControllerTest extends UnitTestCase
     /**
      * Unserialize uc inline view string for IRRE item
      * @see https://forge.typo3.org/issues/76561
-     *
-     * @test
      */
+    #[Test]
     public function getInlineExpandCollapseStateArrayWillUnserializeUCInlineViewPropertyAsAnArrayWithData(): void
     {
         $backendUser = $this->createMock(BackendUserAuthentication::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/FormSelectTreeAjaxControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/FormSelectTreeAjaxControllerTest.php
index 047b3624faff33764a312940b5743a2611188193..93c71e5fd47095d154b62aa29c93ab2c9dd7fd31 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/FormSelectTreeAjaxControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/FormSelectTreeAjaxControllerTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\FormSelectTreeAjaxController;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FormSelectTreeAjaxControllerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function fetchDataActionThrowsExceptionIfTcaOfTableDoesNotExist(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -33,9 +32,7 @@ final class FormSelectTreeAjaxControllerTest extends UnitTestCase
         (new FormSelectTreeAjaxController())->fetchDataAction(new ServerRequest());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fetchDataActionThrowsExceptionIfTcaOfTableFieldDoesNotExist(): void
     {
         $serverRequest = (new ServerRequest())->withQueryParams([
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/LoginControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/LoginControllerTest.php
index 50eb00cd730d5aafb0a0f7989deb3e8c5216f428..571645e4e5ba9efe35da1ace7724391a795ecf00 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/LoginControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/LoginControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\LoginController;
 use TYPO3\CMS\Backend\LoginProvider\LoginProviderResolver;
 use TYPO3\CMS\Backend\Routing\UriBuilder;
@@ -37,9 +38,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LoginControllerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRedirectRedirectsIfLoginIsInProgressAndUserWasFound(): void
     {
         $GLOBALS['LANG'] = $this->createMock(LanguageService::class);
@@ -77,9 +76,7 @@ final class LoginControllerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRedirectDoesNotRedirectIfNoUserIsFound(): void
     {
         $GLOBALS['BE_USER'] = $this->createMock(BackendUserAuthentication::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/SiteConfigurationControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/SiteConfigurationControllerTest.php
index 32bf25874abf7a913d4d060d7493939133983bae..c3d25f4c9b562cc1098d867e35e48439ce7d1ba5 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/SiteConfigurationControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/SiteConfigurationControllerTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\SiteConfigurationController;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SiteConfigurationControllerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function duplicateEntryPointsAreRecognized(): void
     {
         $mockedSiteConfigurationController = $this->getAccessibleMock(SiteConfigurationController::class, null, [], '', false);
@@ -127,9 +126,7 @@ final class SiteConfigurationControllerTest extends UnitTestCase
         self::assertEquals($expected, $mockedSiteConfigurationController->_call('getDuplicatedEntryPoints', $sites, $rootPages));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function languageBaseVariantsAreKept(): void
     {
         $mockedSiteConfigurationController = $this->getAccessibleMock(SiteConfigurationController::class, null, [], '', false);
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/SwitchUserControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/SwitchUserControllerTest.php
index fac0db2ad12804600b909c3e9a5569fa731f41a9..3608b7e61c6bf3eca6a2e72ca2344de56ba50f82 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/SwitchUserControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/SwitchUserControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Controller\SwitchUserController;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -42,9 +43,7 @@ final class SwitchUserControllerTest extends UnitTestCase
         $this->subject = $this->getAccessibleMock(SwitchUserController::class, null, [], '', false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateListOfLatestSwitchedUsersReturnsCorrectAmountAndOrder(): void
     {
         $items = range(1, self::RECENT_USERS_LIMIT + 5);
@@ -57,9 +56,7 @@ final class SwitchUserControllerTest extends UnitTestCase
         self::assertSame($expected, $GLOBALS['BE_USER']->uc['recentSwitchedToUsers']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function listOfLatestSwitchedUsersDoesNotContainTheSameUserTwice(): void
     {
         $GLOBALS['BE_USER']->uc['recentSwitchedToUsers'] = $this->subject->_call('generateListOfMostRecentSwitchedUsers', 100);
diff --git a/typo3/sysext/backend/Tests/Unit/Controller/Wizard/SuggestWizardControllerTest.php b/typo3/sysext/backend/Tests/Unit/Controller/Wizard/SuggestWizardControllerTest.php
index 171e8b494db942940a38bed19bbb5a6247fe40fd..9d58fd7f7f9e675da89a5267abec1bdb1657b9ee 100644
--- a/typo3/sysext/backend/Tests/Unit/Controller/Wizard/SuggestWizardControllerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Controller/Wizard/SuggestWizardControllerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Controller\Wizard;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Controller\Wizard\SuggestWizardController;
 use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SuggestWizardControllerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getFlexFieldConfigurationThrowsExceptionIfSimpleFlexFieldIsNotFound(): void
     {
         $dataStructureIdentifier = '{"type":"tca","tableName":"tt_content","fieldName":"pi_flexform","dataStructureKey":"blog_example,list"}';
@@ -68,9 +68,7 @@ final class SuggestWizardControllerTest extends UnitTestCase
         (new SuggestWizardController())->searchAction($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFlexFieldConfigurationThrowsExceptionIfSectionContainerFlexFieldIsNotFound(): void
     {
         $dataStructureIdentifier = '{"type":"tca","tableName":"tt_content","fieldName":"pi_flexform","dataStructureKey":"blog_example,list"}';
@@ -111,10 +109,8 @@ final class SuggestWizardControllerTest extends UnitTestCase
         (new SuggestWizardController())->searchAction($request);
     }
 
-    /**
-     * @test
-     * @dataProvider isTableHiddenIsProperlyRetrievedDataProvider
-     */
+    #[DataProvider('isTableHiddenIsProperlyRetrievedDataProvider')]
+    #[Test]
     public function isTableHiddenIsProperlyRetrieved(bool $expected, array $array): void
     {
         $subject = $this->getAccessibleMock(SuggestWizardController::class, null, [], '', false);
@@ -132,10 +128,8 @@ final class SuggestWizardControllerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider whereClauseIsProperlyRetrievedDataProvider
-     */
+    #[DataProvider('whereClauseIsProperlyRetrievedDataProvider')]
+    #[Test]
     public function whereClauseIsProperlyRetrieved(string $expected, array $array): void
     {
         $subject = $this->getAccessibleMock(SuggestWizardController::class, null, [], '', false);
diff --git a/typo3/sysext/backend/Tests/Unit/ElementBrowser/ElementBrowserRegistryTest.php b/typo3/sysext/backend/Tests/Unit/ElementBrowser/ElementBrowserRegistryTest.php
index 21c3bda2c80f185f65db42c477a531d763071734..4d51b3525115851876493ef73a9600db386415c3 100644
--- a/typo3/sysext/backend/Tests/Unit/ElementBrowser/ElementBrowserRegistryTest.php
+++ b/typo3/sysext/backend/Tests/Unit/ElementBrowser/ElementBrowserRegistryTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\ElementBrowser;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\ElementBrowser\ElementBrowserInterface;
 use TYPO3\CMS\Backend\ElementBrowser\ElementBrowserRegistry;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ElementBrowserRegistryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function registrationRequiresInterface(): void
     {
         $elementBrowser = [
@@ -40,9 +39,7 @@ final class ElementBrowserRegistryTest extends UnitTestCase
         self::assertTrue($elementBrowserRegistry->hasElementBrowser('valid-identifier'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registrationThrowsExceptionOnEmptyIdentifier(): void
     {
         $elementBrowser = [
@@ -55,9 +52,7 @@ final class ElementBrowserRegistryTest extends UnitTestCase
         new ElementBrowserRegistry($elementBrowser);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registrationThrowsExceptionOnDuplicateIdentifier(): void
     {
         $elementBrowser = [
@@ -71,9 +66,7 @@ final class ElementBrowserRegistryTest extends UnitTestCase
         new ElementBrowserRegistry($elementBrowser);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registrationThrowsExceptionOnRequestingInvalidIdentifier(): void
     {
         $this->expectException(\UnexpectedValueException::class);
diff --git a/typo3/sysext/backend/Tests/Unit/ElementBrowser/Event/IsFileSelectableEventTest.php b/typo3/sysext/backend/Tests/Unit/ElementBrowser/Event/IsFileSelectableEventTest.php
index a5c31470baf886624f91b0a1162319dbe188958b..3a07cc8be3e2512b2474902ce7abeebeab875965 100644
--- a/typo3/sysext/backend/Tests/Unit/ElementBrowser/Event/IsFileSelectableEventTest.php
+++ b/typo3/sysext/backend/Tests/Unit/ElementBrowser/Event/IsFileSelectableEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\ElementBrowser\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\ElementBrowser\Event\IsFileSelectableEvent;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\ResourceStorage;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IsFileSelectableEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function eventMethodsReturnExpected(): void
     {
         $mockResourceStorage = $this->getMockBuilder(ResourceStorage::class)->disableOriginalConstructor()->getMock();
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Container/ListOfFieldsContainerTest.php b/typo3/sysext/backend/Tests/Unit/Form/Container/ListOfFieldsContainerTest.php
index 51ac5867a0bbcaee57b72949bc77a102907890bb..fcdc08a6f5cf8da524aff5d1b1f0bda964ed6216 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/Container/ListOfFieldsContainerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/Container/ListOfFieldsContainerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\Container;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Container\ListOfFieldsContainer;
 use TYPO3\CMS\Backend\Form\Container\PaletteAndSingleContainer;
 use TYPO3\CMS\Backend\Form\NodeFactory;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ListOfFieldsContainerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function renderDelegatesShowitemField(): void
     {
         $nodeFactoryMock = $this->createMock(NodeFactory::class);
@@ -58,9 +57,7 @@ final class ListOfFieldsContainerTest extends UnitTestCase
         (new ListOfFieldsContainer($nodeFactoryMock, $input))->render();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderDelegatesShowitemFieldAndRemovesDuplicates(): void
     {
         $nodeFactoryMock = $this->createMock(NodeFactory::class);
@@ -92,9 +89,7 @@ final class ListOfFieldsContainerTest extends UnitTestCase
         (new ListOfFieldsContainer($nodeFactoryMock, $input))->render();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderDelegatesPaletteFields(): void
     {
         $nodeFactoryMock = $this->createMock(NodeFactory::class);
@@ -134,9 +129,7 @@ final class ListOfFieldsContainerTest extends UnitTestCase
         (new ListOfFieldsContainer($nodeFactoryMock, $input))->render();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderRemovesNotExistingTypesField(): void
     {
         $nodeFactoryMock = $this->createMock(NodeFactory::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Container/PaletteAndSingleContainerTest.php b/typo3/sysext/backend/Tests/Unit/Form/Container/PaletteAndSingleContainerTest.php
index 5fd21703e55a0fcbe919149915b6417070c6ec65..af3b39e7ec1aa820f29bfeb81a6bb44b335a32dd 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/Container/PaletteAndSingleContainerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/Container/PaletteAndSingleContainerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\Container;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Container\PaletteAndSingleContainer;
 use TYPO3\CMS\Backend\Form\Container\SingleFieldContainer;
 use TYPO3\CMS\Backend\Form\NodeFactory;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PaletteAndSingleContainerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function renderUsesPaletteLabelFromFieldArray(): void
     {
         $nodeFactoryMock = $this->createMock(NodeFactory::class);
@@ -89,9 +88,7 @@ final class PaletteAndSingleContainerTest extends UnitTestCase
         self::assertStringContainsString($labelReference, $containerResult['html']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderUsesPaletteValuesFromPaletteArray(): void
     {
         $nodeFactoryMock = $this->createMock(NodeFactory::class);
@@ -156,9 +153,7 @@ final class PaletteAndSingleContainerTest extends UnitTestCase
         self::assertStringContainsString($descriptionReference, $containerResult['html']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderPrefersFieldArrayPaletteValuesOverPaletteValues(): void
     {
         $nodeFactoryMock = $this->createMock(NodeFactory::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Element/AbstractFormElementTest.php b/typo3/sysext/backend/Tests/Unit/Form/Element/AbstractFormElementTest.php
index d4aec7d6e0ae3b7e74073411b083c188ee5426e6..f4100ac81e75568e1cf7bc6d756584b232b65962 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/Element/AbstractFormElementTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/Element/AbstractFormElementTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\Element;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Element\AbstractFormElement;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -265,10 +267,8 @@ final class AbstractFormElementTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider formatValueDataProvider
-     * @test
-     */
+    #[DataProvider('formatValueDataProvider')]
+    #[Test]
     public function formatValueWithGivenConfiguration(array $config, ?string $itemValue, string $expectedResult): void
     {
         $GLOBALS['BE_USER'] = new BackendUserAuthentication();
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Element/DatetimeElementTest.php b/typo3/sysext/backend/Tests/Unit/Form/Element/DatetimeElementTest.php
index e8c6da7d735607c4b212fb512530a2827816fcca..bf351cd1bddc0293e3915906cdcf3922061b24c7 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/Element/DatetimeElementTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/Element/DatetimeElementTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\Element;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Element\DatetimeElement;
 use TYPO3\CMS\Backend\Form\NodeExpansion\FieldInformation;
 use TYPO3\CMS\Backend\Form\NodeFactory;
@@ -75,10 +77,8 @@ final class DatetimeElementTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider renderAppliesCorrectTimestampConversionDataProvider
-     */
+    #[DataProvider('renderAppliesCorrectTimestampConversionDataProvider')]
+    #[Test]
     public function renderAppliesCorrectTimestampConversion(int $input, string $serverTimezone, string $expectedOutput): void
     {
         date_default_timezone_set($serverTimezone);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Element/InputHiddenElementTest.php b/typo3/sysext/backend/Tests/Unit/Form/Element/InputHiddenElementTest.php
index ce22d19e0484e414d86ea232013ece76974acc5b..ab7e7c1b45f7a0822c569b33a6908ee95954b01d 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/Element/InputHiddenElementTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/Element/InputHiddenElementTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\Element;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Element\InputHiddenElement;
 use TYPO3\CMS\Backend\Form\NodeFactory;
 use TYPO3\CMS\Core\Imaging\IconFactory;
@@ -28,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class InputHiddenElementTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsElementsAsAdditionalHiddenFields(): void
     {
         $data = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Element/JsonElementTest.php b/typo3/sysext/backend/Tests/Unit/Form/Element/JsonElementTest.php
index 944edbd2a8be297e5c8ac93635147cf8538ba4fb..ea3ff12d76f65e3007bfe5ec6bcc74e3b206ea40 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/Element/JsonElementTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/Element/JsonElementTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\Element;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Element\JsonElement;
 use TYPO3\CMS\Backend\Form\NodeExpansion\FieldInformation;
 use TYPO3\CMS\Backend\Form\NodeFactory;
@@ -34,9 +35,7 @@ final class JsonElementTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsJsonInStandardTextarea(): void
     {
         $data = [
@@ -70,9 +69,7 @@ final class JsonElementTest extends UnitTestCase
         self::assertStringContainsString('"foo": "bar"', $result['html']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsJsonInCodeEditor(): void
     {
         $data = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/Element/UuidElementTest.php b/typo3/sysext/backend/Tests/Unit/Form/Element/UuidElementTest.php
index 23b8e99fec0d73a547730533c3acb95d244a7470..37ce89ed2a0f0bb76c9e6273e27906be3c24a3dc 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/Element/UuidElementTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/Element/UuidElementTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\Element;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Element\UuidElement;
 use TYPO3\CMS\Backend\Form\NodeExpansion\FieldInformation;
 use TYPO3\CMS\Backend\Form\NodeFactory;
@@ -35,9 +36,7 @@ final class UuidElementTest extends UnitTestCase
         $GLOBALS['LANG'] = $this->createMock(LanguageService::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderThrowsExceptionOnEmptyElementValue(): void
     {
         $data = [
@@ -64,9 +63,7 @@ final class UuidElementTest extends UnitTestCase
         (new UuidElement($this->createMock(NodeFactory::class), $data))->render();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderThrowsExceptionOnInvalidUuid(): void
     {
         $data = [
@@ -93,9 +90,7 @@ final class UuidElementTest extends UnitTestCase
         (new UuidElement($this->createMock(NodeFactory::class), $data))->render();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsInputElementWithUuidAndCopyToClipboardButton(): void
     {
         $uuid = 'b3190536-1431-453e-afbb-25b8c5022513';
@@ -129,9 +124,7 @@ final class UuidElementTest extends UnitTestCase
         self::assertMatchesRegularExpression('/<input.*value="' . $uuid . '".*id="formengine-uuid-/s', $result['html']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsInputElementWithUuidAndWithoutCopyToClipboardButton(): void
     {
         $uuid = 'b3190536-1431-453e-afbb-25b8c5022513';
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FieldControl/ElementBrowserTest.php b/typo3/sysext/backend/Tests/Unit/Form/FieldControl/ElementBrowserTest.php
index 38fa68dc41a47c96686f13b108cc07f3d7fbbe2d..94021f678c3e9833ec4bda8b91b0d7f13898f110 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FieldControl/ElementBrowserTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FieldControl/ElementBrowserTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FieldControl;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FieldControl\ElementBrowser;
 use TYPO3\CMS\Backend\Form\NodeFactory;
 use TYPO3\CMS\Core\Site\Entity\Site;
@@ -24,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ElementBrowserTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function renderTrimsAllowedValuesFromConfigSection(): void
     {
         $nodeFactory = $this->createMock(NodeFactory::class);
@@ -53,9 +53,7 @@ final class ElementBrowserTest extends UnitTestCase
         self::assertSame($result['linkAttributes']['data-params'], '|||be_users,be_groups|');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderTrimsAllowedValues(): void
     {
         $nodeFactory = $this->createMock(NodeFactory::class);
@@ -81,10 +79,8 @@ final class ElementBrowserTest extends UnitTestCase
         self::assertSame($result['linkAttributes']['data-params'], '|||jpg,png|');
     }
 
-    /**
-     * @test
-     * @dataProvider renderResolvesEntryPointDataProvider
-     */
+    #[DataProvider('renderResolvesEntryPointDataProvider')]
+    #[Test]
     public function renderResolvesEntryPoint(array $config, string $expected): void
     {
         $nodeFactory = $this->createMock(NodeFactory::class);
@@ -234,9 +230,7 @@ final class ElementBrowserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderUsesCustomTitle(): void
     {
         $title = 'Custom title';
@@ -265,9 +259,7 @@ final class ElementBrowserTest extends UnitTestCase
         self::assertSame($title, $result['title']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderUsesFallbackTitle(): void
     {
         $nodeFactory = $this->createMock(NodeFactory::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FieldWizard/TableListTest.php b/typo3/sysext/backend/Tests/Unit/Form/FieldWizard/TableListTest.php
index 4b55fa36fcf1c7fd8d5f7ceb90d2dde3e265f05c..db723b6c3f272a4094ef27a29ec9a9750b35010e 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FieldWizard/TableListTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FieldWizard/TableListTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FieldWizard;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FieldWizard\TableList;
 use TYPO3\CMS\Backend\Form\NodeFactory;
 use TYPO3\CMS\Core\Imaging\Icon;
@@ -28,10 +30,8 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TableListTest extends UnitTestCase
 {
-    /**
-     * @test
-     * @dataProvider renderResolvesEntryPointDataProvider
-     */
+    #[DataProvider('renderResolvesEntryPointDataProvider')]
+    #[Test]
     public function renderResolvesEntryPoint(array $config, array $expected): void
     {
         $GLOBALS['TCA'] = [];
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataCompilerTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataCompilerTest.php
index 318c89f0d37e0b96a114d80eb14fd7ce93d2a21c..47e3f6ad9ba797bd5ccd8e845be6d988d12d2b78 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataCompilerTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataCompilerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\FormDataCompiler;
 use TYPO3\CMS\Backend\Form\FormDataGroupInterface;
@@ -35,9 +36,7 @@ final class FormDataCompilerTest extends UnitTestCase
         $this->subject = new FormDataCompiler();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfInputContainsKeysNotValidInResult(): void
     {
         $input = [
@@ -48,9 +47,7 @@ final class FormDataCompilerTest extends UnitTestCase
         $this->subject->compile($input, $this->formDataGroupMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionAtUnknownCommand(): void
     {
         $input = [
@@ -61,9 +58,7 @@ final class FormDataCompilerTest extends UnitTestCase
         $this->subject->compile($input, $this->formDataGroupMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfNoTableNameGiven(): void
     {
         $input = [
@@ -74,9 +69,7 @@ final class FormDataCompilerTest extends UnitTestCase
         $this->subject->compile($input, $this->formDataGroupMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfUidIsNotAnInteger(): void
     {
         $input = [
@@ -87,9 +80,7 @@ final class FormDataCompilerTest extends UnitTestCase
         $this->subject->compile($input, $this->formDataGroupMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfCommandIsEditAndUidIsNegative(): void
     {
         $input = [
@@ -101,9 +92,7 @@ final class FormDataCompilerTest extends UnitTestCase
         $this->subject->compile($input, $this->formDataGroupMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultArrayWithInputDataSet(): void
     {
         $input = [
@@ -119,9 +108,7 @@ final class FormDataCompilerTest extends UnitTestCase
         self::assertEquals('edit', $result['command']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultArrayWithAdditionalDataFormFormDataGroup(): void
     {
         $this->formDataGroupMock->method('compile')->with(self::anything())->willReturnCallback(static function (array $arguments): array {
@@ -138,9 +125,7 @@ final class FormDataCompilerTest extends UnitTestCase
         self::assertEquals('newData', $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfFormDataGroupDoesNotReturnArray(): void
     {
         $this->formDataGroupMock->method('compile')->with(self::anything())->willReturn(null);
@@ -154,9 +139,7 @@ final class FormDataCompilerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfRenderDataIsNotEmpty(): void
     {
         $this->formDataGroupMock->method('compile')->with(self::anything())->willReturn([
@@ -172,9 +155,7 @@ final class FormDataCompilerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfFormDataGroupRemovedKeysFromResultArray(): void
     {
         $this->formDataGroupMock->method('compile')->with(self::anything())->willReturnCallback(static function (array $arguments): array {
@@ -192,9 +173,7 @@ final class FormDataCompilerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfFormDataGroupAddedKeysToResultArray(): void
     {
         $this->formDataGroupMock->method('compile')->with(self::anything())->willReturnCallback(static function (array $arguments): array {
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/FlexFormSegmentTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/FlexFormSegmentTest.php
index 7593640cb9cf7f38a24025eb98bfbd7851feebd8..70f0acd002b139f4beac66beadf60cb3fff2afd4 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/FlexFormSegmentTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/FlexFormSegmentTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataGroup;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataGroup\FlexFormSegment;
 use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
@@ -33,9 +34,7 @@ final class FlexFormSegmentTest extends UnitTestCase
         $this->subject = new FlexFormSegment();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsIncomingData(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -49,9 +48,7 @@ final class FlexFormSegmentTest extends UnitTestCase
         self::assertEquals($input, $this->subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultChangedByDataProvider(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -74,9 +71,7 @@ final class FlexFormSegmentTest extends UnitTestCase
         self::assertEquals(['foo'], $this->subject->compile([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfDataProviderDoesNotImplementInterface(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OnTheFlyTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OnTheFlyTest.php
index 27a6d04b8e4dcf0bdfb3e5488e8701e1f5148f3d..97bc28cb5527eb3dd5e690ff63077ee112dc8a23 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OnTheFlyTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OnTheFlyTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataGroup;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataGroup\OnTheFly;
 use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -32,9 +33,7 @@ final class OnTheFlyTest extends UnitTestCase
         $this->subject = new OnTheFly();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionWithEmptyOnTheFlyList(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -42,9 +41,7 @@ final class OnTheFlyTest extends UnitTestCase
         $this->subject->compile([]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsIncomingData(): void
     {
         $formDataProviderMock = $this->createMock(FormDataProviderInterface::class);
@@ -62,9 +59,7 @@ final class OnTheFlyTest extends UnitTestCase
         self::assertEquals($input, $this->subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultChangedByDataProvider(): void
     {
         $formDataProviderMock = $this->createMock(FormDataProviderInterface::class);
@@ -81,9 +76,7 @@ final class OnTheFlyTest extends UnitTestCase
         self::assertEquals($providerResult, $this->subject->compile([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfDataProviderDoesNotImplementInterface(): void
     {
         $providerList = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OrderedProviderListTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OrderedProviderListTest.php
index b17db627a68d23f449a10bea749a35bcb598fda5..8fc6614e8c406b3cbc55bf5b430584ad927db1c5 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OrderedProviderListTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/OrderedProviderListTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataGroup;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataGroup\OrderedProviderList;
 use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class OrderedProviderListTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsIncomingData(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -41,9 +40,7 @@ final class OrderedProviderListTest extends UnitTestCase
         self::assertEquals($input, $subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultChangedByDataProvider(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -66,9 +63,7 @@ final class OrderedProviderListTest extends UnitTestCase
         self::assertEquals(['foo'], $subject->compile([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileDoesNotCallDisabledDataProvider(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -85,9 +80,7 @@ final class OrderedProviderListTest extends UnitTestCase
         self::assertEquals($input, $subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfImplementationClassDoesNotExist(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -104,9 +97,7 @@ final class OrderedProviderListTest extends UnitTestCase
         $subject->compile([]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfDataProviderDoesNotImplementInterface(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/SiteConfigurationDataGroupTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/SiteConfigurationDataGroupTest.php
index 5e86a791696a858d9d50c4f4eac9a206bc3a0f2f..bc6f5daba3fd3ada57dcee9645dba3ffec1232f3 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/SiteConfigurationDataGroupTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/SiteConfigurationDataGroupTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataGroup;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataGroup\SiteConfigurationDataGroup;
 use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
@@ -33,9 +34,7 @@ final class SiteConfigurationDataGroupTest extends UnitTestCase
         $this->subject = new SiteConfigurationDataGroup();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsIncomingData(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -49,9 +48,7 @@ final class SiteConfigurationDataGroupTest extends UnitTestCase
         self::assertEquals($input, $this->subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultChangedByDataProvider(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -74,9 +71,7 @@ final class SiteConfigurationDataGroupTest extends UnitTestCase
         self::assertEquals(['foo'], $this->subject->compile([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfDataProviderDoesNotImplementInterface(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaDatabaseRecordTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaDatabaseRecordTest.php
index 5fa252d0299af00ed33edfb3de307b1ccd2dcfcc..27afc60e687f909dc4dc1cef5bf85e8e21f66811 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaDatabaseRecordTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaDatabaseRecordTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataGroup;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord;
 use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
@@ -33,9 +34,7 @@ final class TcaDatabaseRecordTest extends UnitTestCase
         $this->subject = new TcaDatabaseRecord();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsIncomingData(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -49,9 +48,7 @@ final class TcaDatabaseRecordTest extends UnitTestCase
         self::assertEquals($input, $this->subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultChangedByDataProvider(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -74,9 +71,7 @@ final class TcaDatabaseRecordTest extends UnitTestCase
         self::assertEquals(['foo'], $this->subject->compile([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfDataProviderDoesNotImplementInterface(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaInputPlaceholderRecordTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaInputPlaceholderRecordTest.php
index c407d482208a0524b853ecdd47af0fa48d1188ab..edb57399975424859511e930cd6561763506c0c9 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaInputPlaceholderRecordTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaInputPlaceholderRecordTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataGroup;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataGroup\TcaInputPlaceholderRecord;
 use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
@@ -33,9 +34,7 @@ final class TcaInputPlaceholderRecordTest extends UnitTestCase
         $this->subject = new TcaInputPlaceholderRecord();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsIncomingData(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -49,9 +48,7 @@ final class TcaInputPlaceholderRecordTest extends UnitTestCase
         self::assertEquals($input, $this->subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultChangedByDataProvider(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -74,9 +71,7 @@ final class TcaInputPlaceholderRecordTest extends UnitTestCase
         self::assertEquals(['foo'], $this->subject->compile([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfDataProviderDoesNotImplementInterface(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaSelectTreeAjaxFieldDataTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaSelectTreeAjaxFieldDataTest.php
index 939985d74bab59bbf5cda1c777302117ccc5969b..2f8174f3a4afa87895960d34abfea9ae32e1bc6e 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaSelectTreeAjaxFieldDataTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataGroup/TcaSelectTreeAjaxFieldDataTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataGroup;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataGroup\TcaSelectTreeAjaxFieldData;
 use TYPO3\CMS\Backend\Form\FormDataProviderInterface;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
@@ -33,9 +34,7 @@ final class TcaSelectTreeAjaxFieldDataTest extends UnitTestCase
         $this->subject = new TcaSelectTreeAjaxFieldData();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsIncomingData(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -49,9 +48,7 @@ final class TcaSelectTreeAjaxFieldDataTest extends UnitTestCase
         self::assertEquals($input, $this->subject->compile($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileReturnsResultChangedByDataProvider(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
@@ -74,9 +71,7 @@ final class TcaSelectTreeAjaxFieldDataTest extends UnitTestCase
         self::assertEquals(['foo'], $this->subject->compile([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compileThrowsExceptionIfDataProviderDoesNotImplementInterface(): void
     {
         $orderingServiceMock = $this->createMock(DependencyOrderingService::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseDefaultLanguagePageRowTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseDefaultLanguagePageRowTest.php
index aac23d7ed8a27a8e5777ab4eff8f1e7407922d63..428506dca00e3f7e2321afce20a3ae715c231156 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseDefaultLanguagePageRowTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseDefaultLanguagePageRowTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseDefaultLanguagePageRow;
 use TYPO3\CMS\Core\Database\Connection;
@@ -38,9 +39,7 @@ final class DatabaseDefaultLanguagePageRowTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotApplyToAnyNonPagesTable(): void
     {
         $input = [
@@ -56,9 +55,7 @@ final class DatabaseDefaultLanguagePageRowTest extends UnitTestCase
         self::assertArrayNotHasKey('defaultLanguagePageRow', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesApplyToAPagesTableButNoChangeForDefaultLanguage(): void
     {
         $input = [
@@ -73,9 +70,7 @@ final class DatabaseDefaultLanguagePageRowTest extends UnitTestCase
         self::assertSame($input, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesApplyToATranslatedPagesTable(): void
     {
         $connectionMock = $this->getMockBuilder(Connection::class)->disableOriginalConstructor()->getMock();
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEditRowTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEditRowTest.php
index d1a8ec91efd240c1086c3fc707f80aeeabcc34b2..d2005304cf62951d3a5503bdd23e61795501beb2 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEditRowTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEditRowTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\Exception\DatabaseRecordException;
 use TYPO3\CMS\Backend\Form\Exception\DatabaseRecordWorkspaceDeletePlaceholderException;
@@ -39,9 +40,7 @@ final class DatabaseEditRowTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRetrievesRecordInformationFromDatabase(): void
     {
         $input = [
@@ -60,9 +59,7 @@ final class DatabaseEditRowTest extends UnitTestCase
         self::assertSame($resultRow, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRetrievedRowHasNoPid(): void
     {
         $input = [
@@ -81,9 +78,7 @@ final class DatabaseEditRowTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfGivenUidIsNotPositive(): void
     {
         $input = [
@@ -98,9 +93,7 @@ final class DatabaseEditRowTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfDatabaseFetchingReturnsNoRow(): void
     {
         $input = [
@@ -116,9 +109,7 @@ final class DatabaseEditRowTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionDatabaseRecordExceptionWithAdditionalInformationSet(): void
     {
         $input = [
@@ -136,9 +127,7 @@ final class DatabaseEditRowTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsWorkspaceDeletePlaceholderExceptionWithDeletePlaceholderRecord(): void
     {
         $connectionMock = $this->getMockBuilder(Connection::class)->disableOriginalConstructor()->getMock();
@@ -165,9 +154,7 @@ final class DatabaseEditRowTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSkipsDatabaseLookupIfDatabaseRowIsPopulated(): void
     {
         $virtualRow = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEffectivePidTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEffectivePidTest.php
index cbb57c013be8e21f58ef49170453b978344b3ce6..3257e47fdee19b5d600dac225def11e3350ede60 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEffectivePidTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseEffectivePidTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseEffectivePid;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class DatabaseEffectivePidTest extends UnitTestCase
         $this->subject = new DatabaseEffectivePid();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUidOfRecordIsPageIsEdited(): void
     {
         $input = [
@@ -47,9 +46,7 @@ final class DatabaseEffectivePidTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsPidOfRecordIfNoPageIsEdited(): void
     {
         $input = [
@@ -64,9 +61,7 @@ final class DatabaseEffectivePidTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUidOfParentPageRowIfParentPageRowExistsAndCommandIsNew(): void
     {
         $input = [
@@ -81,9 +76,7 @@ final class DatabaseEffectivePidTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsZeroWithMissingParentPageRowAndCommandIsNew(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseLanguageRowsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseLanguageRowsTest.php
index 6c48a09e40772959fb65427eccb80958506cb34b..50273c9b8d73b6110684fe25c0cf99e1126a5e41 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseLanguageRowsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseLanguageRowsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Configuration\TranslationConfigurationProvider;
 use TYPO3\CMS\Backend\Form\Exception\DatabaseDefaultLanguageException;
@@ -39,9 +40,7 @@ final class DatabaseLanguageRowsTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsUnchangedResultIfTableProvidesNoTranslations(): void
     {
         $input = [
@@ -58,9 +57,7 @@ final class DatabaseLanguageRowsTest extends UnitTestCase
         self::assertEquals($input, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfDefaultOfLocalizedRecordIsNotFound(): void
     {
         $input = [
@@ -87,9 +84,7 @@ final class DatabaseLanguageRowsTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultLanguageRow(): void
     {
         $input = [
@@ -123,9 +118,7 @@ final class DatabaseLanguageRowsTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDiffSourceFieldIfGiven(): void
     {
         $diffSource = [
@@ -168,9 +161,7 @@ final class DatabaseLanguageRowsTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsAdditionalLanguageRowsIfRequestedInUserTypoScript(): void
     {
         $input = [
@@ -263,9 +254,7 @@ final class DatabaseLanguageRowsTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDoesNotAddHandledRowAsAdditionalLanguageRows(): void
     {
         $input = [
@@ -362,9 +351,7 @@ final class DatabaseLanguageRowsTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsSourceLanguageRow(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabasePageLanguageOverlayRowsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabasePageLanguageOverlayRowsTest.php
index 7e3cf8db5998e5dc286562386cc0a930bba7ad59..94d74b0ac63558a2f7a9eb6b171edb9b242bbdeb 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabasePageLanguageOverlayRowsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabasePageLanguageOverlayRowsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabasePageLanguageOverlayRows;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -33,9 +34,7 @@ final class DatabasePageLanguageOverlayRowsTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsPageLanguageOverlayRows(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseParentPageRowTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseParentPageRowTest.php
index 9ce3abc8a185fa5a9c88a48b8ba45f49b5412823..ac90b45a0994b3750212599e75388fa554af1012 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseParentPageRowTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseParentPageRowTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseParentPageRow;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -33,9 +34,7 @@ final class DatabaseParentPageRowTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataFetchesParentPageRowOfRecordIfNeighbourGiven(): void
     {
         $input = [
@@ -64,9 +63,7 @@ final class DatabaseParentPageRowTest extends UnitTestCase
         self::assertSame($parentPageRow, $result['parentPageRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsNeighborRowIfNegativeUidGiven(): void
     {
         $input = [
@@ -99,9 +96,7 @@ final class DatabaseParentPageRowTest extends UnitTestCase
         self::assertSame($neighborRow, $result['neighborRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParentPageRowToNullIfParentIsRoot(): void
     {
         $input = [
@@ -120,9 +115,7 @@ final class DatabaseParentPageRowTest extends UnitTestCase
         self::assertNull($result['parentPageRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParentPageToGivenPageIdIfCommandIsNew(): void
     {
         $input = [
@@ -145,9 +138,7 @@ final class DatabaseParentPageRowTest extends UnitTestCase
         self::assertSame($parentPageRow, $result['parentPageRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParentPageRowOnParentIfCommandIsEdit(): void
     {
         $input = [
@@ -173,9 +164,7 @@ final class DatabaseParentPageRowTest extends UnitTestCase
         self::assertSame($parentPageRow, $result['parentPageRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParentPageRowOnNullWithNew(): void
     {
         $input = [
@@ -192,9 +181,7 @@ final class DatabaseParentPageRowTest extends UnitTestCase
         self::assertNull($result['parentPageRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParentPageRowOnNullWithZero(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordOverrideValuesTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordOverrideValuesTest.php
index 1bcadc573b3cd753f72a9cfe2c42f6a78894036f..5593953355ec3bfa61b9fd626c74f74063e9b598 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordOverrideValuesTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordOverrideValuesTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRecordOverrideValues;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class DatabaseRecordOverrideValuesTest extends UnitTestCase
         $this->subject = new DatabaseRecordOverrideValues();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnSameDataIfNoOverrideValuesSet(): void
     {
         $input = [
@@ -57,9 +56,7 @@ final class DatabaseRecordOverrideValuesTest extends UnitTestCase
         self::assertSame($input, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDatabaseRowAndTcaType(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordTypeValueTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordTypeValueTest.php
index 52512f5420e2ea9d920f46637559c081fd17feac..9ac8a7c1883e94e9a430601d471e3d8f29fa8496 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordTypeValueTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRecordTypeValueTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRecordTypeValue;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -33,9 +34,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfTcaTypesAreEmpty(): void
     {
         $input = [
@@ -51,9 +50,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsExistingTcaRecordTypeValue(): void
     {
         $input = [
@@ -68,9 +65,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsExistingTcaRecordTypeValueWithValueZero(): void
     {
         $input = [
@@ -85,9 +80,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsRecordTypeValueToHistoricalOneIfTypeZeroIsNotDefined(): void
     {
         $input = [
@@ -103,9 +96,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsRecordTypeValueToZero(): void
     {
         $input = [
@@ -123,9 +114,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfTypePointsToANotExistingField(): void
     {
         $input = [
@@ -150,9 +139,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsRecordTypeValueToValueOfDatabaseField(): void
     {
         $input = [
@@ -176,9 +163,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsRecordTypeValueToZeroIfValueOfDatabaseFieldIsNotDefinedInTca(): void
     {
         $input = [
@@ -202,9 +187,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsRecordTypeValueToZeroIfValueOfDatabaseFieldIsEmptyString(): void
     {
         $input = [
@@ -228,9 +211,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfValueTypesNotExistsAndNoFallbackExists(): void
     {
         $input = [
@@ -255,9 +236,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForForeignTypeConfigurationNotAsSelectOrGroup(): void
     {
         $input = [
@@ -285,9 +264,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForForeignTypeIfPointerConfigurationHasNoTable(): void
     {
         $input = [
@@ -319,9 +296,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTypeValueFromForeignTableRecord(): void
     {
         $input = [
@@ -363,9 +338,7 @@ final class DatabaseRecordTypeValueTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTypeValueFromNestedTcaGroupField(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDateTimeFieldsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDateTimeFieldsTest.php
index 2d82edf168537ced14f15a7525be0d5804b79ca5..5d236652838cc1ac3699aa14da18639a88b1659e 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDateTimeFieldsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDateTimeFieldsTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowDateTimeFields;
 use TYPO3\CMS\Core\Database\Query\QueryHelper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTimestampZeroForDefaultDateField(): void
     {
         $input = [
@@ -46,9 +45,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         self::assertEquals($expected, (new DatabaseRowDateTimeFields())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTimestampNullForDefaultDateField(): void
     {
         $input = [
@@ -78,9 +75,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         self::assertSame($expected, $actual['databaseRow']['aField']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTimestampZeroForDefaultDateTimeField(): void
     {
         $input = [
@@ -101,9 +96,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         self::assertEquals($expected, (new DatabaseRowDateTimeFields())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTimestampNullForDefaultDateTimeField(): void
     {
         $input = [
@@ -135,9 +128,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         self::assertSame($expected, $actual['databaseRow']['aField']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTimestampZeroForDefaultTimeField(): void
     {
         $input = [
@@ -158,9 +149,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         self::assertEquals($expected, (new DatabaseRowDateTimeFields())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTimestampNullForDefaultTimeField(): void
     {
         $input = [
@@ -189,9 +178,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         self::assertSame($expected, $actual['databaseRow']['aField']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataConvertsDateStringToTimestamp(): void
     {
         $oldTimezone = date_default_timezone_get();
@@ -218,9 +205,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         date_default_timezone_set($oldTimezone);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataConvertsDateTimeStringToTimestamp(): void
     {
         $oldTimezone = date_default_timezone_get();
@@ -247,9 +232,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         date_default_timezone_set($oldTimezone);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataConvertsTimeStringToTimestamp(): void
     {
         $oldTimezone = date_default_timezone_get();
@@ -276,9 +259,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         date_default_timezone_set($oldTimezone);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataConvertsMidnightTimeStringOfNullableFieldToDefaultValue(): void
     {
         $oldTimezone = date_default_timezone_get();
@@ -307,9 +288,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         date_default_timezone_set($oldTimezone);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataConvertsMidnightTimeStringOfNullableFieldToNull(): void
     {
         $oldTimezone = date_default_timezone_get();
@@ -338,9 +317,7 @@ final class DatabaseRowDateTimeFieldsTest extends UnitTestCase
         date_default_timezone_set($oldTimezone);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAppliesResetValueForEmptyValue(): void
     {
         foreach (QueryHelper::getDateTimeTypes() as $dbType) {
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultAsReadonlyTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultAsReadonlyTest.php
index 3c42fd54939f73112c9b8120aae59cfb4fef2b49..ef834ce214df5a828053cf975bf835dbce1480ab 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultAsReadonlyTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultAsReadonlyTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowDefaultAsReadonly;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DatabaseRowDefaultAsReadonlyTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReplacesCurrentDatabaseValue(): void
     {
         $input = [
@@ -60,10 +60,8 @@ final class DatabaseRowDefaultAsReadonlyTest extends UnitTestCase
         self::assertEquals($expected, (new DatabaseRowDefaultAsReadonly())->addData($input));
     }
 
-    /**
-     * @test
-     * @dataProvider addDataDoesNotReplaceCurrentDatabaseValueDataProvider
-     */
+    #[DataProvider('addDataDoesNotReplaceCurrentDatabaseValueDataProvider')]
+    #[Test]
     public function addDataDoesNotReplaceCurrentDatabaseValue(array $input): void
     {
         self::assertEquals(
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultValuesTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultValuesTest.php
index 88d8a9c2b4df66152a46b0016866e68e2b44d1f6..38c96071789745f7a8b5f8c25823202e5fb2e0c1 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultValuesTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowDefaultValuesTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowDefaultValues;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class DatabaseRowDefaultValuesTest extends UnitTestCase
         $this->subject = new DatabaseRowDefaultValues();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsExistingValue(): void
     {
         $input = [
@@ -49,9 +48,7 @@ final class DatabaseRowDefaultValuesTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsExistingNullValueWithEvalNull(): void
     {
         $input = [
@@ -72,9 +69,7 @@ final class DatabaseRowDefaultValuesTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsNullValueWithDefaultNullForNewRecord(): void
     {
         $input = [
@@ -95,9 +90,7 @@ final class DatabaseRowDefaultValuesTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultValueIfEvalNullIsSet(): void
     {
         $input = [
@@ -118,9 +111,7 @@ final class DatabaseRowDefaultValuesTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultValueIsSet(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowInitializeNewTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowInitializeNewTest.php
index 5fc3c396f09522d5c00d19386deccdc6605df268..df675a6533ed95b41ebd4ab92fab3f9aed02e8dd 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowInitializeNewTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseRowInitializeNewTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowInitializeNew;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DatabaseRowInitializeNewTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnSameDataIfCommandIsEdit(): void
     {
         $input = [
@@ -45,9 +44,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($input, (new DatabaseRowInitializeNew())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfDatabaseRowIsNotArray(): void
     {
         $input = [
@@ -60,9 +57,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         (new DatabaseRowInitializeNew())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsGivenDefaultsIfCommandIsNew(): void
     {
         $input = [
@@ -81,9 +76,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, (new DatabaseRowInitializeNew())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultDataFromUserTsIfColumnIsDefinedInTca(): void
     {
         $input = [
@@ -115,9 +108,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotSetDefaultDataFromUserTsIfColumnIsMissingInTca(): void
     {
         $input = [
@@ -146,9 +137,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultDataFromPageTsIfColumnIsDefinedInTca(): void
     {
         $input = [
@@ -180,9 +169,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotSetDefaultDataFromPageTsIfColumnIsMissingInTca(): void
     {
         $input = [
@@ -211,9 +198,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultDataOverrulingFromPageTs(): void
     {
         $input = [
@@ -252,9 +237,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultFromNeighborRow(): void
     {
         $input = [
@@ -284,9 +267,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultDataOverrulingFromNeighborRow(): void
     {
         $input = [
@@ -330,9 +311,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultDataFromDefaultValuesIfColumnIsDefinedInTca(): void
     {
         $input = [
@@ -362,9 +341,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotSetDefaultDataFromDefaultValuesIfColumnIsMissingInTca(): void
     {
         $input = [
@@ -398,9 +375,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultDataOverrulesOtherDefaults(): void
     {
         $input = [
@@ -449,9 +424,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionWithGivenChildChildUidButMissingInlineConfig(): void
     {
         $input = [
@@ -467,9 +440,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         (new DatabaseRowInitializeNew())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionWithGivenChildChildUidButIsNotInteger(): void
     {
         $input = [
@@ -485,9 +456,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         (new DatabaseRowInitializeNew())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsForeignSelectorFieldToValueOfChildChildUid(): void
     {
         $input = [
@@ -517,9 +486,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, (new DatabaseRowInitializeNew())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfForeignSelectorDoesNotPointToGroupOrSelectField(): void
     {
         $input = [
@@ -547,9 +514,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         (new DatabaseRowInitializeNew())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfInlineParentLanguageIsNoInteger(): void
     {
         $input = [
@@ -577,9 +542,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         (new DatabaseRowInitializeNew())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsSysLanguageUidFromParent(): void
     {
         $input = [
@@ -612,9 +575,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsPidToVanillaUid(): void
     {
         $input = [
@@ -632,9 +593,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, $result['databaseRow']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotUsePageTsValueForPidIfRecordIsNotInlineChild(): void
     {
         $input = [
@@ -658,9 +617,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, (new DatabaseRowInitializeNew())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfPageTsConfigPidValueCanNotBeInterpretedAsInteger(): void
     {
         $input = [
@@ -684,9 +641,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         (new DatabaseRowInitializeNew())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesUsePageTsValueForPidIfRecordIsInlineChild(): void
     {
         $input = [
@@ -710,9 +665,7 @@ final class DatabaseRowInitializeNewTest extends UnitTestCase
         self::assertSame($expected, (new DatabaseRowInitializeNew())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUidOfParentFieldIfRecordIsInlineChild(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php
index 05217628bb2cdc89cbec40f0da17f9853518bfa5..efc63a99c700f9fe1a32d8c84af013b7e973b00c 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseSystemLanguageRowsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseSystemLanguageRows;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Http\Uri;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DatabaseSystemLanguageRowsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfSiteObjectIsNotSet(): void
     {
         $this->expectException(\LogicException::class);
@@ -37,9 +36,7 @@ final class DatabaseSystemLanguageRowsTest extends UnitTestCase
         (new DatabaseSystemLanguageRows())->addData([]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultLanguageAndAllEntries(): void
     {
         $languageService = $this->createMock(LanguageService::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUniqueUidNewRowTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUniqueUidNewRowTest.php
index 905197c15bb5b8a5a4fed875d6df3edaed7f34eb..3b957386d154b7454147d0909f7f691a8a2aec21 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUniqueUidNewRowTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUniqueUidNewRowTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseUniqueUidNewRow;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class DatabaseUniqueUidNewRowTest extends UnitTestCase
         $this->subject = new DatabaseUniqueUidNewRow();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnSameDataIfCommandIsEdit(): void
     {
         $input = [
@@ -44,9 +43,7 @@ final class DatabaseUniqueUidNewRowTest extends UnitTestCase
         self::assertSame($input, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsGivenUidIfAlreadySet(): void
     {
         $input = [
@@ -59,9 +56,7 @@ final class DatabaseUniqueUidNewRowTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfUidIsAlreadySetButDoesNotStartWithNewKeyword(): void
     {
         $input = [
@@ -75,9 +70,7 @@ final class DatabaseUniqueUidNewRowTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUniqueId(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUserPermissionCheckTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUserPermissionCheckTest.php
index b6f4ab457422088735f53758e3856150090acaa4..06e8dc35a9a22ff8382059179d97f7a2f166e10f 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUserPermissionCheckTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/DatabaseUserPermissionCheckTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Backend\Form\Event\ModifyEditFormUserAccessEvent;
@@ -47,9 +48,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         $GLOBALS['BE_USER']->user['uid'] = 42;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUserPermissionsOnPageForAdminUser(): void
     {
         $this->beUserMock->method('isAdmin')->willReturn(true);
@@ -59,9 +58,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::ALL, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfUserHasNoTablesModifyPermissionForGivenTable(): void
     {
         $input = [
@@ -76,9 +73,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfUserHasNoContentEditPermissionsOnPage(): void
     {
         $input = [
@@ -104,9 +99,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsUserPermissionsOnPageForContentIfUserHasCorrespondingPermissions(): void
     {
         $input = [
@@ -131,9 +124,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::CONTENT_EDIT, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfCommandIsEditTableIsPagesAndUserHasNoPagePermissions(): void
     {
         $input = [
@@ -158,9 +149,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfCommandIsEditTableIsPagesAndUserHasNoDoktypePermissions(): void
     {
         $input = [
@@ -201,9 +190,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsUserPermissionsOnPageIfTableIsPagesAndUserHasPagePermissions(): void
     {
         $input = [
@@ -243,9 +230,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::PAGE_EDIT, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsPermissionsToAllIfRootLevelRestrictionForTableIsIgnoredForContentEditRecord(): void
     {
         $input = [
@@ -270,9 +255,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::ALL, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRootNodeShouldBeEditedWithoutPermissions(): void
     {
         $input = [
@@ -297,9 +280,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRecordEditAccessInternalsReturnsFalse(): void
     {
         $input = [
@@ -326,9 +307,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForNewContentRecordWithoutPermissions(): void
     {
         $input = [
@@ -354,9 +333,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForNewPageWithoutPermissions(): void
     {
         $input = [
@@ -384,9 +361,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfHookDeniesAccess(): void
     {
         $input = [
@@ -418,9 +393,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         (new DatabaseUserPermissionCheck())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUserPermissionsOnPageForNewPageIfPageNewIsDeniedAndHookAllowsAccess(): void
     {
         $input = [
@@ -451,9 +424,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::CONTENT_EDIT, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUserPermissionsOnPageForNewPage(): void
     {
         $input = [
@@ -478,9 +449,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::PAGE_NEW, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUserPermissionsOnPageForNewContentRecord(): void
     {
         $input = [
@@ -505,9 +474,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::CONTENT_EDIT, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsPermissionsToAllIfRootLevelRestrictionForTableIsIgnoredForNewContentRecord(): void
     {
         $input = [
@@ -529,9 +496,7 @@ final class DatabaseUserPermissionCheckTest extends UnitTestCase
         self::assertSame(Permission::ALL, $result['userPermissionOnPage']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForNewRecordsOnRootLevelWithoutPermissions(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php
index c8d39a891fa5edcb2376cf58827f62061ef27338..23eef29d5b9106f144fcf89e98666a510f7009c7 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\EvaluateDisplayConditions;
 use TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider\Fixtures\EvaluateDisplayConditionsTestClass;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class EvaluateDisplayConditionsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfMultipleConditionsAreNotCombinedWithAndOrOr(): void
     {
         $input = [
@@ -50,9 +50,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIAConditionHasNoStringAsKey(): void
     {
         $input = [
@@ -72,9 +70,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfConditionIsNotStringOrArray(): void
     {
         $input = [
@@ -92,9 +88,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfConditionTypeIsUnknown(): void
     {
         $input = [
@@ -112,9 +106,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionHasNoFieldName(): void
     {
         $input = [
@@ -132,9 +124,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionHasNoOperator(): void
     {
         $input = [
@@ -152,9 +142,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionHasInvalidOperator(): void
     {
         $input = [
@@ -172,9 +160,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionHasNoOperand(): void
     {
         $input = [
@@ -192,9 +178,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionReqHasInvalidOperand(): void
     {
         $input = [
@@ -212,9 +196,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionNumberComparisonHasInvalidOperand(): void
     {
         $input = [
@@ -232,9 +214,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionRangeComparisonHasInvalidOperand(): void
     {
         $input = [
@@ -252,9 +232,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFieldConditionRangeComparisonHasInvalidMaxOperand(): void
     {
         $input = [
@@ -272,9 +250,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRecordConditionHasNoNewKeyword(): void
     {
         $input = [
@@ -292,9 +268,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRecordConditionHasInvalidNewKeyword(): void
     {
         $input = [
@@ -312,9 +286,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRecordConditionHasNoOperand(): void
     {
         $input = [
@@ -332,9 +304,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRecordConditionHasInvalidOperand(): void
     {
         $input = [
@@ -352,9 +322,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRecordConditionHasNoUidInDatabaseRow(): void
     {
         $input = [
@@ -372,9 +340,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfVersionConditionHasNoIsKeyword(): void
     {
         $input = [
@@ -392,9 +358,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfVersionConditionHasInvalidIsKeyword(): void
     {
         $input = [
@@ -412,9 +376,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfVersionConditionHasNoOperand(): void
     {
         $input = [
@@ -432,9 +394,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfVersionConditionHasInvalidOperand(): void
     {
         $input = [
@@ -452,9 +412,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfVersionConditionHasNoUidInDatabaseRow(): void
     {
         $input = [
@@ -472,9 +430,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfUserConditionHasNoUserfuncSpecified(): void
     {
         $input = [
@@ -492,9 +448,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataEvaluatesUserCondition(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -512,9 +466,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataPassesFlexContextToUserCondition(): void
     {
         $input = [
@@ -548,9 +500,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         self::assertSame($expected, (new EvaluateDisplayConditions())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFlexSheetNameAndFieldNameCombinationsOverlap(): void
     {
         $input = [
@@ -588,9 +538,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFlexSheetConditionReferencesFieldFromSameSheet(): void
     {
         $input = [
@@ -622,9 +570,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataTrowsExceptionIfFlexFieldSheetConditionReferencesNotExistingFieldValue(): void
     {
         $input = [
@@ -654,9 +600,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFlexFieldFieldConditionReferencesNotExistingFieldValue(): void
     {
         $input = [
@@ -690,9 +634,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFlexFieldReferencingFlexFieldIsNotFoundInFieldValue(): void
     {
         $input = [
@@ -725,9 +667,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         (new EvaluateDisplayConditions())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfFlexSectionContainerFoundNoReferencedFieldValue(): void
     {
         $input = [
@@ -3500,10 +3440,8 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addDataRemovesTcaReferencingOtherFieldsInDisplayConditionDataProvider
-     */
+    #[DataProvider('addDataRemovesTcaReferencingOtherFieldsInDisplayConditionDataProvider')]
+    #[Test]
     public function addDataRemovesTcaReferencingOtherFieldsInDisplayCondition(string $processedTcaFieldToBeRemovedPath, array $databaseRow, array $processedTca): void
     {
         $input = [
@@ -3764,9 +3702,9 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
     /**
      * @param string $condition
      * @param string $expectedResult
-     * @dataProvider conditionStringDataProvider
-     * @test
      */
+    #[DataProvider('conditionStringDataProvider')]
+    #[Test]
     public function matchConditionStrings($condition, array $record, $expectedResult): void
     {
         $input = [
@@ -3798,9 +3736,9 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
     /**
      * @param string $condition
      * @param string $expectedResult
-     * @dataProvider conditionStringDataProvider
-     * @test
      */
+    #[DataProvider('conditionStringDataProvider')]
+    #[Test]
     public function matchConditionStringsWithRecordTestFieldBeingArray($condition, array $record, $expectedResult): void
     {
         $input = [
@@ -3837,9 +3775,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         self::assertSame($expected, (new EvaluateDisplayConditions())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchHideForNonAdminsReturnsTrueIfBackendUserIsAdmin(): void
     {
         $input = [
@@ -3866,9 +3802,7 @@ final class EvaluateDisplayConditionsTest extends UnitTestCase
         self::assertSame($expected, (new EvaluateDisplayConditions())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchHideForNonAdminsReturnsFalseIfBackendUserIsNotAdmin(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InitializeProcessedTcaTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InitializeProcessedTcaTest.php
index c5b2ab98fa0d2001037ffbb5507b27467f4e1fba..f0cb2a364c40f95cf5c744502adece316b8bc414 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InitializeProcessedTcaTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InitializeProcessedTcaTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\InitializeProcessedTca;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class InitializeProcessedTcaTest extends UnitTestCase
         $this->subject = new InitializeProcessedTca();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsTableTcaFromGlobalsInResult(): void
     {
         $input = [
@@ -46,9 +45,7 @@ final class InitializeProcessedTcaTest extends UnitTestCase
         self::assertEquals($expected, $result['processedTca']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsGivenProcessedTca(): void
     {
         $input = [
@@ -63,9 +60,7 @@ final class InitializeProcessedTcaTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfGlobalTableTcaIsNotSet(): void
     {
         $input = [
@@ -78,9 +73,7 @@ final class InitializeProcessedTcaTest extends UnitTestCase
         $this->subject->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfGlobalTableTcaIsNotAnArray(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InlineOverrideChildTcaTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InlineOverrideChildTcaTest.php
index 7f00b8c75fe1c5f0820b23678a1035948a07b9e5..a7b0c1ec1cff225981b76d885fd24fa2c769a387 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InlineOverrideChildTcaTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/InlineOverrideChildTcaTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\InlineOverrideChildTca;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class InlineOverrideChildTcaTest extends UnitTestCase
         $this->subject = new InlineOverrideChildTca();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataOverrulesShowitemByGivenOverrideChildTca(): void
     {
         $input = [
@@ -63,9 +62,7 @@ final class InlineOverrideChildTcaTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsTypeShowitemByGivenOverrideChildTca(): void
     {
         $input = [
@@ -100,9 +97,7 @@ final class InlineOverrideChildTcaTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMergesForeignSelectorFieldTcaOverride(): void
     {
         $input = [
@@ -157,9 +152,7 @@ final class InlineOverrideChildTcaTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultValueForChildRecordColumn(): void
     {
         $input = [
@@ -189,9 +182,7 @@ final class InlineOverrideChildTcaTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForRestrictedField(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/PageTsConfigMergedTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/PageTsConfigMergedTest.php
index 8456244ab9c95d675175e558b68ced48f2cf40e1..0c648c911f3555b287e21daeb4e0fd5d3b74c625 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/PageTsConfigMergedTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/PageTsConfigMergedTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\PageTsConfigMerged;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class PageTsConfigMergedTest extends UnitTestCase
         $this->subject = new PageTsConfigMerged();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsMergedTsConfigToTsConfig(): void
     {
         $input = [
@@ -47,9 +46,7 @@ final class PageTsConfigMergedTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsTableSpecificConfigurationWithoutType(): void
     {
         $input = [
@@ -70,9 +67,7 @@ final class PageTsConfigMergedTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMergesTypeSpecificConfiguration(): void
     {
         $input = [
@@ -105,9 +100,7 @@ final class PageTsConfigMergedTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataTypeSpecificConfigurationOverwritesMainConfiguration(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteDatabaseEditRowTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteDatabaseEditRowTest.php
index e3f3448b59428a3253a029ef8a0720f9ecf9c8ca..6eb6ea55d9fb8a6fe22a84aa3ceb2c75f3e4d6fc 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteDatabaseEditRowTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteDatabaseEditRowTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\SiteDatabaseEditRow;
 use TYPO3\CMS\Core\Configuration\SiteConfiguration;
 use TYPO3\CMS\Core\Core\ApplicationContext;
@@ -45,9 +46,7 @@ final class SiteDatabaseEditRowTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotChangeResultIfCommandIsNotEdit(): void
     {
         $input = [
@@ -58,9 +57,7 @@ final class SiteDatabaseEditRowTest extends UnitTestCase
         self::assertSame($input, (new SiteDatabaseEditRow($siteConfigurationMock))->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotChangeResultIfDatabaseRowIsNotEmpty(): void
     {
         $input = [
@@ -73,9 +70,7 @@ final class SiteDatabaseEditRowTest extends UnitTestCase
         self::assertSame($input, (new SiteDatabaseEditRow($siteConfigurationMock))->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfTableNameIsNotExpected(): void
     {
         $input = [
@@ -90,9 +85,7 @@ final class SiteDatabaseEditRowTest extends UnitTestCase
         (new SiteDatabaseEditRow($siteConfigurationMock))->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDataForSysSite(): void
     {
         $input = [
@@ -130,9 +123,7 @@ final class SiteDatabaseEditRowTest extends UnitTestCase
         self::assertEquals($expected, (new SiteDatabaseEditRow($siteConfiguration))->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionWithInvalidErrorHandling(): void
     {
         $input = [
@@ -158,9 +149,7 @@ final class SiteDatabaseEditRowTest extends UnitTestCase
         (new SiteDatabaseEditRow($siteConfiguration))->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionWithInvalidLanguage(): void
     {
         $input = [
@@ -186,9 +175,7 @@ final class SiteDatabaseEditRowTest extends UnitTestCase
         (new SiteDatabaseEditRow($siteConfiguration))->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddLanguageRow(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteResolvingTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteResolvingTest.php
index 6655c5dcd26aa4f5afff9f19f6b53db1eb1b0708..81636726d55c44388ccb66acfc002aac751e9cac 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteResolvingTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/SiteResolvingTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\SiteResolving;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Core\Site\SiteFinder;
@@ -26,9 +27,7 @@ final class SiteResolvingTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsSiteObjectOfDefaultLanguageRow(): void
     {
         $siteFinderMock = $this->createMock(SiteFinder::class);
@@ -47,9 +46,7 @@ final class SiteResolvingTest extends UnitTestCase
         self::assertSame($expected, (new SiteResolving($siteFinderMock))->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsSiteObjectOfEffectivePid(): void
     {
         $siteFinderMock = $this->createMock(SiteFinder::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaCheckboxItemsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaCheckboxItemsTest.php
index d705dee1c7bbb3c9c42afced3f666dbba0e1cfa7..77b7ae54cf998f91755861d84f5f9c7ee3bc44e1 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaCheckboxItemsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaCheckboxItemsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaCheckboxItems;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
@@ -377,10 +379,8 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider checkboxConfigurationDataProvider
-     */
+    #[DataProvider('checkboxConfigurationDataProvider')]
+    #[Test]
     public function addDataKeepExistingItems(array $input, array $expectedResult): void
     {
         $languageService = $this->createMock(LanguageService::class);
@@ -390,9 +390,7 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         self::assertSame($expectedResult, (new TcaCheckboxItems())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfItemsAreNoArray(): void
     {
         $input = [
@@ -420,9 +418,7 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         (new TcaCheckboxItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfItemLabelIsNotSet(): void
     {
         $input = [
@@ -452,9 +448,7 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         (new TcaCheckboxItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataTranslatesItemLabels(): void
     {
         $input = [
@@ -487,9 +481,7 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         self::assertSame($expected, (new TcaCheckboxItems())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCallsItemsProcFunc(): void
     {
         $input = [
@@ -531,9 +523,7 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         self::assertSame('foo', $items[0]['label']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataItemsProcFuncReceivesParameters(): void
     {
         $input = [
@@ -619,9 +609,7 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         (new TcaCheckboxItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataItemsProcFuncEnqueuesFlashMessageOnException(): void
     {
         $input = [
@@ -685,9 +673,7 @@ final class TcaCheckboxItemsTest extends UnitTestCase
         (new TcaCheckboxItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataTranslatesItemLabelsFromPageTsConfig(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
index 61ac2d5133bd49d8790c104ad56e721c2776c056..bc553a99c22a8111260617d7aa1fe504ffe8e8e9 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsOverrides;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +32,7 @@ final class TcaColumnsOverridesTest extends UnitTestCase
         $this->subject = new TcaColumnsOverrides();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesGivenColumnsOverrides(): void
     {
         $input = [
@@ -56,9 +56,7 @@ final class TcaColumnsOverridesTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMergesColumnsOverridesIntoColumns(): void
     {
         $input = [
@@ -92,9 +90,7 @@ final class TcaColumnsOverridesTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMergesColumnsOverridesDefaultValueIntoDatabaseRow(): void
     {
         $input = [
@@ -172,10 +168,8 @@ final class TcaColumnsOverridesTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addDataRespectsTSconfigDefaultValuesForNewRecordsDataProvider
-     */
+    #[DataProvider('addDataRespectsTSconfigDefaultValuesForNewRecordsDataProvider')]
+    #[Test]
     public function addDataRespectsTSconfigDefaultValuesForNewRecords(array $result): void
     {
         $input = array_replace_recursive([
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessCommonTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessCommonTest.php
index 033fa6eb049358e5c33dba26a8a76dc209fb6b52..62e16bb44920ab6ded641cb68326559be06f82a3 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessCommonTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessCommonTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessCommon;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaColumnsProcessCommonTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersOrigUidColumn(): void
     {
         $input = [
@@ -42,9 +41,7 @@ final class TcaColumnsProcessCommonTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessCommon())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersRecordTypeColumn(): void
     {
         $input = [
@@ -62,9 +59,7 @@ final class TcaColumnsProcessCommonTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessCommon())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersRecordTypeRelationColumn(): void
     {
         $input = [
@@ -82,9 +77,7 @@ final class TcaColumnsProcessCommonTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessCommon())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersLanguageFieldColumn(): void
     {
         $input = [
@@ -102,9 +95,7 @@ final class TcaColumnsProcessCommonTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessCommon())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersTransOrigPointerColumn(): void
     {
         $input = [
@@ -122,9 +113,7 @@ final class TcaColumnsProcessCommonTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessCommon())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersTransOrigDiffSourceColumn(): void
     {
         $input = [
@@ -142,9 +131,7 @@ final class TcaColumnsProcessCommonTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessCommon())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersSingleSubtypesAddlistFields(): void
     {
         $input = [
@@ -171,9 +158,7 @@ final class TcaColumnsProcessCommonTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessCommon())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersMultipleSubtypesAddlistFields(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldDescriptionsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldDescriptionsTest.php
index 43b2461b787753b75e23fc5994fea9c6feae5e8e..8e0bd97b7aab437c3564eb021944a280800212ad 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldDescriptionsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldDescriptionsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessFieldDescriptions;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Localization\LanguageService;
@@ -34,9 +35,7 @@ final class TcaColumnsProcessFieldDescriptionsTest extends UnitTestCase
         $this->subject = new TcaColumnsProcessFieldDescriptions();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsDescriptionAsIsIfNoOverrideIsGiven(): void
     {
         $input = [
@@ -60,9 +59,7 @@ final class TcaColumnsProcessFieldDescriptionsTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsDescriptionToExistingField(): void
     {
         $input = [
@@ -93,9 +90,7 @@ final class TcaColumnsProcessFieldDescriptionsTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDescriptionFromPageTsConfig(): void
     {
         $input = [
@@ -128,9 +123,7 @@ final class TcaColumnsProcessFieldDescriptionsTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDescriptionFromPageTsConfigForSpecificLanguage(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldLabelsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldLabelsTest.php
index 4660411e7a44107dbbf1386c825f738d1511ab82..32ba99f683d08c24388d9d047167ae0b1c7ecf0e 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldLabelsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessFieldLabelsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessFieldLabels;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Localization\LanguageService;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaColumnsProcessFieldLabelsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsLabelAsIsIfNoOverrideIsGiven(): void
     {
         $input = [
@@ -53,9 +52,7 @@ final class TcaColumnsProcessFieldLabelsTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessFieldLabels())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsLabelFromShowitem(): void
     {
         $input = [
@@ -85,9 +82,7 @@ final class TcaColumnsProcessFieldLabelsTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessFieldLabels())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsLabelFromPalettesShowitem(): void
     {
         $input = [
@@ -123,9 +118,7 @@ final class TcaColumnsProcessFieldLabelsTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessFieldLabels())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsLabelFromPageTsConfig(): void
     {
         $input = [
@@ -159,9 +152,7 @@ final class TcaColumnsProcessFieldLabelsTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessFieldLabels())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsLabelFromPageTsConfigForSpecificLanguage(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessPlaceholdersTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessPlaceholdersTest.php
index 2e4f4204fe27996dbfb3ef49569d0680da030dff..f1813131b48e15bc4302007fc5b9c437ae0cc574 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessPlaceholdersTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessPlaceholdersTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessPlaceholders;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class TcaColumnsProcessPlaceholdersTest extends UnitTestCase
         $this->subject = new TcaColumnsProcessPlaceholders();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersPlaceholderColumns(): void
     {
         $input = [
@@ -54,9 +53,7 @@ final class TcaColumnsProcessPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersFirstPlaceholderColumn(): void
     {
         $input = [
@@ -78,9 +75,7 @@ final class TcaColumnsProcessPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersAlternativeLabelColumn(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessRecordTitleTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessRecordTitleTest.php
index 40eb5a0525f9dc2f48cfcf2528b71afe8b83835f..c571b51438d2f613222d280c2e558f9f182d7ab2 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessRecordTitleTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessRecordTitleTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessRecordTitle;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaColumnsProcessRecordTitleTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersLabelColumn(): void
     {
         $input = [
@@ -43,9 +42,7 @@ final class TcaColumnsProcessRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersAlternativeLabelColumn(): void
     {
         $input = [
@@ -65,9 +62,7 @@ final class TcaColumnsProcessRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersForeignLabelInInlineContext(): void
     {
         $input = [
@@ -83,9 +78,7 @@ final class TcaColumnsProcessRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersSymmetricLabelInInlineContext(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessShowitemTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessShowitemTest.php
index bd31436596678ccb59563a79c52ba5c84001f834..84d075d2de405c07c72758301d5fbfc4db7447a4 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessShowitemTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsProcessShowitemTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsProcessShowitem;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaColumnsProcessShowitemTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfTypesHasNoShowitem(): void
     {
         $input = [
@@ -46,9 +45,7 @@ final class TcaColumnsProcessShowitemTest extends UnitTestCase
         (new TcaColumnsProcessShowitem())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRegistersColumnsFieldReferencedInShowitems(): void
     {
         $input = [
@@ -83,9 +80,7 @@ final class TcaColumnsProcessShowitemTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessShowitem())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsColumnsFieldReferencedInPalette(): void
     {
         $input = [
@@ -125,9 +120,7 @@ final class TcaColumnsProcessShowitemTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessShowitem())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSkipsColumnsNotReferencedInShowitemOrPalette(): void
     {
         $input = [
@@ -171,9 +164,7 @@ final class TcaColumnsProcessShowitemTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessShowitem())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSkipsColumnsForCollapsedInlineChild(): void
     {
         $input = [
@@ -208,9 +199,7 @@ final class TcaColumnsProcessShowitemTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessShowitem())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSkipsColumnsForCollapsedAllInlineChild(): void
     {
         $input = [
@@ -252,9 +241,7 @@ final class TcaColumnsProcessShowitemTest extends UnitTestCase
         self::assertSame($expected, (new TcaColumnsProcessShowitem())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsColumnsForExpandedInlineChild(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsRemoveUnusedTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsRemoveUnusedTest.php
index f710a89de00fae3056db06122ea2a665b2cca347..319aa2efa33791eb4a08af9ae2356956875b6f92 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsRemoveUnusedTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsRemoveUnusedTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaColumnsRemoveUnused;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class TcaColumnsRemoveUnusedTest extends UnitTestCase
         $this->subject = new TcaColumnsRemoveUnused();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsColumnsToProcess(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexPrepareTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexPrepareTest.php
index ae473dab3623ea98db90576fba219ef2ad940c34..179de1a6dbe46e8da2090ba910abdcf8b0ef1604 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexPrepareTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexPrepareTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexPrepare;
 use TYPO3\CMS\Core\Cache\CacheManager;
@@ -48,9 +49,7 @@ final class TcaFlexPrepareTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsExistingDataStructure(): void
     {
         $input = [
@@ -95,9 +94,7 @@ final class TcaFlexPrepareTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexPrepare())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParsedDataStructureArray(): void
     {
         $input = [
@@ -164,9 +161,7 @@ final class TcaFlexPrepareTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexPrepare())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParsedDataStructureArrayWithSheets(): void
     {
         $input = [
@@ -239,9 +234,7 @@ final class TcaFlexPrepareTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexPrepare())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataInitializesDatabaseRowValueIfNoDataStringIsGiven(): void
     {
         $input = [
@@ -283,9 +276,7 @@ final class TcaFlexPrepareTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexPrepare())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsParsedDataStructureArrayRecursive(): void
     {
         $input = [
@@ -425,9 +416,8 @@ final class TcaFlexPrepareTest extends UnitTestCase
      * Test of the data provider when called for a section with already
      * resolved flex form, e.g. in an ajax request (tcaSelectTreeAjaxFieldData),
      * which got "reduced to the relevant element only".
-     *
-     * @test
      */
+    #[Test]
     public function addDataMigratesResolvedFlexformTca(): void
     {
         $columnConfig = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexProcessTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexProcessTest.php
index 29da367cd447ac74cdf108aa23e9a0e80f88e5ef..3deb7121dfad1f12e9a4ea985758e6878bb186a1 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexProcessTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFlexProcessTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\FormDataGroup\FlexFormSegment;
 use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowDefaultValues;
@@ -45,9 +46,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['flexFormSegment'] = [];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionWithMissingDataStructureIdentifier(): void
     {
         $input = [
@@ -71,9 +70,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesSheetIfDisabledByPageTsConfig(): void
     {
         $input = [
@@ -136,9 +133,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsSheetTitleFromPageTsConfig(): void
     {
         $input = [
@@ -219,9 +214,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsSheetDescriptionFromPageTsConfig(): void
     {
         $input = [
@@ -302,9 +295,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsSheetShortDescriptionFromPageTsConfig(): void
     {
         $input = [
@@ -385,9 +376,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsSheetShortDescriptionForSingleSheetFromPageTsConfig(): void
     {
         $input = [
@@ -468,9 +457,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesExcludeFieldFromDataStructure(): void
     {
         $input = [
@@ -535,9 +522,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsExcludeFieldInDataStructureWithUserAccess(): void
     {
         $input = [
@@ -610,9 +595,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsExcludeFieldInDataStructureForAdminUser(): void
     {
         $input = [
@@ -685,9 +668,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesPageTsDisabledFieldFromDataStructure(): void
     {
         $input = [
@@ -762,9 +743,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataHandlesPageTsConfigSettingsOfSingleFlexField(): void
     {
         $input = [
@@ -871,9 +850,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaultValueFromFlexTcaForField(): void
     {
         $input = [
@@ -937,9 +914,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForDataStructureTypeArrayWithoutSection(): void
     {
         $input = [
@@ -987,9 +962,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForDataStructureSectionWithoutTypeArray(): void
     {
         $input = [
@@ -1037,9 +1010,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsValuesAndStructureForSectionContainerElements(): void
     {
         $input = [
@@ -1147,9 +1118,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         self::assertEquals($expected, (new TcaFlexProcess())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForInlineElementsNestedInSectionContainers(): void
     {
         $input = [
@@ -1208,9 +1177,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForNestedSectionContainers(): void
     {
         $input = [
@@ -1269,9 +1236,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForSelectElementsInSectionContainers(): void
     {
         $input = [
@@ -1330,9 +1295,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForGroupElementsInSectionContainers(): void
     {
         $input = [
@@ -1391,9 +1354,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCallsFlexFormSegmentGroupForFieldAndAddsFlexParentDatabaseRow(): void
     {
         $input = [
@@ -1450,9 +1411,7 @@ final class TcaFlexProcessTest extends UnitTestCase
         (new TcaFlexProcess())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCallsFlexFormSegmentGroupForDummyContainerAndAddsFlexParentDatabaseRow(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFolderTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFolderTest.php
index 7355602997cf1899a0a958f93f410a501e14380f..75a66b781d94b83f3c94dddd3d3da86d73e55b4d 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFolderTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaFolderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaFolder;
 use TYPO3\CMS\Core\Resource\Folder;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -27,9 +28,7 @@ final class TcaFolderTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsFieldUnchangedIfFieldIsNotTypeFolder(): void
     {
         $input = [
@@ -50,9 +49,7 @@ final class TcaFolderTest extends UnitTestCase
         self::assertSame($expected, (new TcaFolder())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsFolderData(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaGroupTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaGroupTest.php
index ace9e3d0ae61c81f8e9dfe214313c519e4aa02c7..c35324e159f2182bca6d994abdcf9453359cc924 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaGroupTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaGroupTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Clipboard\Clipboard;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaGroup;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -28,9 +29,7 @@ final class TcaGroupTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsFieldUnchangedIfFieldIsNotTypeGroup(): void
     {
         $input = [
@@ -51,9 +50,7 @@ final class TcaGroupTest extends UnitTestCase
         self::assertSame($expected, (new TcaGroup())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDatabaseData(): void
     {
         $aFieldConfig = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineConfigurationTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineConfigurationTest.php
index f8dfcfdc4f0e8cc851f43f007fd1a453536bac9a..1f06151a63235390189668cb9e59d2dac1f3ddde 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineConfigurationTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineConfigurationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaInlineConfiguration;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -45,9 +46,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         ],
     ];
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionForInlineFieldWithoutForeignTableConfig(): void
     {
         $input = [
@@ -68,9 +67,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         (new TcaInlineConfiguration())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsDefaults(): void
     {
         $input = [
@@ -90,9 +87,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsGivenMinitems(): void
     {
         $input = [
@@ -114,9 +109,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataForcesMinitemsPositive(): void
     {
         $input = [
@@ -138,9 +131,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsGivenMaxitems(): void
     {
         $input = [
@@ -162,9 +153,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataForcesMaxitemsPositive(): void
     {
         $input = [
@@ -186,9 +175,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMergesWithGivenAppearanceSettings(): void
     {
         $input = [
@@ -216,9 +203,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataForcesLevelLinksWithForeignSelector(): void
     {
         $input = [
@@ -261,9 +246,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsLevelLinksPositionWithForeignSelectorAndUseCombination(): void
     {
         $input = [
@@ -305,9 +288,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsShowPossibleLocalizationRecordsButForcesBooleanTrue(): void
     {
         $input = [
@@ -331,9 +312,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepsShowPossibleLocalizationRecordsButForcesBooleanFalse(): void
     {
         $input = [
@@ -357,9 +336,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfForeignSelectorAndForeignUniquePointToDifferentFields(): void
     {
         $input = [
@@ -382,9 +359,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         (new TcaInlineConfiguration())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfForeignSelectorPointsToANotExistingField(): void
     {
         $input = [
@@ -406,9 +381,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         (new TcaInlineConfiguration())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfForeignUniquePointsToANotExistingField(): void
     {
         $input = [
@@ -430,9 +403,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         (new TcaInlineConfiguration())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfForeignUniqueTargetIsNotTypeSelectOrGroup(): void
     {
         $input = [
@@ -457,9 +428,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         (new TcaInlineConfiguration())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfForeignUniqueSelectDoesNotDefineForeignTable(): void
     {
         $input = [
@@ -484,9 +453,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         (new TcaInlineConfiguration())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfForeignUniqueGroupDoesNotDefineForeignTable(): void
     {
         $input = [
@@ -511,9 +478,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         (new TcaInlineConfiguration())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsSelectorOrUniqueConfigurationForForeignUnique(): void
     {
         $input = [
@@ -549,9 +514,7 @@ final class TcaInlineConfigurationTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInlineConfiguration())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMergesForeignSelectorFieldTcaOverride(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineExpandCollapseStateTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineExpandCollapseStateTest.php
index 54d1ca9c3c1601ae9ec36420acdd48cabb8cd7e7..ddea16c479303a07bf823ec2bbb6a854de6d5b36 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineExpandCollapseStateTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineExpandCollapseStateTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaInlineExpandCollapseState;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaInlineExpandCollapseStateTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsInlineStatusForTableUid(): void
     {
         $input = [
@@ -60,9 +60,7 @@ final class TcaInlineExpandCollapseStateTest extends UnitTestCase
         self::assertSame($expected, (new TcaInlineExpandCollapseState())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsInlineStatusForSecondLevelChild(): void
     {
         $input = [
@@ -317,10 +315,8 @@ final class TcaInlineExpandCollapseStateTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addDataAddsCorrectIsInlineChildExpandedDataProvider
-     */
+    #[DataProvider('addDataAddsCorrectIsInlineChildExpandedDataProvider')]
+    #[Test]
     public function addDataAddsCorrectIsInlineChildExpanded(array $input, bool $expectedIsInlineChildExpanded): void
     {
         $GLOBALS['BE_USER'] = $this->createMock(BackendUserAuthentication::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineIsOnSymmetricSideTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineIsOnSymmetricSideTest.php
index a3ea9144d895b7cd47bed37d09d2936103e0c3a8..909321b40a5031e90bcdd920a196b08e3a2114b8 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineIsOnSymmetricSideTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineIsOnSymmetricSideTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaInlineIsOnSymmetricSide;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -33,9 +34,7 @@ final class TcaInlineIsOnSymmetricSideTest extends UnitTestCase
         $this->subject = new TcaInlineIsOnSymmetricSide();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsIsOnSymmetricSideToTrue(): void
     {
         $input = [
@@ -56,9 +55,7 @@ final class TcaInlineIsOnSymmetricSideTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsIsOnSymmetricSideToTrueWhenSymmetricFieldArrayIsDetailed()
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineTest.php
index 5ae46ce5bf252716b3f5e66035d1be2f1a552657..38feca91cbe148fa5b932146f5c8d0ac8ca9dfb3 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInlineTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaInline;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -33,9 +34,7 @@ final class TcaInlineTest extends UnitTestCase
         $GLOBALS['BE_USER'] = $this->beUserMock;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataWithoutModifyRightsButWithInlineTypeWillNotParseChildren(): void
     {
         $input = [
@@ -66,9 +65,7 @@ final class TcaInlineTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInline())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataWithUserRightsButWithoutInlineTypeWillNotParseChildren(): void
     {
         $input = [
@@ -98,9 +95,7 @@ final class TcaInlineTest extends UnitTestCase
         self::assertEquals($expected, (new TcaInline())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataWithInlineTypeAndModifyRightsWillAddChildren(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInputPlaceholdersTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInputPlaceholdersTest.php
index d692b70baf568410c77850075cac5f980e3a4935..e349cf45930108daba79d945690127289a1c90c1 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInputPlaceholdersTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaInputPlaceholdersTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataCompiler;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaInputPlaceholders;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -34,9 +35,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         $GLOBALS['LANG'] = $languageService;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesEmptyPlaceholderOption(): void
     {
         $input = [
@@ -60,9 +59,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsUnmodifiedSimpleStringPlaceholder(): void
     {
         $input = [
@@ -85,9 +82,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsValueFromDatabaseRowAsPlaceholder(): void
     {
         $input = [
@@ -113,9 +108,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsValueFromSelectTypeRelation(): void
     {
         $request = new ServerRequest();
@@ -179,9 +172,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsNoPlaceholderForNewSelectTypeRelation(): void
     {
         $input = [
@@ -214,9 +205,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsValueFromGroupTypeRelation(): void
     {
         $request = new ServerRequest();
@@ -289,9 +278,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsValueFromInlineTypeRelation(): void
     {
         $request = new ServerRequest();
@@ -357,9 +344,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsValueFromRelationsRecursively(): void
     {
         $request = new ServerRequest();
@@ -464,9 +449,7 @@ final class TcaInputPlaceholdersTest extends UnitTestCase
         self::assertSame($expected, (new TcaInputPlaceholders())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCallsLanguageServiceForLocalizedPlaceholders(): void
     {
         $labelString = 'LLL:EXT:some_ext/Resources/Private/Language/locallang.xlf:my_placeholder';
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaJsonTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaJsonTest.php
index 936c46285cab96216863d9aa23e1f447f85f78ef..4f632553bcfa8320927e2241dd5114b0a6fc189e 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaJsonTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaJsonTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaJson;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -230,10 +232,8 @@ final class TcaJsonTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resultArrayDataProvider
-     */
+    #[DataProvider('resultArrayDataProvider')]
+    #[Test]
     public function addDataDoesHandleJsonRecords(array $input, array $expected): void
     {
         self::assertSame($expected, (new TcaJson())->addData($input));
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaLanguageTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaLanguageTest.php
index 8c45ef8bbccda185d223b90e283a3487610df073..34c9d1682d45874a71d3b652732f0838d83eed14 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaLanguageTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaLanguageTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaLanguage;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\Site\Entity\NullSite;
@@ -42,18 +44,14 @@ final class TcaLanguageTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataIgnoresEmptyOrWrongTcaType(): void
     {
         $input = $this->getDefaultResultArray(['config' => ['type' => 'none']]);
         self::assertEquals($input, (new TcaLanguage())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRespectsCustomRenderType(): void
     {
         $input = $this->getDefaultResultArray(['config' => ['renderType' => 'customRenderType']]);
@@ -64,9 +62,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfAnItemIsNotAnArray(): void
     {
         $input = $this->getDefaultResultArray(['config' => ['items' => ['foo']]]);
@@ -77,9 +73,7 @@ final class TcaLanguageTest extends UnitTestCase
         (new TcaLanguage())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsAllSiteLanguages(): void
     {
         $input = $this->getDefaultResultArray([], $this->getDefaultSystemLanguages());
@@ -99,9 +93,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataOmitsLanguageAllForPages(): void
     {
         $input = $this->getDefaultResultArray([], $this->getDefaultSystemLanguages(), [], ['tableName' => 'pages']);
@@ -119,9 +111,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataOmitsLanguageAllIfNotAllowed(): void
     {
         $systemLanguages =  $this->getDefaultSystemLanguages();
@@ -143,9 +133,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsUserDefinedItems(): void
     {
         $input = $this->getDefaultResultArray(
@@ -178,9 +166,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsUserDefinedItemsOnEmptySystemLanguages(): void
     {
         $input = $this->getDefaultResultArray(
@@ -207,9 +193,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesAllItemsByEmptyKeepItems(): void
     {
         $input = $this->getDefaultResultArray(
@@ -232,9 +216,7 @@ final class TcaLanguageTest extends UnitTestCase
         self::assertEmpty((new TcaLanguage())->addData($input)['processedTca']['columns']['aField']['config']['items']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRespectsKeepItems(): void
     {
         $input = $this->getDefaultResultArray(
@@ -265,9 +247,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRespectsAddItems(): void
     {
         $input = $this->getDefaultResultArray(
@@ -303,9 +283,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRespectsRemoveItems(): void
     {
         $input = $this->getDefaultResultArray(
@@ -336,9 +314,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsInvalidDatabaseValue(): void
     {
         $input = $this->getDefaultResultArray([], $this->getDefaultSystemLanguages(), ['aField' => 5], ['tableName' => 'pages']);
@@ -356,9 +332,7 @@ final class TcaLanguageTest extends UnitTestCase
             (new TcaLanguage())->addData($input)['processedTca']['columns']['aField']['config']['items']
         );
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRepsetcsConfigurationOnAddingInvalidDatabaseValue(): void
     {
         $input = $this->getDefaultResultArray(
@@ -424,9 +398,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRespectsAltLabels(): void
     {
         $input = $this->getDefaultResultArray(
@@ -464,9 +436,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRespectsAltIcons(): void
     {
         $input = $this->getDefaultResultArray(
@@ -504,9 +474,7 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesLastItemIfDivider(): void
     {
         $input = $this->getDefaultResultArray(
@@ -539,10 +507,8 @@ final class TcaLanguageTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider addDataAddsAllSiteLanguagesDataProvider
-     */
+    #[DataProvider('addDataAddsAllSiteLanguagesDataProvider')]
+    #[Test]
     public function addDataAddsAllSiteLanguagesFromAllSites(array $config): void
     {
         $siteFinder = $this->createMock(SiteFinder::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRadioItemsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRadioItemsTest.php
index 1106e44327bfc52cf9f9cade0db26b4068fc02b6..11010347b64dde72b8aa656d46b9d5eef33e0019 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRadioItemsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRadioItemsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaRadioItems;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
@@ -37,9 +38,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfRadioItemsNotDefined(): void
     {
         $input = [
@@ -64,9 +63,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         (new TcaRadioItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataKeepExistingItems(): void
     {
         $input = [
@@ -95,9 +92,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         self::assertSame($expected, (new TcaRadioItems())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfItemsAreNoArray(): void
     {
         $input = [
@@ -125,9 +120,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         (new TcaRadioItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfItemLabelIsNotSet(): void
     {
         $input = [
@@ -157,9 +150,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         (new TcaRadioItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionIfItemValueIsNotSet(): void
     {
         $input = [
@@ -189,9 +180,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         (new TcaRadioItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataTranslatesItemLabels(): void
     {
         $input = [
@@ -225,9 +214,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         (new TcaRadioItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCallsItemsProcFunc(): void
     {
         $input = [
@@ -270,9 +257,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         self::assertSame('bar', $items[0]['value']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataItemsProcFuncReceivesParameters(): void
     {
         $input = [
@@ -353,9 +338,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         (new TcaRadioItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataItemsProcFuncEnqueuesFlashMessageOnException(): void
     {
         $input = [
@@ -419,9 +402,7 @@ final class TcaRadioItemsTest extends UnitTestCase
         (new TcaRadioItems())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataTranslatesItemLabelsFromPageTsConfig(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRecordTitleTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRecordTitleTest.php
index fef5e97decdfa66cc349f4265973317ad543f43a..f2ceb48aeb8dcbb28d15423a347ffe970f974407 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRecordTitleTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaRecordTitleTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaRecordTitle;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -38,9 +40,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataThrowsExceptionWithMissingLabel(): void
     {
         $input = [
@@ -55,9 +55,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         (new TcaRecordTitle())->addData($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForLabelUserFunction(): void
     {
         $input = [
@@ -81,9 +79,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForFormattedLabelUserFunction(): void
     {
         $input = [
@@ -113,9 +109,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForInlineChildWithForeignLabel(): void
     {
         $input = [
@@ -149,9 +143,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataOverridesRecordTitleWithFormattedLabelUserFuncForInlineChildWithForeignLabel(): void
     {
         $input = [
@@ -186,9 +178,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForInlineChildWithSymmetricLabel(): void
     {
         $input = [
@@ -219,9 +209,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForUid(): void
     {
         $input = [
@@ -350,10 +338,8 @@ final class TcaRecordTitleTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addDataReturnsRecordTitleForDatetimeTypeDataProvider
-     */
+    #[DataProvider('addDataReturnsRecordTitleForDatetimeTypeDataProvider')]
+    #[Test]
     public function addDataReturnsRecordTitleForDatetimeType(array $fieldConfig, string $fieldValue, string $expectedTitle): void
     {
         $input = [
@@ -386,9 +372,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleWithAlternativeLabel(): void
     {
         $input = [
@@ -424,9 +408,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleWithMultipleAlternativeLabels(): void
     {
         $input = [
@@ -468,9 +450,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleWithForcedAlternativeLabel(): void
     {
         $input = [
@@ -507,9 +487,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleWithMultipleForcedAlternativeLabels(): void
     {
         $input = [
@@ -552,9 +530,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleIgnoresEmptyAlternativeLabels(): void
     {
         $input = [
@@ -597,9 +573,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForRadioType(): void
     {
         $input = [
@@ -633,9 +607,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForInlineType(): void
     {
         $input = [
@@ -744,10 +716,8 @@ final class TcaRecordTitleTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addDataReturnsRecordTitleForGroupTypeDataProvider
-     */
+    #[DataProvider('addDataReturnsRecordTitleForGroupTypeDataProvider')]
+    #[Test]
     public function addDataReturnsRecordTitleForGroupType(array $fieldConfig, array $fieldValue, string $expectedTitle): void
     {
         $input = [
@@ -783,9 +753,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForGroupTypeDb(): void
     {
         $input = [
@@ -826,9 +794,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForSingleCheckboxType(): void
     {
         $input = [
@@ -860,9 +826,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForArrayCheckboxType(): void
     {
         $input = [
@@ -899,9 +863,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsEmptyRecordTitleForFlexType(): void
     {
         $input = [
@@ -957,9 +919,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsRecordTitleForSelectType(): void
     {
         $input = [
@@ -995,9 +955,7 @@ final class TcaRecordTitleTest extends UnitTestCase
         self::assertSame($expected, (new TcaRecordTitle())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataReturnsStrippedAndTrimmedValueForTextType(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSlugTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSlugTest.php
index b17b691d1b497bc6b78ebc69cbfb288ea0e82345..71fde9e60fd4d5e95cfe28ee2d5744782e2b032b 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSlugTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSlugTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaSlug;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -349,10 +351,8 @@ final class TcaSlugTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resultArrayDataProvider
-     */
+    #[DataProvider('resultArrayDataProvider')]
+    #[Test]
     public function getSlugPrefixForDefinedLanguagesAndUserFunc(array $input, array $expected): void
     {
         self::assertEquals($expected, $this->subject->addData($input));
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTextTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTextTest.php
index 9846565ee1451130216d949708bff0c1d0d867d1..f261dabb51ab30efa881783536d653935f8e3d3c 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTextTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTextTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaText;
 use TYPO3\CMS\Core\Configuration\Richtext;
 use TYPO3\CMS\Core\Html\RteHtmlParser;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaTextTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsRichtextConfigurationAndTransformsContent(): void
     {
         $input = [
@@ -100,9 +99,7 @@ final class TcaTextTest extends UnitTestCase
         self::assertSame($expected, (new TcaText())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotTransformsContentWhenRichtextIsNotSet(): void
     {
         $input = [
@@ -128,9 +125,7 @@ final class TcaTextTest extends UnitTestCase
         self::assertSame($expected, (new TcaText())->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotTransformsContentWhenRichtextIsDisabledInConfiguration(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTypesShowitemTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTypesShowitemTest.php
index 49246cf19368ed9bbaafb2ff8c162373378675ca..7785200518708bc03ec942a753cd035f561eaa0a 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTypesShowitemTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaTypesShowitemTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaTypesShowitem;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class TcaTypesShowitemTest extends UnitTestCase
         $this->subject = new TcaTypesShowitem();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesTypeRelatedFields(): void
     {
         $input = [
@@ -58,9 +57,7 @@ final class TcaTypesShowitemTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataInsertsMatchingSubtypeAddListAfterSubtypeValueField(): void
     {
         $input = [
@@ -96,9 +93,7 @@ final class TcaTypesShowitemTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataInsertsMatchingSubtypeAddListAfterPaletteWithSubtypeValueField(): void
     {
         $input = [
@@ -144,9 +139,7 @@ final class TcaTypesShowitemTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesMatchingSubtypeExcludeListItems(): void
     {
         $input = [
@@ -182,9 +175,7 @@ final class TcaTypesShowitemTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesMatchingSubtypeExcludeListItemsFromPalettes(): void
     {
         $input = [
@@ -230,9 +221,7 @@ final class TcaTypesShowitemTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesMatchingBitmaskExcludeListItems(): void
     {
         $input = [
@@ -269,9 +258,7 @@ final class TcaTypesShowitemTest extends UnitTestCase
         self::assertSame($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataRemovesMatchingBitmaskExcludeListItemsFromPalettes(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaUuidTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaUuidTest.php
index ba29b921b70959536fcfc23be9571081ea65c647..9339bfdf959ebca7de54edeea87750833c5073d6 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaUuidTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaUuidTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Uid\Uuid;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaUuid;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -84,9 +85,7 @@ final class TcaUuidTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesOnlyHandleTypeUuid(): void
     {
         $input = [
@@ -109,9 +108,7 @@ final class TcaUuidTest extends UnitTestCase
         self::assertSame('', (new TcaUuid())->addData($input)['databaseRow']['aField']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotHandleFieldsWithValidUuidValue(): void
     {
         $input = [
@@ -134,9 +131,7 @@ final class TcaUuidTest extends UnitTestCase
         self::assertSame('b3190536-1431-453e-afbb-25b8c5022513', (new TcaUuid())->addData($input)['databaseRow']['aField']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCreatesValidUuidValueForInvalidUuid(): void
     {
         $input = [
@@ -160,9 +155,7 @@ final class TcaUuidTest extends UnitTestCase
         self::assertTrue(Uuid::isValid((new TcaUuid())->addData($input)['databaseRow']['aField']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCreatesValidUuidValueForEmptyField(): void
     {
         $input = [
@@ -186,9 +179,7 @@ final class TcaUuidTest extends UnitTestCase
         self::assertTrue(Uuid::isValid((new TcaUuid())->addData($input)['databaseRow']['aField']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataCreatesValidUuidValueWithDefinedVersion(): void
     {
         $input = [
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/UserTsConfigTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/UserTsConfigTest.php
index 13ce205ed0c5f51a772b3acbd395b75b6312715b..d613ed2b050a581db26d117c998757bb09f39aed 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/UserTsConfigTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/UserTsConfigTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\FormDataProvider\UserTsConfig;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -31,9 +32,7 @@ final class UserTsConfigTest extends UnitTestCase
         $this->subject = new UserTsConfig();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataSetsUserTypoScriptInResult(): void
     {
         $expected = ['foo'];
diff --git a/typo3/sysext/backend/Tests/Unit/Form/InlineStackProcessorTest.php b/typo3/sysext/backend/Tests/Unit/Form/InlineStackProcessorTest.php
index 1cde3476a094a7898abbbfcd0722659f8030d05b..611f3745d7ddf589db96e4368c9e0c766224b2a7 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/InlineStackProcessorTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/InlineStackProcessorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\InlineStackProcessor;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
@@ -257,10 +259,8 @@ final class InlineStackProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider structureStringIsParsedDataProvider
-     * @test
-     */
+    #[DataProvider('structureStringIsParsedDataProvider')]
+    #[Test]
     public function initializeByParsingDomObjectIdStringParsesStructureString(string $string, array $expectedInlineStructure, array $_): void
     {
         $subject = $this->getAccessibleMock(InlineStackProcessor::class, null);
@@ -269,10 +269,8 @@ final class InlineStackProcessorTest extends UnitTestCase
         self::assertEquals($expectedInlineStructure, $structure);
     }
 
-    /**
-     * @dataProvider structureStringIsParsedDataProvider
-     * @test
-     */
+    #[DataProvider('structureStringIsParsedDataProvider')]
+    #[Test]
     public function getCurrentStructureFormPrefixReturnsExpectedStringAfterInitializationByStructureString(string $string, array $_, array $expectedFormName): void
     {
         $subject = new InlineStackProcessor();
@@ -280,10 +278,8 @@ final class InlineStackProcessorTest extends UnitTestCase
         self::assertEquals($expectedFormName['form'], $subject->getCurrentStructureFormPrefix());
     }
 
-    /**
-     * @dataProvider structureStringIsParsedDataProvider
-     * @test
-     */
+    #[DataProvider('structureStringIsParsedDataProvider')]
+    #[Test]
     public function getCurrentStructureDomObjectIdPrefixReturnsExpectedStringAfterInitializationByStructureString(string $string, array $_, array $expectedFormName): void
     {
         $subject = new InlineStackProcessor();
diff --git a/typo3/sysext/backend/Tests/Unit/Form/NodeExpansion/FieldControlTest.php b/typo3/sysext/backend/Tests/Unit/Form/NodeExpansion/FieldControlTest.php
index 55eb6ab1f95beeab00cdf7e03c14de34774a2e63..29d3030339ad5245f8397995cf9625042a494bdd 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/NodeExpansion/FieldControlTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/NodeExpansion/FieldControlTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form\NodeExpansion;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\AbstractNode;
 use TYPO3\CMS\Backend\Form\NodeExpansion\FieldControl;
 use TYPO3\CMS\Backend\Form\NodeFactory;
@@ -29,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FieldControlTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function renderMergesResultOfSingleControls(): void
     {
         $iconFactoryMock = $this->createMock(IconFactory::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Form/NodeFactoryTest.php b/typo3/sysext/backend/Tests/Unit/Form/NodeFactoryTest.php
index eb1089eddf301ce911efbd158d75f0d97c021a84..6f045182904a807b69bbe7e765879b90adc4e225 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/NodeFactoryTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/NodeFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Form;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Form\Element\SelectSingleElement;
 use TYPO3\CMS\Backend\Form\Element\SelectTreeElement;
 use TYPO3\CMS\Backend\Form\Element\UnknownElement;
@@ -31,9 +32,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class NodeFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfOverrideMissesNodeNameKey(): void
     {
         $this->expectException(Exception::class);
@@ -47,9 +46,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfOverrideMissesPriorityKey(): void
     {
         $this->expectException(Exception::class);
@@ -63,9 +60,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfOverrideMissesClassKey(): void
     {
         $this->expectException(Exception::class);
@@ -79,9 +74,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfOverridePriorityIsLowerThanZero(): void
     {
         $this->expectException(Exception::class);
@@ -95,9 +88,7 @@ final class NodeFactoryTest extends UnitTestCase
         ];
         new NodeFactory();
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfOverridePriorityIsHigherThanHundred(): void
     {
         $this->expectException(Exception::class);
@@ -112,9 +103,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfOverrideTwoNodesWithSamePriorityAndSameNodeNameAreRegistered(): void
     {
         $this->expectException(Exception::class);
@@ -134,9 +123,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfResolverMissesNodeNameKey(): void
     {
         $this->expectException(Exception::class);
@@ -150,9 +137,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfResolverMissesPriorityKey(): void
     {
         $this->expectException(Exception::class);
@@ -166,9 +151,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfResolverMissesClassKey(): void
     {
         $this->expectException(Exception::class);
@@ -182,9 +165,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfResolverPriorityIsLowerThanZero(): void
     {
         $this->expectException(Exception::class);
@@ -198,9 +179,7 @@ final class NodeFactoryTest extends UnitTestCase
         ];
         new NodeFactory();
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionIfResolverPriorityIsHigherThanHundred(): void
     {
         $this->expectException(Exception::class);
@@ -215,9 +194,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfResolverTwoNodesWithSamePriorityAndSameNodeNameAreRegistered(): void
     {
         $this->expectException(Exception::class);
@@ -237,9 +214,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsNoExceptionIfResolverWithSamePriorityButDifferentNodeNameAreRegistered(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['nodeResolver'] = [
@@ -257,9 +232,7 @@ final class NodeFactoryTest extends UnitTestCase
         new NodeFactory();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createThrowsExceptionIfRenderTypeIsNotGiven(): void
     {
         $this->expectException(Exception::class);
@@ -268,9 +241,7 @@ final class NodeFactoryTest extends UnitTestCase
         $subject->create([]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createReturnsInstanceOfUnknownElementIfTypeIsNotRegistered(): void
     {
         $unknownElementMock = $this->createMock(UnknownElement::class);
@@ -279,9 +250,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertSame($unknownElementMock, $subject->create(['renderType' => 'foo']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createReturnsInstanceOfSelectTreeElementIfNeeded(): void
     {
         $data = [
@@ -294,9 +263,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertSame($selectTreeElementMock, $subject->create($data));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createReturnsInstanceOfSelectSingleElementIfNeeded(): void
     {
         $data = [
@@ -314,9 +281,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertSame($selectSingleElementMock, $subject->create($data));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createInstantiatesNewRegisteredElement(): void
     {
         $data = ['renderType' => 'foo'];
@@ -332,9 +297,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertInstanceOf(FooElement::class, ($subject->create($data)));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createInstantiatesElementRegisteredWithHigherPriorityWithOneGivenOrder(): void
     {
         $data = ['renderType' => 'foo'];
@@ -354,9 +317,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertInstanceOf(BarElement::class, ($subject->create($data)));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createInstantiatesElementRegisteredWithHigherPriorityWithOtherGivenOrder(): void
     {
         $data = ['renderType' => 'foo'];
@@ -376,9 +337,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertInstanceOf(FooElement::class, ($subject->create($data)));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createInstantiatesResolverWithHighestPriorityFirstWithOneGivenOrder(): void
     {
         $data = ['renderType' => 'foo'];
@@ -406,9 +365,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertInstanceOf(BarElement::class, ($subject->create($data)));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createInstantiatesResolverWithHighestPriorityFirstWithOtherGivenOrder(): void
     {
         $data = ['renderType' => 'foo'];
@@ -436,9 +393,7 @@ final class NodeFactoryTest extends UnitTestCase
         self::assertInstanceOf(BarElement::class, ($subject->create($data)));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createInstantiatesNodeClassReturnedByResolver(): void
     {
         $data = ['renderType' => 'foo'];
diff --git a/typo3/sysext/backend/Tests/Unit/Http/RouteDispatcherTest.php b/typo3/sysext/backend/Tests/Unit/Http/RouteDispatcherTest.php
index 46e085ba73dab0c48b877c5e03e147bf8ab5cf15..460169442aecfdbd8771d1b0fce77984ab899acc 100644
--- a/typo3/sysext/backend/Tests/Unit/Http/RouteDispatcherTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Http/RouteDispatcherTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\Http\RouteDispatcher;
@@ -41,9 +42,7 @@ final class RouteDispatcherTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchThrowsExceptionIfTargetIsNotCallable(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
@@ -66,9 +65,7 @@ final class RouteDispatcherTest extends UnitTestCase
         $subject->dispatch($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchCallsTargetIfTargetIsArray(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
@@ -95,9 +92,7 @@ final class RouteDispatcherTest extends UnitTestCase
         $subject->dispatch($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchCallsTargetIfTargetIsClosure(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
@@ -123,9 +118,7 @@ final class RouteDispatcherTest extends UnitTestCase
         $subject->dispatch($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchCallsTargetIfTargetIsClassImplementingInvoke(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
@@ -149,9 +142,7 @@ final class RouteDispatcherTest extends UnitTestCase
         $subject->dispatch($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchCallsTargetIfTargetIsInContainer(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
@@ -176,9 +167,7 @@ final class RouteDispatcherTest extends UnitTestCase
         $subject->dispatch($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchThrowsExceptionIfTargetWithClassNameOnlyDoesNotImplementInvoke(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
@@ -202,9 +191,7 @@ final class RouteDispatcherTest extends UnitTestCase
         $subject->dispatch($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchCallsClassMethodCombinationGivenAsString(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
@@ -228,9 +215,7 @@ final class RouteDispatcherTest extends UnitTestCase
         $subject->dispatch($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchCallsStaticClassMethodCombinationGivenAsString(): void
     {
         $formProtectionMock = $this->createMock(AbstractFormProtection::class);
diff --git a/typo3/sysext/backend/Tests/Unit/LoginProvider/LoginProviderResolverTest.php b/typo3/sysext/backend/Tests/Unit/LoginProvider/LoginProviderResolverTest.php
index a19f4d941de9709f5f0f41770db98c387e6d9904..4c4bb646f557a5f7235c8944ffd50f7b888d495a 100644
--- a/typo3/sysext/backend/Tests/Unit/LoginProvider/LoginProviderResolverTest.php
+++ b/typo3/sysext/backend/Tests/Unit/LoginProvider/LoginProviderResolverTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\LoginProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\LoginProvider\LoginProviderResolver;
 use TYPO3\CMS\Backend\LoginProvider\UsernamePasswordLoginProvider;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -31,9 +32,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         unset($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['backend']['loginProviders']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsMissingProviderConfiguration(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -41,9 +40,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsNonArrayProviderConfiguration(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -52,9 +49,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsIfNoProviderIsRegistered(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -63,9 +58,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsMissingConfigurationForProvider(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -76,9 +69,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsWrongProvider(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -91,9 +82,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsMissingLabel(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -108,9 +97,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsMissingIconClass(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -125,9 +112,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndSortLoginProvidersDetectsMissingSorting(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -142,9 +127,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         new LoginProviderResolver();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loginProviderResolverRespectsConstructorArgument(): void
     {
         $loginProviders = [
@@ -165,9 +148,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasLoginProviderTest(): void
     {
         $subject = (new LoginProviderResolver($this->getDefaultLoginProviders()));
@@ -177,9 +158,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         self::assertTrue($subject->hasLoginProvider('987654321'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLoginProviderConfigurationByIdentifierTest(): void
     {
         $subject = (new LoginProviderResolver($this->getDefaultLoginProviders()));
@@ -191,9 +170,7 @@ final class LoginProviderResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLoginProvidersTest(): void
     {
         $resolvedLoginProviders = (new LoginProviderResolver($this->getDefaultLoginProviders()))->getLoginProviders();
@@ -203,18 +180,14 @@ final class LoginProviderResolverTest extends UnitTestCase
         self::assertEquals('bar', array_shift($resolvedLoginProviders)['label']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPrimaryLoginProviderIdentifierTest(): void
     {
         $subject = (new LoginProviderResolver($this->getDefaultLoginProviders()));
         self::assertEquals('987654321', $subject->getPrimaryLoginProviderIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveLoginProviderIdentifierFromRequestTest(): void
     {
         $subject = (new LoginProviderResolver($this->getDefaultLoginProviders()));
diff --git a/typo3/sysext/backend/Tests/Unit/Module/ModuleFactoryTest.php b/typo3/sysext/backend/Tests/Unit/Module/ModuleFactoryTest.php
index c0e78f874163e8c89d638e9ea2a34a1b2f47175b..c2913f7f281114c2d64dccbfd3db68a31fc64673 100644
--- a/typo3/sysext/backend/Tests/Unit/Module/ModuleFactoryTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Module/ModuleFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Module;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Module\ModuleFactory;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Core\Imaging\IconRegistry;
@@ -35,9 +36,7 @@ final class ModuleFactoryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function adaptAliasMappingFromModuleConfigurationMapsAliasesProperly(): void
     {
         $moduleConfiguration = [
diff --git a/typo3/sysext/backend/Tests/Unit/Module/ModuleRegistryTest.php b/typo3/sysext/backend/Tests/Unit/Module/ModuleRegistryTest.php
index 41cefd4ef77f5517b0441a762c2f8644a29b9f60..f258834a56ff4e4653b80a929dddca711c89d19f 100644
--- a/typo3/sysext/backend/Tests/Unit/Module/ModuleRegistryTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Module/ModuleRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Module;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Module\ModuleFactory;
 use TYPO3\CMS\Backend\Module\ModuleInterface;
 use TYPO3\CMS\Backend\Module\ModuleRegistry;
@@ -38,9 +39,7 @@ final class ModuleRegistryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionOnDuplicateModuleIdentifier(): void
     {
         $this->expectException(\LogicException::class);
@@ -52,9 +51,7 @@ final class ModuleRegistryTest extends UnitTestCase
         ]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionOnNonExistingModuleIdentifier(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -63,9 +60,7 @@ final class ModuleRegistryTest extends UnitTestCase
         (new ModuleRegistry([]))->getModule('a_module');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function accessRegisteredModulesWork(): void
     {
         $aModule = $this->createModule('a_module', ['aliases' => ['a_old_module']]);
@@ -82,9 +77,7 @@ final class ModuleRegistryTest extends UnitTestCase
         self::assertEquals(['a_old_module' => 'a_module'], $registry->getModuleAliases());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function moduleAliasOverwriteStrategy(): void
     {
         $aModule = $this->createModule('a_module', ['aliases' => ['duplicate_alias']]);
@@ -96,9 +89,7 @@ final class ModuleRegistryTest extends UnitTestCase
         self::assertEquals(['duplicate_alias' => 'b_module'], $registry->getModuleAliases());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addModuleAppliesSortingAndHierarchy(): void
     {
         $modules = $random = [
@@ -183,9 +174,7 @@ final class ModuleRegistryTest extends UnitTestCase
         self::assertEquals('b', $registry->getModule('b_a_d_c')->getParentModule()->getParentModule()->getParentIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function keepsInputOrderWithoutPositionDefinition(): void
     {
         self::assertEquals(
@@ -200,9 +189,7 @@ final class ModuleRegistryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function firstModuleDeclaringTopWillBeOnTop(): void
     {
         self::assertEquals(
@@ -218,9 +205,7 @@ final class ModuleRegistryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function subModulesAndDependencyChainOverruleFirstLevelDependencies(): void
     {
         self::assertEquals(
@@ -238,9 +223,7 @@ final class ModuleRegistryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dependencyChainsAreRespected(): void
     {
         self::assertEquals(
diff --git a/typo3/sysext/backend/Tests/Unit/Preview/StandardPreviewRendererResolverTest.php b/typo3/sysext/backend/Tests/Unit/Preview/StandardPreviewRendererResolverTest.php
index 94772a4c392a454f02de780de15ecc23d6ca1819..287708448a9464b7960cf6a6e701e391796a2fc2 100644
--- a/typo3/sysext/backend/Tests/Unit/Preview/StandardPreviewRendererResolverTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Preview/StandardPreviewRendererResolverTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Preview;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Preview\PreviewRendererInterface;
 use TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer;
 use TYPO3\CMS\Backend\Preview\StandardPreviewRendererResolver;
@@ -52,9 +53,7 @@ final class StandardPreviewRendererResolverTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveStandardContentPreviewRenderer(): void
     {
         $table = 'tt_content';
@@ -68,9 +67,7 @@ final class StandardPreviewRendererResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveCustomContentPreviewRenderer(): void
     {
         $customPreviewRenderer = $this->getMockBuilder(PreviewRendererInterface::class)->getMock();
@@ -88,9 +85,7 @@ final class StandardPreviewRendererResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveStandardContentPreviewRendererWithCustomPreviewRendererDefined(): void
     {
         $customPreviewRenderer = $this->getMockBuilder(PreviewRendererInterface::class)->getMock();
@@ -108,9 +103,7 @@ final class StandardPreviewRendererResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveStandardContentPreviewRendererWithGeneralPreviewRendererDefinedForAllSubTypes(): void
     {
         $customPreviewRenderer = $this->getMockBuilder(PreviewRendererInterface::class)->getMock();
@@ -128,9 +121,7 @@ final class StandardPreviewRendererResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExceptionWithNoPreviewRendererDefined(): void
     {
         $GLOBALS['TCA']['pages']['ctrl'] = [];
diff --git a/typo3/sysext/backend/Tests/Unit/Routing/PreviewUriBuilderTest.php b/typo3/sysext/backend/Tests/Unit/Routing/PreviewUriBuilderTest.php
index 37c003bffc51893d30124daff4177cfab999706a..5340e641d8d3db1ed2263a253426e76c2fa3039e 100644
--- a/typo3/sysext/backend/Tests/Unit/Routing/PreviewUriBuilderTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Routing/PreviewUriBuilderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Routing;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Backend\Routing\Event\BeforePagePreviewUriGeneratedEvent;
 use TYPO3\CMS\Backend\Routing\PreviewUriBuilder;
@@ -28,9 +29,7 @@ final class PreviewUriBuilderTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attributesContainAlternativeUri(): void
     {
         $eventDispatcher = new class () implements EventDispatcherInterface {
diff --git a/typo3/sysext/backend/Tests/Unit/Routing/UriBuilderTest.php b/typo3/sysext/backend/Tests/Unit/Routing/UriBuilderTest.php
index b459f926a61896750381924c7d0f52e2814fb074..172793addffd60e3b542545cc25f09370dc22f4f 100644
--- a/typo3/sysext/backend/Tests/Unit/Routing/UriBuilderTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Routing/UriBuilderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Routing;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Routing\Exception\RouteNotFoundException;
 use TYPO3\CMS\Backend\Routing\Route;
 use TYPO3\CMS\Backend\Routing\Router;
@@ -72,10 +74,8 @@ final class UriBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validRoutesAreBuiltDataProvider
-     */
+    #[DataProvider('validRoutesAreBuiltDataProvider')]
+    #[Test]
     public function validRoutesAreBuilt(
         array $routes,
         string $routeName,
@@ -98,9 +98,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectation, $uri->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonExistingRouteThrowsException(): void
     {
         $formProtectionFactory = $this->createMock(FormProtectionFactory::class);
diff --git a/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/MutableSearchDemandTest.php b/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/MutableSearchDemandTest.php
index ed4a9dab1e3ec0ed3deefedb7a1390b6bcfce886..6e2b87f47ac0efd9ea422af24b6022ff4221f1e1 100644
--- a/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/MutableSearchDemandTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/MutableSearchDemandTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Search\LiveSearch\SearchDemand;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
 use TYPO3\CMS\Backend\Search\LiveSearch\DatabaseRecordProvider;
 use TYPO3\CMS\Backend\Search\LiveSearch\SearchDemand\DemandProperty;
@@ -26,9 +27,7 @@ use TYPO3\CMS\Core\Http\ServerRequest;
 
 final class MutableSearchDemandTest extends TestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyWorksAsExpected(): void
     {
         $query = 'foo';
@@ -39,9 +38,7 @@ final class MutableSearchDemandTest extends TestCase
         self::assertSame($query, $mutableSearchDemand->getProperty(DemandPropertyName::query)->getValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function consecutiveSetPropertyCallWithSameNameWorksAsExpected(): void
     {
         $limit = 42;
@@ -54,9 +51,7 @@ final class MutableSearchDemandTest extends TestCase
         self::assertSame($limit, $mutableSearchDemand->getProperty(DemandPropertyName::limit)->getValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function freezeSetsSameDemandProperties(): void
     {
         $mutableSearchDemand = new MutableSearchDemand([
@@ -67,9 +62,7 @@ final class MutableSearchDemandTest extends TestCase
         self::assertSame($mutableSearchDemand->getProperties(), $searchDemand->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromRequestCreatesExpectedDemand(): void
     {
         $query = 'Karl Ranseier';
diff --git a/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/SearchDemandTest.php b/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/SearchDemandTest.php
index 61efa1b2b53546fc35d803ac3bbff8d950637b2e..98818622f3acf9ce2a1b34c4cb166cf179d8454e 100644
--- a/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/SearchDemandTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Search/LiveSearch/SearchDemand/SearchDemandTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Search\LiveSearch\SearchDemand;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
 use TYPO3\CMS\Backend\Search\LiveSearch\DatabaseRecordProvider;
 use TYPO3\CMS\Backend\Search\LiveSearch\SearchDemand\DemandProperty;
@@ -26,9 +27,7 @@ use TYPO3\CMS\Core\Http\ServerRequest;
 
 final class SearchDemandTest extends TestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyReturnsValueAsExpected(): void
     {
         $query = 'foo';
@@ -43,9 +42,7 @@ final class SearchDemandTest extends TestCase
         self::assertSame($limit, $searchDemand->getProperty(DemandPropertyName::limit)->getValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromRequestCreatesExpectedDemand(): void
     {
         $query = 'Karl Ranseier';
diff --git a/typo3/sysext/backend/Tests/Unit/Security/EmailLoginNotificationTest.php b/typo3/sysext/backend/Tests/Unit/Security/EmailLoginNotificationTest.php
index 7054358e5d6976be10270d3ccb15cdce6f8b747b..0814523b5f8d5def5194a1bdf3929dd5b4baf084 100644
--- a/typo3/sysext/backend/Tests/Unit/Security/EmailLoginNotificationTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Security/EmailLoginNotificationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Security;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Security\EmailLoginNotification;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -28,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class EmailLoginNotificationTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function emailAtLoginSendsAnEmailIfUserHasValidEmailAndOptin(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -52,9 +51,7 @@ final class EmailLoginNotificationTest extends UnitTestCase
         $subject->emailAtLogin(new AfterUserLoggedInEvent($backendUser));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emailAtLoginDoesNotSendAnEmailIfUserHasNoOptin(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -76,9 +73,7 @@ final class EmailLoginNotificationTest extends UnitTestCase
         // no additional assertion here, as the test would fail due to missing mail mocking if it actually tried to send an email
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emailAtLoginDoesNotSendAnEmailIfUserHasInvalidEmail(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -100,9 +95,7 @@ final class EmailLoginNotificationTest extends UnitTestCase
         // no additional assertion here, as the test would fail due to missing mail mocking if it actually tried to send an email
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emailAtLoginSendsEmailToCustomEmailIfAdminWarningIsEnabled(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -126,9 +119,7 @@ final class EmailLoginNotificationTest extends UnitTestCase
         $subject->emailAtLogin(new AfterUserLoggedInEvent($backendUser));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emailAtLoginSendsEmailToCustomEmailIfRegularWarningIsEnabled(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -152,9 +143,7 @@ final class EmailLoginNotificationTest extends UnitTestCase
         $subject->emailAtLogin(new AfterUserLoggedInEvent($backendUser));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emailAtLoginSendsEmailToCustomEmailIfRegularWarningIsEnabledAndNoAdminIsLoggingIn(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -178,9 +167,7 @@ final class EmailLoginNotificationTest extends UnitTestCase
         $subject->emailAtLogin(new AfterUserLoggedInEvent($backendUser));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emailAtLoginSendsNoEmailIfAdminWarningIsEnabledAndNoAdminIsLoggingIn(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
diff --git a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/FullyRenderedButtonTest.php b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/FullyRenderedButtonTest.php
index 083425cd33e78e533c8d5345b75c0d08566fb74e..54d416c4cff91f87085f4c4163e7ea7a150e8c3d 100644
--- a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/FullyRenderedButtonTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/FullyRenderedButtonTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Template\Components\Button;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Template\Components\Buttons\FullyRenderedButton;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -24,9 +25,8 @@ final class FullyRenderedButtonTest extends UnitTestCase
 {
     /**
      * Try to validate an empty button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidBlankCallExpectFalse(): void
     {
         $button = new FullyRenderedButton();
@@ -36,9 +36,8 @@ final class FullyRenderedButtonTest extends UnitTestCase
 
     /**
      * Tests a valid HTML Button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidHtmlSourceGivenExpectTrue(): void
     {
         $button = new FullyRenderedButton();
diff --git a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/InputButtonTest.php b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/InputButtonTest.php
index 668e9e61b91ea987648befd2d37e76d4718c41b3..273975482401c55c1f9a46b5f8f237ec15ccf9c5 100644
--- a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/InputButtonTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/InputButtonTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Template\Components\Button;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Template\Components\Buttons\InputButton;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -25,9 +26,8 @@ final class InputButtonTest extends UnitTestCase
 {
     /**
      * Try to validate an empty button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidBlankCallExpectFalse(): void
     {
         $button = new InputButton();
@@ -37,9 +37,8 @@ final class InputButtonTest extends UnitTestCase
 
     /**
      * Omit the Icon
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidOmittedIconExpectFalse(): void
     {
         $button = new InputButton();
@@ -50,9 +49,8 @@ final class InputButtonTest extends UnitTestCase
 
     /**
      * Omit the title
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidOmittedTitleExpectFalse(): void
     {
         $button = new InputButton();
@@ -64,9 +62,8 @@ final class InputButtonTest extends UnitTestCase
 
     /**
      * Omit the name
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidOmittedNameExpectFalse(): void
     {
         $button = new InputButton();
@@ -78,9 +75,8 @@ final class InputButtonTest extends UnitTestCase
 
     /**
      * Omit the Value
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidOmittedValueExpectFalse(): void
     {
         $button = new InputButton();
@@ -92,9 +88,8 @@ final class InputButtonTest extends UnitTestCase
 
     /**
      * Set a 100% valid button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidAllValuesSetExpectTrue(): void
     {
         $button = new InputButton();
diff --git a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/LinkButtonTest.php b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/LinkButtonTest.php
index d7acf18d2dc31e1740aded41e514ff0b84e4a33b..9c47b821419c550a3ded673ef434fc5cb69467e2 100644
--- a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/LinkButtonTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/LinkButtonTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Template\Components\Button;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Template\Components\Buttons\LinkButton;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -25,9 +26,8 @@ final class LinkButtonTest extends UnitTestCase
 {
     /**
      * Try validating an empty button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidBlankCallExpectFalse(): void
     {
         $button = new LinkButton();
@@ -37,9 +37,8 @@ final class LinkButtonTest extends UnitTestCase
 
     /**
      * Omit the Icon
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidOmittedIconExpectFalse(): void
     {
         $button = new LinkButton();
@@ -50,9 +49,8 @@ final class LinkButtonTest extends UnitTestCase
 
     /**
      * Omit the title
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidOmittedTitleExpectFalse(): void
     {
         $button = new LinkButton();
@@ -64,9 +62,8 @@ final class LinkButtonTest extends UnitTestCase
 
     /**
      * Omit Href
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidOmittedHrefExpectFalse(): void
     {
         $button = new LinkButton();
@@ -78,9 +75,8 @@ final class LinkButtonTest extends UnitTestCase
 
     /**
      * Send a valid button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidAllValuesSetExpectTrue(): void
     {
         $button = new LinkButton();
diff --git a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/SplitButtonTest.php b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/SplitButtonTest.php
index 673abbc364e2e67114f03f3046dcc9be7d695274..838f35e0c3ddab33c500faedcbde1839d46d5523 100644
--- a/typo3/sysext/backend/Tests/Unit/Template/Components/Button/SplitButtonTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Template/Components/Button/SplitButtonTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Template\Components\Button;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Template\Components\Buttons\LinkButton;
 use TYPO3\CMS\Backend\Template\Components\Buttons\SplitButton;
 use TYPO3\CMS\Core\Imaging\Icon;
@@ -29,9 +30,8 @@ final class SplitButtonTest extends UnitTestCase
 {
     /**
      * Try to validate an empty button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidBlankCallExpectFalse(): void
     {
         $button = new SplitButton();
@@ -41,9 +41,8 @@ final class SplitButtonTest extends UnitTestCase
 
     /**
      * Try adding an invalid button to a splitButton
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidInvalidButtonGivenExpectFalse(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -59,9 +58,8 @@ final class SplitButtonTest extends UnitTestCase
 
     /**
      * Try to add multiple primary actions
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidBrokenSetupMultiplePrimaryActionsGivenExpectFalse(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -83,9 +81,8 @@ final class SplitButtonTest extends UnitTestCase
 
     /**
      * Try to add an invalid button as second parameter
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidBrokenSetupInvalidButtonAsSecondParametersGivenExpectFalse(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -107,9 +104,8 @@ final class SplitButtonTest extends UnitTestCase
 
     /**
      * Send in a valid button
-     *
-     * @test
      */
+    #[Test]
     public function isButtonValidValidSetupExpectTrue(): void
     {
         $button = new SplitButton();
diff --git a/typo3/sysext/backend/Tests/Unit/Template/Components/Menu/MenuItemTest.php b/typo3/sysext/backend/Tests/Unit/Template/Components/Menu/MenuItemTest.php
index 0d62314f5e9846183efe9fa8d38382b85b583819..f14aec2804e9069e403bebe21b81dd61126210b8 100644
--- a/typo3/sysext/backend/Tests/Unit/Template/Components/Menu/MenuItemTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Template/Components/Menu/MenuItemTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Template\Components\Menu;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Template\Components\Menu\MenuItem;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -24,9 +25,8 @@ final class MenuItemTest extends UnitTestCase
 {
     /**
      * Try a blank menu Item
-     *
-     * @test
      */
+    #[Test]
     public function isMenuItemValidBlankCallExpectFalse(): void
     {
         $menuItem = new MenuItem();
@@ -36,9 +36,8 @@ final class MenuItemTest extends UnitTestCase
 
     /**
      * Try omitting the title and a Href
-     *
-     * @test
      */
+    #[Test]
     public function isMenuItemValidOmittedHrefAndRouteExpectFalse(): void
     {
         $menuItem = new MenuItem();
@@ -49,9 +48,8 @@ final class MenuItemTest extends UnitTestCase
 
     /**
      * Try omitting the title
-     *
-     * @test
      */
+    #[Test]
     public function isMenuItemValidOmittedTitleExpectFalse(): void
     {
         $menuItem = new MenuItem();
@@ -62,9 +60,8 @@ final class MenuItemTest extends UnitTestCase
 
     /**
      * Set a valid title and href
-     *
-     * @test
      */
+    #[Test]
     public function isMenuItemValidSetValidHrefAndTitleExpectTrue(): void
     {
         $menuItem = new MenuItem();
diff --git a/typo3/sysext/backend/Tests/Unit/Template/Components/MenuTest.php b/typo3/sysext/backend/Tests/Unit/Template/Components/MenuTest.php
index f4a9c715181bb9a78cb752347335897c9bfed97c..cf3ecae643c7f1be9588419c6d70d8339d612fe8 100644
--- a/typo3/sysext/backend/Tests/Unit/Template/Components/MenuTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Template/Components/MenuTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Template\Components;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Template\Components\Menu\Menu;
 use TYPO3\CMS\Backend\Template\Components\MenuRegistry;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -25,9 +26,8 @@ final class MenuTest extends UnitTestCase
 {
     /**
      * Try setting an empty menu
-     *
-     * @test
      */
+    #[Test]
     public function isMenuValidBlankCallExpectFalse(): void
     {
         $menu = new Menu();
@@ -37,9 +37,8 @@ final class MenuTest extends UnitTestCase
 
     /**
      * Set a valid menu
-     *
-     * @test
      */
+    #[Test]
     public function isMenuValidValidMenuWithDefaultsExpectTrue(): void
     {
         $menu = new Menu();
@@ -50,9 +49,8 @@ final class MenuTest extends UnitTestCase
 
     /**
      * Set a valid menu
-     *
-     * @test
      */
+    #[Test]
     public function makeMenuAllGoodExpectTrue(): void
     {
         $menuRegistry = new MenuRegistry();
@@ -65,9 +63,8 @@ final class MenuTest extends UnitTestCase
 
     /**
      * Tests if empty menus get removed from the stack
-     *
-     * @test
      */
+    #[Test]
     public function getMenusRemovedEmptyMenusExpectsEquals(): void
     {
         $menuRegistry = new MenuRegistry();
diff --git a/typo3/sysext/backend/Tests/Unit/Tree/SortedTreeNodeCollectionTest.php b/typo3/sysext/backend/Tests/Unit/Tree/SortedTreeNodeCollectionTest.php
index 657fa840c50d4e3f23babe3a44537c0dde2248d4..0ff147237e7b316667e43895e2c2c5207516054c 100644
--- a/typo3/sysext/backend/Tests/Unit/Tree/SortedTreeNodeCollectionTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Tree/SortedTreeNodeCollectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Tree;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Tree\SortedTreeNodeCollection;
 use TYPO3\CMS\Backend\Tree\TreeNode;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -48,9 +49,7 @@ final class SortedTreeNodeCollectionTest extends UnitTestCase
         return $nodeCollection;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function appendsSorted(): void
     {
         $nodeCollection = $this->createTestCollection();
@@ -62,9 +61,7 @@ final class SortedTreeNodeCollectionTest extends UnitTestCase
         self::assertSame($expected, $ids);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function collectionContainsNode(): void
     {
         $nodeCollection = $this->createTestCollection();
@@ -72,9 +69,7 @@ final class SortedTreeNodeCollectionTest extends UnitTestCase
         self::assertTrue($nodeCollection->contains($node));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function searchDataWithBinarySearch(): void
     {
         $nodeCollection = $this->createTestCollection();
diff --git a/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeCollectionTest.php b/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeCollectionTest.php
index a288e95a769724464b6dad1d7049ded58c87061c..16373372d5ded08acd8e3c7805ae1271d2a12786 100644
--- a/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeCollectionTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeCollectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Tree;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Tree\TreeNode;
 use TYPO3\CMS\Backend\Tree\TreeNodeCollection;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class TreeNodeCollectionTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function sortNodes(): void
     {
         $nodeCollection = new TreeNodeCollection([
diff --git a/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeTest.php b/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeTest.php
index 2fe971f0bfec58c2cd7c37ae4ab5e42446f1c20f..fff181e29c54b2f444e9cee2a5b5193ca3ec7e8d 100644
--- a/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Tree/TreeNodeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Tree;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Tree\TreeNode;
 use TYPO3\CMS\Backend\Tree\TreeNodeCollection;
 use TYPO3\CMS\Backend\Tree\TreeRepresentationNode;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TreeNodeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function serializeFixture(): void
     {
         $expected = trim(file_get_contents(__DIR__ . '/Fixtures/serialized.txt'));
@@ -57,9 +56,7 @@ final class TreeNodeTest extends UnitTestCase
         self::assertSame($expected, $serializedString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deserializeFixture(): void
     {
         $source = trim(file_get_contents(__DIR__ . '/Fixtures/serialized.txt'));
@@ -68,9 +65,7 @@ final class TreeNodeTest extends UnitTestCase
         self::assertSame($source, $serializedString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compareNodes(): void
     {
         $node = new TreeNode(['id' => '15']);
diff --git a/typo3/sysext/backend/Tests/Unit/Utility/BackendUtilityTest.php b/typo3/sysext/backend/Tests/Unit/Utility/BackendUtilityTest.php
index 7f95a6b86d1ae07f8b1969084851386156506b43..8f3a8376d3252644556e2bb5b5bf11c8060ba10d 100644
--- a/typo3/sysext/backend/Tests/Unit/Utility/BackendUtilityTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Utility/BackendUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Tests\Unit\Utility\Fixtures\LabelFromItemListMergedReturnsCorrectFieldsFixture;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -115,10 +117,8 @@ final class BackendUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider calcAgeDataProvider
-     */
+    #[DataProvider('calcAgeDataProvider')]
+    #[Test]
     public function calcAgeReturnsExpectedValues(int $seconds, string $expectedLabel): void
     {
         self::assertSame($expectedLabel, BackendUtility::calcAge($seconds));
@@ -128,9 +128,9 @@ final class BackendUtilityTest extends UnitTestCase
     // Tests concerning getProcessedValue
     ///////////////////////////////////////
     /**
-     * @test
      * @see https://forge.typo3.org/issues/20994
      */
+    #[Test]
     public function getProcessedValueForZeroStringIsZero(): void
     {
         $GLOBALS['TCA'] = [
@@ -150,9 +150,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertEquals('0', BackendUtility::getProcessedValue('tt_content', 'header', '0'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForGroup(): void
     {
         $GLOBALS['TCA'] = [
@@ -172,9 +170,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('testLabel', BackendUtility::getProcessedValue('tt_content', 'multimedia', '1,2'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForFlexNull(): void
     {
         $GLOBALS['TCA'] = [
@@ -194,9 +190,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('', BackendUtility::getProcessedValue('tt_content', 'pi_flexform', null));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForDatetimeDbTypeDateNull(): void
     {
         $GLOBALS['TCA'] = [
@@ -218,9 +212,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('', BackendUtility::getProcessedValue('tt_content', 'header', null));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForDatetimeDbTypeDatetime(): void
     {
         $GLOBALS['TCA'] = [
@@ -243,9 +235,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame($expected, BackendUtility::getProcessedValue('tt_content', 'header', $value));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForDatetimeDbTypeDatetimeNull(): void
     {
         $GLOBALS['TCA'] = [
@@ -266,9 +256,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('', BackendUtility::getProcessedValue('tt_content', 'header', null));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForDatetimeDbTypeDate(): void
     {
         $GLOBALS['TCA'] = [
@@ -293,9 +281,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame($expected, BackendUtility::getProcessedValue('tt_content', 'header', $value));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForFlex(): void
     {
         $GLOBALS['TCA'] = [
@@ -338,9 +324,7 @@ final class BackendUtilityTest extends UnitTestCase
 </T3FlexForms>'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForGroupWithOneAllowedTable(): void
     {
         $GLOBALS['TCA'] = [
@@ -402,9 +386,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('Page 1, Page 2', BackendUtility::getProcessedValue('tt_content', 'pages', '1,2'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForGroupWithMultipleAllowedTables(): void
     {
         $GLOBALS['TCA'] = [
@@ -472,9 +454,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('Page 1, Configuration 2', BackendUtility::getProcessedValue('index_config', 'indexcfgs', 'pages_1,index_config_2'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForSelectWithMMRelation(): void
     {
         $relationHandlerMock = $this->getMockBuilder(RelationHandler::class)->getMock();
@@ -561,9 +541,7 @@ final class BackendUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueDisplaysAgeForDateInputFieldsIfSettingAbsent(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -610,11 +588,10 @@ final class BackendUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider inputTypeDateDisplayOptions
-     *
      * @param bool|int $input
      */
+    #[DataProvider('inputTypeDateDisplayOptions')]
+    #[Test]
     public function getProcessedValueHandlesAgeDisplayCorrectly($input, string $expected): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -640,9 +617,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame($expected, BackendUtility::getProcessedValue('tt_content', 'date', mktime(0, 0, 0, 8, 28, 2015)));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForCheckWithSingleItem(): void
     {
         $GLOBALS['TCA'] = [
@@ -672,9 +647,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('Yes', BackendUtility::getProcessedValue('tt_content', 'hide', 1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueForCheckWithSingleItemInvertStateDisplay(): void
     {
         $GLOBALS['TCA'] = [
@@ -800,10 +773,8 @@ final class BackendUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getCommonSelectFieldsReturnsCorrectFieldsDataProvider
-     */
+    #[DataProvider('getCommonSelectFieldsReturnsCorrectFieldsDataProvider')]
+    #[Test]
     public function getCommonSelectFieldsReturnsCorrectFields(
         string $table,
         string $prefix,
@@ -903,10 +874,8 @@ final class BackendUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getLabelFromItemlistReturnsCorrectFieldsDataProvider
-     */
+    #[DataProvider('getLabelFromItemlistReturnsCorrectFieldsDataProvider')]
+    #[Test]
     public function getLabelFromItemlistReturnsCorrectFields(
         string $table,
         string $col,
@@ -978,10 +947,8 @@ final class BackendUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getLabelFromItemListMergedReturnsCorrectFieldsDataProvider
-     */
+    #[DataProvider('getLabelFromItemListMergedReturnsCorrectFieldsDataProvider')]
+    #[Test]
     public function getLabelFromItemListMergedReturnsCorrectFields(
         int $pageId,
         string $table,
@@ -1064,10 +1031,8 @@ final class BackendUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getLabelsFromItemsListDataProvider
-     */
+    #[DataProvider('getLabelsFromItemsListDataProvider')]
+    #[Test]
     public function getLabelsFromItemsListReturnsCorrectValue(
         string $table,
         string $col,
@@ -1097,9 +1062,7 @@ final class BackendUtilityTest extends UnitTestCase
         GeneralUtility::purgeInstances();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueReturnsLabelsForExistingValuesSolely(): void
     {
         $table = 'foobar';
@@ -1126,9 +1089,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertEquals('aFooLabel, aBarLabel', $label);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedValueReturnsPlainValueIfItemIsNotFound(): void
     {
         $table = 'foobar';
@@ -1154,9 +1115,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertEquals('invalidKey', $label);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dateTimeAgeReturnsCorrectValues(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -1168,9 +1127,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame('24-03-16 (-1 day)', BackendUtility::dateTimeAge($GLOBALS['EXEC_TIME'] + 86400, 1, 'date'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function purgeComputedPropertyNamesRemovesPropertiesStartingWithUnderscore(): void
     {
         $propertyNames = [
@@ -1182,9 +1139,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame(['uid', 'pid'], $computedPropertyNames);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function purgeComputedPropertiesFromRecordRemovesPropertiesStartingWithUnderscore(): void
     {
         $record = [
@@ -1222,19 +1177,15 @@ final class BackendUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider splitTableUidDataProvider
-     */
+    #[DataProvider('splitTableUidDataProvider')]
+    #[Test]
     public function splitTableUid($input, $expected): void
     {
         $result = BackendUtility::splitTable_Uid($input);
         self::assertSame($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function returnNullForMissingTcaConfigInResolveFileReferences(): void
     {
         $tableName = 'table_a';
@@ -1243,10 +1194,8 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertNull(BackendUtility::resolveFileReferences($tableName, $fieldName, []));
     }
 
-    /**
-     * @test
-     * @dataProvider unfitResolveFileReferencesTableConfig
-     */
+    #[DataProvider('unfitResolveFileReferencesTableConfig')]
+    #[Test]
     public function returnNullForUnfitTableConfigInResolveFileReferences(array $config): void
     {
         $tableName = 'table_a';
@@ -1291,9 +1240,7 @@ final class BackendUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function workspaceOLDoesNotChangeValuesForNoBeUserAvailable(): void
     {
         $GLOBALS['BE_USER'] = null;
@@ -1307,9 +1254,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame($reference, $row);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveFileReferencesReturnsEmptyResultForNoReferencesAvailable(): void
     {
         $tableName = 'table_a';
@@ -1338,9 +1283,7 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertEmpty(BackendUtility::resolveFileReferences($tableName, $fieldName, $elementData));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function wsMapIdReturnsLiveIdIfNoBeUserIsAvailable(): void
     {
         $GLOBALS['BE_USER'] = null;
@@ -1349,18 +1292,14 @@ final class BackendUtilityTest extends UnitTestCase
         self::assertSame(42, BackendUtility::wsMapId($tableName, $uid));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllowedFieldsForTableReturnsEmptyArrayOnBrokenTca(): void
     {
         $GLOBALS['BE_USER'] = new BackendUserAuthentication();
         self::assertEmpty(BackendUtility::getAllowedFieldsForTable('myTable', false));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllowedFieldsForTableReturnsUniqueList(): void
     {
         $GLOBALS['BE_USER'] = new BackendUserAuthentication();
diff --git a/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutCollectionTest.php b/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutCollectionTest.php
index 87df4f2c09319cb60a44c2e6617551fbbf389d43..b4c0b6b76bdedf2e67090c94572c0ad17e3cdca1 100644
--- a/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutCollectionTest.php
+++ b/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutCollectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\View\BackendLayout;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\View\BackendLayout\BackendLayout;
 use TYPO3\CMS\Backend\View\BackendLayout\BackendLayoutCollection;
 use TYPO3\CMS\Core\Utility\StringUtility;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class BackendLayoutCollectionTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidIdentifierIsRecognizedOnCreation(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -38,9 +37,7 @@ final class BackendLayoutCollectionTest extends UnitTestCase
         new BackendLayoutCollection($identifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectIsCreated(): void
     {
         $identifier = StringUtility::getUniqueId('identifier');
@@ -49,9 +46,7 @@ final class BackendLayoutCollectionTest extends UnitTestCase
         self::assertEquals($identifier, $backendLayoutCollection->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidBackendLayoutIsRecognizedOnAdding(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -68,9 +63,7 @@ final class BackendLayoutCollectionTest extends UnitTestCase
         $backendLayoutCollection->add($backendLayoutMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function duplicateBackendLayoutIsRecognizedOnAdding(): void
     {
         $this->expectException(\LogicException::class);
@@ -93,9 +86,7 @@ final class BackendLayoutCollectionTest extends UnitTestCase
         $backendLayoutCollection->add($secondBackendLayoutMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function backendLayoutCanBeFetched(): void
     {
         $identifier = StringUtility::getUniqueId('identifier');
diff --git a/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutTest.php b/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutTest.php
index 2ba7ae58f9315fcac06b637e7ffc0c0964d76ad3..49dcc2fef925f4d9128e064fc15848a59e31df22 100644
--- a/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutTest.php
+++ b/typo3/sysext/backend/Tests/Unit/View/BackendLayout/BackendLayoutTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\View\BackendLayout;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\View\BackendLayout\BackendLayout;
 use TYPO3\CMS\Backend\View\BackendLayoutView;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -30,9 +31,7 @@ final class BackendLayoutTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidIdentifierIsRecognizedOnCreation(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -43,9 +42,7 @@ final class BackendLayoutTest extends UnitTestCase
         new BackendLayout($identifier, $title, $configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectIsCreated(): void
     {
         $backendLayoutView = $this->createMock(BackendLayoutView::class);
diff --git a/typo3/sysext/backend/Tests/Unit/View/BackendLayout/DataProviderCollectionTest.php b/typo3/sysext/backend/Tests/Unit/View/BackendLayout/DataProviderCollectionTest.php
index d8b067fa2bedb24ba58721f466ea794c98b453bc..c743c026b55c1c06faf1916c5d039ab524b4d6e5 100644
--- a/typo3/sysext/backend/Tests/Unit/View/BackendLayout/DataProviderCollectionTest.php
+++ b/typo3/sysext/backend/Tests/Unit/View/BackendLayout/DataProviderCollectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\View\BackendLayout;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\View\BackendLayout\BackendLayout;
 use TYPO3\CMS\Backend\View\BackendLayout\DataProviderCollection;
 use TYPO3\CMS\Backend\View\BackendLayout\DefaultDataProvider;
@@ -39,9 +40,7 @@ final class DataProviderCollectionTest extends UnitTestCase
         $this->dataProviderCollection = new DataProviderCollection();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidIdentifierIsRecognizedOnAdding(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -52,9 +51,7 @@ final class DataProviderCollectionTest extends UnitTestCase
         $this->dataProviderCollection->add($identifier, get_class($dataProviderMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidInterfaceIsRecognizedOnAdding(): void
     {
         $this->expectException(\LogicException::class);
@@ -65,9 +62,7 @@ final class DataProviderCollectionTest extends UnitTestCase
         $this->dataProviderCollection->add($identifier, get_class($dataProviderMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultBackendLayoutIsFound(): void
     {
         $backendLayoutIdentifier = StringUtility::getUniqueId('identifier');
@@ -90,9 +85,7 @@ final class DataProviderCollectionTest extends UnitTestCase
         self::assertEquals($backendLayoutIdentifier, $providedBackendLayout->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function providedBackendLayoutIsFound(): void
     {
         $dataProviderIdentifier = StringUtility::getUniqueId('custom');
diff --git a/typo3/sysext/backend/Tests/Unit/View/BackendLayoutViewTest.php b/typo3/sysext/backend/Tests/Unit/View/BackendLayoutViewTest.php
index ab89e11408f123a55e670cdc687ccf0aef68e131..5e56d0c919c1308bf97c02731d37140badea0088 100644
--- a/typo3/sysext/backend/Tests/Unit/View/BackendLayoutViewTest.php
+++ b/typo3/sysext/backend/Tests/Unit/View/BackendLayoutViewTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\Unit\View;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\View\BackendLayoutView;
 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
@@ -43,9 +45,9 @@ final class BackendLayoutViewTest extends UnitTestCase
 
     /**
      * @param bool|string $expected
-     * @test
-     * @dataProvider selectedCombinedIdentifierIsDeterminedDataProvider
      */
+    #[DataProvider('selectedCombinedIdentifierIsDeterminedDataProvider')]
+    #[Test]
     public function selectedCombinedIdentifierIsDetermined($expected, array $page, array $rootLine): void
     {
         $pageId = $page['uid'];
diff --git a/typo3/sysext/backend/Tests/UnitDeprecated/Form/FormDataProvider/TcaFlexPrepareTest.php b/typo3/sysext/backend/Tests/UnitDeprecated/Form/FormDataProvider/TcaFlexPrepareTest.php
index b33bcfc493acb63dfa39bd5af1114249a22b2a98..76f9f6ab71c3d43353a1400730d98a9e5fe5c644 100644
--- a/typo3/sysext/backend/Tests/UnitDeprecated/Form/FormDataProvider/TcaFlexPrepareTest.php
+++ b/typo3/sysext/backend/Tests/UnitDeprecated/Form/FormDataProvider/TcaFlexPrepareTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Backend\Tests\UnitDeprecated\Form\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Backend\Form\FormDataProvider\TcaFlexPrepare;
 use TYPO3\CMS\Core\Cache\CacheManager;
@@ -51,9 +52,7 @@ final class TcaFlexPrepareTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMigratesFlexformTca(): void
     {
         $input = [
@@ -125,9 +124,7 @@ final class TcaFlexPrepareTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->addData($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataMigratesFlexformTcaInContainer(): void
     {
         $input = [
diff --git a/typo3/sysext/belog/Tests/Unit/Domain/Model/ConstraintTest.php b/typo3/sysext/belog/Tests/Unit/Domain/Model/ConstraintTest.php
index 9e991b15d5fdb443dae11dbef2366a1f289e1387..d23f205e46892e3d42419d25ec1ee7d1f99e67e4 100644
--- a/typo3/sysext/belog/Tests/Unit/Domain/Model/ConstraintTest.php
+++ b/typo3/sysext/belog/Tests/Unit/Domain/Model/ConstraintTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Belog\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Belog\Domain\Model\Constraint;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class ConstraintTest extends UnitTestCase
         $this->subject = new Constraint();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setManualDateStartForDateTimeSetsManualDateStart(): void
     {
         $date = new \DateTime();
@@ -40,18 +39,14 @@ final class ConstraintTest extends UnitTestCase
         self::assertEquals($date, $this->subject->getManualDateStart());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setManualDateStartForNoArgumentSetsManualDateStart(): void
     {
         $this->subject->setManualDateStart();
         self::assertNull($this->subject->getManualDateStart());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setManualDateStopForDateTimeSetsManualDateStop(): void
     {
         $date = new \DateTime();
@@ -59,9 +54,7 @@ final class ConstraintTest extends UnitTestCase
         self::assertEquals($date, $this->subject->getManualDateStop());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setManualDateStopForNoArgumentSetsManualDateStop(): void
     {
         $this->subject->setManualDateStop();
diff --git a/typo3/sysext/belog/Tests/Unit/Domain/Model/LogEntryTest.php b/typo3/sysext/belog/Tests/Unit/Domain/Model/LogEntryTest.php
index e167a32c796c5252b4706b6680bae9b556e0740b..0a5ba4c5c7f7e3f6293ab4a99deb34992ac86b9c 100644
--- a/typo3/sysext/belog/Tests/Unit/Domain/Model/LogEntryTest.php
+++ b/typo3/sysext/belog/Tests/Unit/Domain/Model/LogEntryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Belog\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Belog\Domain\Model\LogEntry;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,35 +32,27 @@ final class LogEntryTest extends UnitTestCase
         $this->subject = new LogEntry();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLogDataInitiallyReturnsEmptyArray(): void
     {
         self::assertSame([], $this->subject->getLogData());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLogDataForEmptyStringLogDataReturnsEmptyArray(): void
     {
         $this->subject->setLogData('');
         self::assertSame([], $this->subject->getLogData());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLogDataForGarbageStringLogDataReturnsEmptyArray(): void
     {
         $this->subject->setLogData('foo bar');
         self::assertSame([], $this->subject->getLogData());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLogDataForSerializedArrayReturnsThatArray(): void
     {
         $logData = ['foo', 'bar'];
@@ -66,9 +60,7 @@ final class LogEntryTest extends UnitTestCase
         self::assertSame($logData, $this->subject->getLogData());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLogDataForSerializedObjectReturnsEmptyArray(): void
     {
         $this->subject->setLogData(serialize(new \stdClass()));
@@ -97,10 +89,8 @@ final class LogEntryTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getErrorIconReturnsCorrespondingClassDataProvider
-     */
+    #[DataProvider('getErrorIconReturnsCorrespondingClassDataProvider')]
+    #[Test]
     public function getErrorIconReturnsCorrespondingClass(int $error, string $expectedClass): void
     {
         $this->subject->setError($error);
diff --git a/typo3/sysext/belog/Tests/Unit/Domain/Repository/LogEntryRepositoryTest.php b/typo3/sysext/belog/Tests/Unit/Domain/Repository/LogEntryRepositoryTest.php
index 13b1a7ddce46e407ac7c2d55824df241ef2bc3c3..93af3669838b308e29e1728655509d28095aac2d 100644
--- a/typo3/sysext/belog/Tests/Unit/Domain/Repository/LogEntryRepositoryTest.php
+++ b/typo3/sysext/belog/Tests/Unit/Domain/Repository/LogEntryRepositoryTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Belog\Tests\Unit\Domain\Repository;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Belog\Domain\Repository\LogEntryRepository;
 use TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LogEntryRepositoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeObjectSetsRespectStoragePidToFalse(): void
     {
         $querySettings = $this->getMockBuilder(QuerySettingsInterface::class)->getMock();
diff --git a/typo3/sysext/beuser/Tests/Unit/Domain/Model/BackendUserTest.php b/typo3/sysext/beuser/Tests/Unit/Domain/Model/BackendUserTest.php
index 7ae486856c37f38cae13ac758102fb4b06018c92..4e221f7741a1403f8efab4cd9aefe6405adf5505 100644
--- a/typo3/sysext/beuser/Tests/Unit/Domain/Model/BackendUserTest.php
+++ b/typo3/sysext/beuser/Tests/Unit/Domain/Model/BackendUserTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Beuser\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Beuser\Domain\Model\BackendUser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,25 +31,19 @@ final class BackendUserTest extends UnitTestCase
         $this->subject = new BackendUser();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUidReturnsInitialValueForInt(): void
     {
         self::assertNull($this->subject->getUid(), 'Not uid set after initialization.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUserNameReturnsInitialValueForString(): void
     {
         self::assertSame($this->subject->getUserName(), '', 'Username not empty');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setUserNameForStringSetsUserName(): void
     {
         $newUserName = 'DonJuan';
@@ -56,17 +51,13 @@ final class BackendUserTest extends UnitTestCase
         self::assertSame($this->subject->getUserName(), $newUserName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRealNameReturnInitialValueForString(): void
     {
         self::assertSame($this->subject->getRealName(), '', 'Real name not empty');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRealNameForStringSetsName(): void
     {
         $realName = 'Conceived at T3CON2018';
@@ -74,26 +65,20 @@ final class BackendUserTest extends UnitTestCase
         self::assertSame($this->subject->getRealName(), $realName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAdminReturnInitialValueForBoolean(): void
     {
         self::assertFalse($this->subject->getIsAdministrator(), 'Admin status is correct.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdminToTrueSetsAdmin(): void
     {
         $this->subject->setIsAdministrator(true);
         self::assertTrue($this->subject->getIsAdministrator(), 'Admin status is not true, after setting to true.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdminToFalseSetsAdmin(): void
     {
         $this->subject->setIsAdministrator(false);
diff --git a/typo3/sysext/beuser/Tests/Unit/Domain/Model/DemandTest.php b/typo3/sysext/beuser/Tests/Unit/Domain/Model/DemandTest.php
index 9688673a4124457fc560d4aa16a306aa7529b8fe..cf8d31fe2a098a4edf5de658cff03a7daea0e479 100644
--- a/typo3/sysext/beuser/Tests/Unit/Domain/Model/DemandTest.php
+++ b/typo3/sysext/beuser/Tests/Unit/Domain/Model/DemandTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Beuser\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Beuser\Domain\Model\Demand;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class DemandTest extends UnitTestCase
         $this->subject = new Demand();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setUserTypeAllExpectedValueForInt(): void
     {
         $userType = Demand::ALL;
@@ -40,9 +39,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getUserType(), $userType);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setUserTypeAdminOnlyExpectedValueForInt(): void
     {
         $userType = Demand::USERTYPE_ADMINONLY;
@@ -50,9 +47,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getUserType(), $userType);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setUserTypeUserOnlyExpectedValueForInt(): void
     {
         $userType = Demand::USERTYPE_USERONLY;
@@ -60,9 +55,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getUserType(), $userType);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setStatusAllExpectedValueForInt(): void
     {
         $status = Demand::ALL;
@@ -70,9 +63,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getStatus(), $status);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setStatusActiveExpectedValueForInt(): void
     {
         $status = Demand::STATUS_ACTIVE;
@@ -80,9 +71,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getStatus(), $status);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setStatusInactiveExpectedValueForInt(): void
     {
         $status = Demand::STATUS_INACTIVE;
@@ -90,9 +79,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getStatus(), $status);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLoginAllExpectedValueForInt(): void
     {
         $login = Demand::ALL;
@@ -100,9 +87,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getLogins(), $login);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLoginNoneExpectedValueForInt(): void
     {
         $login = Demand::LOGIN_NONE;
@@ -110,9 +95,7 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getLogins(), $login);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLoginSameExpectedValueForInt(): void
     {
         $login = Demand::LOGIN_SOME;
@@ -120,17 +103,13 @@ final class DemandTest extends UnitTestCase
         self::assertSame($this->subject->getLogins(), $login);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUserNameInitialValueForString(): void
     {
         self::assertSame($this->subject->getUserName(), '', 'UserName must be empty string.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setUserNameReturnExpectedValueForString(): void
     {
         $newUserName = 'User#ää*%^name';
diff --git a/typo3/sysext/beuser/Tests/Unit/Domain/Repository/BackendUserRepositoryTest.php b/typo3/sysext/beuser/Tests/Unit/Domain/Repository/BackendUserRepositoryTest.php
index 3b7c537dbec9f9a5f43a6dac31995b6deb0b98f0..978ff9c4234aadc6f515816df6d5bcc986713894 100644
--- a/typo3/sysext/beuser/Tests/Unit/Domain/Repository/BackendUserRepositoryTest.php
+++ b/typo3/sysext/beuser/Tests/Unit/Domain/Repository/BackendUserRepositoryTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Beuser\Tests\Unit\Domain\Repository;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Beuser\Domain\Repository\BackendUserRepository;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class BackendUserRepositoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function classCanBeInstantiated(): void
     {
         new BackendUserRepository();
diff --git a/typo3/sysext/beuser/Tests/Unit/Domain/Repository/FileMountRepositoryTest.php b/typo3/sysext/beuser/Tests/Unit/Domain/Repository/FileMountRepositoryTest.php
index ba0a104be1da855f27fe6b8eeb4dcb3d9c5484d1..f502d3f6ba79abd7eacc494fdf04a6520a77c2e8 100644
--- a/typo3/sysext/beuser/Tests/Unit/Domain/Repository/FileMountRepositoryTest.php
+++ b/typo3/sysext/beuser/Tests/Unit/Domain/Repository/FileMountRepositoryTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Beuser\Tests\Unit\Domain\Repository;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Beuser\Domain\Repository\FileMountRepository;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FileMountRepositoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function classCanBeInstantiated(): void
     {
         new FileMountRepository();
diff --git a/typo3/sysext/core/Tests/Unit/Authentication/AuthenticationServiceTest.php b/typo3/sysext/core/Tests/Unit/Authentication/AuthenticationServiceTest.php
index 8708baf4dc0ffea5ede9c37ab06797715e28679d..9ae2bd19595ddb521ccdbf696ada7f916f68c7e7 100644
--- a/typo3/sysext/core/Tests/Unit/Authentication/AuthenticationServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Authentication/AuthenticationServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Authentication;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Authentication\AuthenticationService;
 use TYPO3\CMS\Core\Session\UserSession;
@@ -81,10 +83,8 @@ final class AuthenticationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider processLoginDataProvider
-     */
+    #[DataProvider('processLoginDataProvider')]
+    #[Test]
     public function processLoginReturnsCorrectData(string $passwordSubmissionStrategy, array $loginData, array $expectedProcessedData): void
     {
         $subject = new AuthenticationService();
@@ -93,9 +93,7 @@ final class AuthenticationServiceTest extends UnitTestCase
         self::assertEquals($expectedProcessedData, $loginData);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authUserReturns100IfSubmittedPasswordIsEmpty(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
@@ -108,9 +106,7 @@ final class AuthenticationServiceTest extends UnitTestCase
         self::assertSame(100, $subject->authUser([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authUserReturns100IfUserSubmittedUsernameIsEmpty(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
@@ -123,9 +119,7 @@ final class AuthenticationServiceTest extends UnitTestCase
         self::assertSame(100, $subject->authUser([]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authUserThrowsExceptionIfUserTableIsNotSet(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
@@ -140,9 +134,7 @@ final class AuthenticationServiceTest extends UnitTestCase
         $subject->authUser([]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authUserThrowsExceptionIfPasswordInDbDoesNotResolveToAValidHash(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
@@ -170,9 +162,7 @@ final class AuthenticationServiceTest extends UnitTestCase
         self::assertEquals(100, $subject->authUser($dbUser));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authUserReturns0IfPasswordDoesNotMatch(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
@@ -201,9 +191,7 @@ final class AuthenticationServiceTest extends UnitTestCase
         self::assertSame(0, $subject->authUser($dbUser));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authUserReturns200IfPasswordMatch(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
diff --git a/typo3/sysext/core/Tests/Unit/Authentication/BackendUserAuthenticationTest.php b/typo3/sysext/core/Tests/Unit/Authentication/BackendUserAuthenticationTest.php
index 6ab33611fd5024ba48c57823711839f867e77fd2..8c26c185968d5aec8cc455732a718ee6cd201309 100644
--- a/typo3/sysext/core/Tests/Unit/Authentication/BackendUserAuthenticationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Authentication/BackendUserAuthenticationTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Authentication;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use Psr\EventDispatcher\ListenerProviderInterface;
 use Psr\Log\NullLogger;
@@ -47,9 +49,7 @@ final class BackendUserAuthenticationTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logoffCleansFormProtectionIfBackendUserIsLoggedIn(): void
     {
         $GLOBALS['LANG'] = $this->createMock(LanguageService::class);
@@ -150,10 +150,8 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getFilePermissionsTakesUserDefaultAndStoragePermissionsIntoAccountIfUserIsNotAdminDataProvider
-     */
+    #[DataProvider('getFilePermissionsTakesUserDefaultAndStoragePermissionsIntoAccountIfUserIsNotAdminDataProvider')]
+    #[Test]
     public function getFilePermissionsTakesUserDefaultPermissionsFromTsConfigIntoAccountIfUserIsNotAdmin(array $userTsConfiguration): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -300,10 +298,8 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getFilePermissionsFromStorageDataProvider
-     */
+    #[DataProvider('getFilePermissionsFromStorageDataProvider')]
+    #[Test]
     public function getFilePermissionsFromStorageOverwritesDefaultPermissions(array $defaultPermissions, int $storageUid, array $storagePermissions, array $expectedPermissions): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -335,10 +331,8 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         self::assertEquals($expectedPermissions, $subject->getFilePermissionsForStorage($storageMock));
     }
 
-    /**
-     * @test
-     * @dataProvider getFilePermissionsFromStorageDataProvider
-     */
+    #[DataProvider('getFilePermissionsFromStorageDataProvider')]
+    #[Test]
     public function getFilePermissionsFromStorageAlwaysReturnsDefaultPermissionsForAdmins(array $defaultPermissions, int $storageUid, array $storagePermissions): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -476,10 +470,8 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getFilePermissionsTakesUserDefaultPermissionsFromRecordIntoAccountIfUserIsNotAdminDataProvider
-     */
+    #[DataProvider('getFilePermissionsTakesUserDefaultPermissionsFromRecordIntoAccountIfUserIsNotAdminDataProvider')]
+    #[Test]
     public function getFilePermissionsTakesUserDefaultPermissionsFromRecordIntoAccountIfUserIsNotAdmin(string $permissionValue, array $expectedPermissions): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -497,9 +489,7 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         self::assertEquals($expectedPermissions, $subject->getFilePermissions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilePermissionsGrantsAllPermissionsToAdminUsers(): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -531,9 +521,7 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         self::assertEquals($expectedPermissions, $subject->getFilePermissions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function jsConfirmationReturnsTrueIfPassedValueEqualsConfiguration(): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -548,9 +536,7 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         self::assertFalse($subject->jsConfirmation(JsConfirmation::COPY_MOVE_PASTE));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function jsConfirmationAllowsSettingMultipleBitsInValue(): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -565,10 +551,8 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         self::assertTrue($subject->jsConfirmation(JsConfirmation::COPY_MOVE_PASTE));
     }
 
-    /**
-     * @test
-     * @dataProvider jsConfirmationsWithUnsetBits
-     */
+    #[DataProvider('jsConfirmationsWithUnsetBits')]
+    #[Test]
     public function jsConfirmationAllowsUnsettingBitsInValue(int $jsConfirmation, bool $typeChangeAllowed, bool $copyMovePasteAllowed, bool $deleteAllowed, bool $feEditAllowed, bool $otherAllowed): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -608,9 +592,7 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function jsConfirmationAlwaysReturnsFalseIfNoConfirmationIsSet(): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -625,9 +607,7 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         self::assertFalse($subject->jsConfirmation(JsConfirmation::COPY_MOVE_PASTE));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function jsConfirmationReturnsTrueIfConfigurationIsMissing(): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
@@ -678,10 +658,8 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getPagePermissionsClauseWithValidUserDataProvider
-     */
+    #[DataProvider('getPagePermissionsClauseWithValidUserDataProvider')]
+    #[Test]
     public function getPagePermissionsClauseWithValidUser(int $perms, bool $admin, array $groups, string $expected): void
     {
         // We only need to setup the mocking for the non-admin cases
@@ -720,10 +698,8 @@ final class BackendUserAuthenticationTest extends UnitTestCase
         self::assertEquals($expected, $subject->getPagePermsClause($perms));
     }
 
-    /**
-     * @test
-     * @dataProvider checkAuthModeReturnsExpectedValueDataProvider
-     */
+    #[DataProvider('checkAuthModeReturnsExpectedValueDataProvider')]
+    #[Test]
     public function checkAuthModeReturnsExpectedValue(string $theValue, bool $expectedResult): void
     {
         $subject = $this->getMockBuilder(BackendUserAuthentication::class)
diff --git a/typo3/sysext/core/Tests/Unit/Authentication/IpLockerTest.php b/typo3/sysext/core/Tests/Unit/Authentication/IpLockerTest.php
index 8e2fa8d03e0b3c8a8095939398a69aa9261cca39..e872fca33174c4431a6b7e021ea18416652312a3 100644
--- a/typo3/sysext/core/Tests/Unit/Authentication/IpLockerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Authentication/IpLockerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Authentication;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Authentication\IpLocker;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -134,10 +136,8 @@ final class IpLockerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getSessionIpLockDataProvider
-     */
+    #[DataProvider('getSessionIpLockDataProvider')]
+    #[Test]
     public function getSessionIpLock(string $ipAddress, int $lockIPv4PartCount, int $lockIPv6PartCount, string $expectedLock): void
     {
         $ipLocker = GeneralUtility::makeInstance(IpLocker::class, $lockIPv4PartCount, $lockIPv6PartCount);
diff --git a/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/RecoveryCodesTest.php b/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/RecoveryCodesTest.php
index 08f274f0aee935d063ce1498a1b95d6fee3fba5f..195a9c7cb9724026b661e32abec3af4cf05f2a20 100644
--- a/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/RecoveryCodesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/RecoveryCodesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Authentication\Mfa\Provider;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Authentication\Mfa\Provider\RecoveryCodes;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\BcryptPasswordHash;
 use TYPO3\CMS\Core\Tests\Unit\Authentication\Mfa\Provider\Fixtures\Crypto\PasswordHashing\NoopPasswordHash;
@@ -42,9 +44,7 @@ final class RecoveryCodesTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateRecoveryCodesTest(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing'] = [
@@ -66,9 +66,7 @@ final class RecoveryCodesTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generatePlainRecoveryCodesThrowsExceptionOnInvalidLengthTest(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -76,10 +74,8 @@ final class RecoveryCodesTest extends UnitTestCase
         $this->subject->generatePlainRecoveryCodes(6);
     }
 
-    /**
-     * @test
-     * @dataProvider generatePlainRecoveryCodesTestDataProvider
-     */
+    #[DataProvider('generatePlainRecoveryCodesTestDataProvider')]
+    #[Test]
     public function generatePlainRecoveryCodesTest(int $length, int $quantity): void
     {
         $recoveryCodes = $this->subject->generatePlainRecoveryCodes($length, $quantity);
@@ -99,9 +95,7 @@ final class RecoveryCodesTest extends UnitTestCase
         yield '10 codes with 10 chars' => [10, 10];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generatedHashedRecoveryCodesAreHashedWithDefaultHashInstanceTest(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing'] = [
@@ -118,9 +112,7 @@ final class RecoveryCodesTest extends UnitTestCase
         self::assertCount(2, $codes);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function verifyRecoveryCodeTest(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing'] = [
@@ -146,9 +138,7 @@ final class RecoveryCodesTest extends UnitTestCase
         self::assertFalse($this->subject->verifyRecoveryCode($recoveryCode, $codes));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function verifyRecoveryCodeUsesTheCorrectHashInstanceTest(): void
     {
         $code = '18742989';
diff --git a/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/TotpTest.php b/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/TotpTest.php
index 2ba45b6c26249a95af29445febaf5d2370408d24..97c0598485c1f8440dae63b5ee268d11265ac696 100644
--- a/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/TotpTest.php
+++ b/typo3/sysext/core/Tests/Unit/Authentication/Mfa/Provider/TotpTest.php
@@ -18,6 +18,8 @@ declare(strict_types=1);
 namespace TYPO3\CMS\Core\Tests\Unit\Authentication\Mfa\Provider;
 
 use Base32\Base32;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Authentication\Mfa\Provider\Totp;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Context\DateTimeAspect;
@@ -37,9 +39,7 @@ final class TotpTest extends UnitTestCase
         $this->secret = Base32::encode('TYPO3IsAwesome!'); // KRMVATZTJFZUC53FONXW2ZJB
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionOnDisallowedAlogTest(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -47,9 +47,7 @@ final class TotpTest extends UnitTestCase
         GeneralUtility::makeInstance(Totp::class, 'some-secret', 'md5');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionOnInvalidTotpLengthTest(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -57,10 +55,8 @@ final class TotpTest extends UnitTestCase
         GeneralUtility::makeInstance(Totp::class, 'some-secret', 'sha1', 4);
     }
 
-    /**
-     * @test
-     * @dataProvider totpDataProvider
-     */
+    #[DataProvider('totpDataProvider')]
+    #[Test]
     public function generateTotpTest(string $expectedTotp, array $arguments): void
     {
         $counter = (int)floor(($this->timestamp - 0) / 30); // see Totp::getTimeCounter()
@@ -71,10 +67,8 @@ final class TotpTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider totpDataProvider
-     */
+    #[DataProvider('totpDataProvider')]
+    #[Test]
     public function verifyTotpTest(string $totp, array $arguments): void
     {
         GeneralUtility::makeInstance(Context::class)
@@ -94,9 +88,7 @@ final class TotpTest extends UnitTestCase
         yield '8 digit code' => ['48337475', ['sha1', 8]];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function verifyTotpWithGracePeriodTest(): void
     {
         GeneralUtility::makeInstance(Context::class)
@@ -123,10 +115,8 @@ final class TotpTest extends UnitTestCase
         self::assertFalse($totpInstance->verifyTotp($totpPast, 3));
     }
 
-    /**
-     * @test
-     * @dataProvider getTotpAuthUrlTestDataProvider
-     */
+    #[DataProvider('getTotpAuthUrlTestDataProvider')]
+    #[Test]
     public function getTotpAuthUrlTest(array $constructorArguments, array $methodArguments, string $expected): void
     {
         $totp = GeneralUtility::makeInstance(Totp::class, ...$constructorArguments);
@@ -168,9 +158,7 @@ final class TotpTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateEncodedSecretTest(): void
     {
         // Check 100 times WITHOUT additional auth factors
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Backend/AbstractBackendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Backend/AbstractBackendTest.php
index 784d6010b28089bc19d9037cf345d2c02eb8092c..8db959b9964e03ecc8e4afb37251de089b958a26 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Backend/AbstractBackendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Backend/AbstractBackendTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Backend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Cache\Backend\Fixtures\ConcreteBackendFixture;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -24,9 +25,7 @@ final class AbstractBackendTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorCallsSetterMethodsForAllSpecifiedOptions(): void
     {
         // The fixture class implements methods setSomeOption() and getSomeOption()
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php
index cf598d914a51eefb67e31f6bd7ac8f592cc5e2d8..81d02162c97ed8e4119809dc032f9a1e4f4e0f65 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Backend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\TransientMemoryBackend;
 use TYPO3\CMS\Core\Cache\Exception;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
@@ -29,9 +30,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setThrowsExceptionIfNoFrontEndHasBeenSet(): void
     {
         $this->expectException(Exception::class);
@@ -43,9 +42,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         $backend->set($identifier, $data);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function itIsPossibleToSetAndCheckExistenceInCache(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -58,9 +55,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertTrue($inCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function itIsPossibleToSetAndGetEntry(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -73,9 +68,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertEquals($data, $fetchedData);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function itIsPossibleToRemoveEntryFromCache(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -89,9 +82,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertFalse($inCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function itIsPossibleToOverwriteAnEntryInTheCache(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -106,9 +97,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertEquals($otherData, $fetchedData);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findIdentifiersByTagFindsCacheEntriesWithSpecifiedTag(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -123,9 +112,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertEquals($entryIdentifier, $retrieved[0]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasReturnsFalseIfTheEntryDoesntExist(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -136,9 +123,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertFalse($inCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeReturnsFalseIfTheEntryDoesntExist(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -149,9 +134,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertFalse($inCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushByTagRemovesCacheEntriesWithSpecifiedTag(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -167,9 +150,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertTrue($backend->has('TransientMemoryBackendTest3'), 'TransientMemoryBackendTest3');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushByTagsRemovesCacheEntriesWithSpecifiedTags(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
@@ -185,9 +166,7 @@ final class TransientMemoryBackendTest extends UnitTestCase
         self::assertTrue($backend->has('TransientMemoryBackendTest3'), 'TransientMemoryBackendTest3');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushRemovesAllCacheEntries(): void
     {
         $cache = $this->createMock(FrontendInterface::class);
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php
index a7c0799d997ae2b42a7c50cbe8b49f370fc5e9e0..fe21f51a0a0b725c0fb207fa0af1346df343ee2f 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Backend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\Typo3DatabaseBackend;
 use TYPO3\CMS\Core\Cache\Exception;
 use TYPO3\CMS\Core\Cache\Exception\InvalidDataException;
@@ -30,9 +31,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setCacheCalculatesCacheTableName(): void
     {
         $frontend = new NullFrontend('test');
@@ -42,9 +41,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         self::assertEquals('cache_test', $subject->getCacheTable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setCacheCalculatesTagsTableName(): void
     {
         $frontend = new NullFrontend('test');
@@ -54,9 +51,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         self::assertEquals('cache_test_tags', $subject->getTagsTable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -65,9 +60,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->set('identifier', 'data');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setThrowsExceptionIfDataIsNotAString(): void
     {
         $frontend = new NullFrontend('test');
@@ -80,9 +73,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->set('identifier', ['iAmAnArray']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -91,9 +82,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->get('identifier');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -102,9 +91,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->has('identifier');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -113,9 +100,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->remove('identifier');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function collectGarbageThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -124,9 +109,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->collectGarbage();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findIdentifiersByTagThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -135,9 +118,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->findIdentifiersByTag('identifier');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -146,9 +127,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->flush();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushRemovesAllCacheEntries(): void
     {
         $frontend = new NullFrontend('test');
@@ -228,9 +207,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->flushByTags(['Tag1', 'Tag2']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushByTagThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
@@ -239,9 +216,7 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $subject->flushByTag('Tag');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushByTagsThrowsExceptionIfFrontendWasNotSet(): void
     {
         $subject = new Typo3DatabaseBackend('Testing');
diff --git a/typo3/sysext/core/Tests/Unit/Cache/CacheManagerTest.php b/typo3/sysext/core/Tests/Unit/Cache/CacheManagerTest.php
index 9c7d2e242ff79c40aa5af649f5454c2eee4199b8..87b8a67d14348f82979d17cb943ec4706885d0d8 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/CacheManagerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/CacheManagerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\Typo3DatabaseBackend;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Exception\DuplicateIdentifierException;
@@ -40,9 +41,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CacheManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function managerThrowsExceptionOnCacheRegistrationWithAlreadyExistingIdentifier(): void
     {
         $this->expectException(DuplicateIdentifierException::class);
@@ -63,9 +62,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->registerCache($cache2);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function managerReturnsThePreviouslyRegisteredCache(): void
     {
         $manager = new CacheManager();
@@ -84,9 +81,7 @@ final class CacheManagerTest extends UnitTestCase
         self::assertSame($cache2, $manager->getCache('cache2'), 'The cache returned by getCache() was not the same I registered.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheThrowsExceptionForNonExistingIdentifier(): void
     {
         $this->expectException(NoSuchCacheException::class);
@@ -103,9 +98,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache('doesnotexist');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasCacheReturnsCorrectResult(): void
     {
         $manager = new CacheManager();
@@ -119,9 +112,7 @@ final class CacheManagerTest extends UnitTestCase
         self::assertFalse($manager->hasCache('cache2'), 'hasCache() did not return FALSE.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCachesByTagCallsTheFlushByTagMethodOfAllRegisteredCaches(): void
     {
         $manager = new CacheManager();
@@ -141,9 +132,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->flushCachesByTag('theTag');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCachesByTagsCallsTheFlushByTagsMethodOfAllRegisteredCaches(): void
     {
         $manager = new CacheManager();
@@ -163,9 +152,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->flushCachesByTags(['theTag']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCachesCallsTheFlushMethodOfAllRegisteredCaches(): void
     {
         $manager = new CacheManager();
@@ -185,9 +172,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->flushCaches();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCachesInGroupThrowsExceptionForNonExistingGroup(): void
     {
         $this->expectException(NoSuchCacheGroupException::class);
@@ -197,9 +182,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->flushCachesInGroup('nonExistingGroup');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCachesInGroupByTagThrowsExceptionForNonExistingGroup(): void
     {
         $this->expectException(NoSuchCacheGroupException::class);
@@ -209,9 +192,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->flushCachesInGroup('nonExistingGroup');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheThrowsExceptionIfConfiguredFrontendDoesNotImplementFrontendInterface(): void
     {
         $manager = new CacheManager();
@@ -229,9 +210,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheThrowsExceptionIfConfiguredBackendDoesNotImplementBackendInterface(): void
     {
         $manager = new CacheManager();
@@ -249,9 +228,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheCallsInitializeObjectOnFrontendInstance(): void
     {
         $manager = new CacheManager();
@@ -270,9 +247,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheCallsInitializeObjectOnBackendInstance(): void
     {
         $manager = new CacheManager();
@@ -291,9 +266,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheCreatesBackendWithGivenConfiguration(): void
     {
         $manager = new CacheManager();
@@ -314,9 +287,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheCreatesCacheInstanceWithFallbackToDefaultFrontend(): void
     {
         $manager = $this->getAccessibleMock(CacheManager::class, null, [], '', false);
@@ -339,9 +310,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheCreatesCacheInstanceWithFallbackToDefaultBackend(): void
     {
         $manager = $this->getAccessibleMock(CacheManager::class, null, [], '', false);
@@ -364,9 +333,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheReturnsInstanceOfTheSpecifiedCacheFrontend(): void
     {
         $manager = new CacheManager();
@@ -382,9 +349,7 @@ final class CacheManagerTest extends UnitTestCase
         self::assertInstanceOf(FrontendFixture::class, $manager->getCache($cacheIdentifier));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheGivesIdentifierToCacheFrontend(): void
     {
         $manager = new CacheManager();
@@ -402,9 +367,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheGivesBackendInstanceToCacheFrontend(): void
     {
         $manager = new CacheManager();
@@ -422,9 +385,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->getCache($cacheIdentifier);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCachesInGroupByTagsWithEmptyTagsArrayDoesNotFlushCaches(): void
     {
         $manager = $this->getAccessibleMock(CacheManager::class, null, [], '', false);
@@ -457,9 +418,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->flushCachesInGroupByTags('group2', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCachesInGroupByTagsDeletesByTag(): void
     {
         $manager = $this->getAccessibleMock(CacheManager::class, null, [], '', false);
@@ -493,9 +452,7 @@ final class CacheManagerTest extends UnitTestCase
         $manager->flushCachesInGroupByTags('group2', $tags);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setCacheConfigurationsThrowsExceptionIfConfiguredCacheDoesNotHaveAnIdentifier(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php
index acfb8439b2b215c9e30ca198e2638b171cd0f529..0338d06de5e03a4e9b13f63264585ef5c13ed48a 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Frontend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\AbstractBackend;
 use TYPO3\CMS\Core\Cache\Backend\TaggableBackendInterface;
 use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class AbstractFrontendTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorAcceptsValidIdentifiers(): void
     {
         $mockBackend = $this->getMockBuilder(AbstractBackend::class)
@@ -45,9 +44,7 @@ final class AbstractFrontendTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorRejectsInvalidIdentifiers(): void
     {
         $mockBackend = $this->getMockBuilder(AbstractBackend::class)
@@ -67,9 +64,7 @@ final class AbstractFrontendTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCallsBackend(): void
     {
         $identifier = 'someCacheIdentifier';
@@ -86,9 +81,7 @@ final class AbstractFrontendTest extends UnitTestCase
         $cache->flush();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushByTagRejectsInvalidTags(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -104,9 +97,7 @@ final class AbstractFrontendTest extends UnitTestCase
         $cache->flushByTag('SomeInvalid\\Tag');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushByTagCallsBackendIfItIsATaggableBackend(): void
     {
         $tag = 'sometag';
@@ -123,9 +114,7 @@ final class AbstractFrontendTest extends UnitTestCase
         $cache->flushByTag($tag);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function flushByTagsCallsBackendIfItIsATaggableBackend(): void
     {
         $tag = 'sometag';
@@ -142,9 +131,7 @@ final class AbstractFrontendTest extends UnitTestCase
         $cache->flushByTags([$tag]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function collectGarbageCallsBackend(): void
     {
         $identifier = 'someCacheIdentifier';
@@ -161,9 +148,7 @@ final class AbstractFrontendTest extends UnitTestCase
         $cache->collectGarbage();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidEntryIdentifiersAreRecognizedAsInvalid(): void
     {
         $identifier = 'someCacheIdentifier';
@@ -177,9 +162,7 @@ final class AbstractFrontendTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validEntryIdentifiersAreRecognizedAsValid(): void
     {
         $identifier = 'someCacheIdentifier';
@@ -193,9 +176,7 @@ final class AbstractFrontendTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidTagsAreRecognizedAsInvalid(): void
     {
         $identifier = 'someCacheIdentifier';
@@ -209,9 +190,7 @@ final class AbstractFrontendTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validTagsAreRecognizedAsValid(): void
     {
         $identifier = 'someCacheIdentifier';
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php
index ec220a4ddc7e2d61e0dfde3249bda0b9c1561289..56364d94a6c7404be943eaccc686bbcd394ec08e 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Frontend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\PhpCapableBackendInterface;
 use TYPO3\CMS\Core\Cache\Backend\SimpleFileBackend;
 use TYPO3\CMS\Core\Cache\Exception\InvalidDataException;
@@ -29,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class PhpFrontendTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setChecksIfTheIdentifierIsValid(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -45,9 +44,7 @@ final class PhpFrontendTest extends UnitTestCase
         $cache->set('foo', 'bar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPassesPhpSourceCodeTagsAndLifetimeToBackend(): void
     {
         $originalSourceCode = 'return "hello world!";';
@@ -58,9 +55,7 @@ final class PhpFrontendTest extends UnitTestCase
         $cache->set('Foo-Bar', $originalSourceCode, ['tags'], 1234);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setThrowsInvalidDataExceptionOnNonStringValues(): void
     {
         $this->expectException(InvalidDataException::class);
@@ -73,9 +68,7 @@ final class PhpFrontendTest extends UnitTestCase
         $cache->set('Foo-Bar', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function requireOnceCallsTheBackendsRequireOnceMethod(): void
     {
         $mockBackend = $this->createMock(PhpCapableBackendInterface::class);
@@ -85,9 +78,7 @@ final class PhpFrontendTest extends UnitTestCase
         self::assertSame('hello world!', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function requireCallsTheBackendsRequireMethod(): void
     {
         $mockBackend = $this->createMock(SimpleFileBackend::class);
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php
index 05cf05b02ef74765a51fe3383fef2142568a0bb7..3e3e59d8484296e74f68255427075526a2c03138 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Frontend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\AbstractBackend;
 use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class VariableFrontendTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setChecksIfTheIdentifierIsValid(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -39,9 +38,7 @@ final class VariableFrontendTest extends UnitTestCase
         $cache->set('foo', 'bar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPassesSerializedStringToBackend(): void
     {
         $theString = 'Just some value';
@@ -56,9 +53,7 @@ final class VariableFrontendTest extends UnitTestCase
         $cache->set('VariableCacheTest', $theString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPassesSerializedArrayToBackend(): void
     {
         $theArray = ['Just some value', 'and another one.'];
@@ -73,9 +68,7 @@ final class VariableFrontendTest extends UnitTestCase
         $cache->set('VariableCacheTest', $theArray);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPassesLifetimeToBackend(): void
     {
         $theString = 'Just some value';
@@ -91,9 +84,7 @@ final class VariableFrontendTest extends UnitTestCase
         $cache->set('VariableCacheTest', $theString, [], $theLifetime);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFetchesStringValueFromBackend(): void
     {
         $backend = $this->getMockBuilder(AbstractBackend::class)
@@ -107,9 +98,7 @@ final class VariableFrontendTest extends UnitTestCase
         self::assertEquals('Just some value', $cache->get('VariableCacheTest'), 'The returned value was not the expected string.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFetchesArrayValueFromBackend(): void
     {
         $theArray = ['Just some value', 'and another one.'];
@@ -124,9 +113,7 @@ final class VariableFrontendTest extends UnitTestCase
         self::assertEquals($theArray, $cache->get('VariableCacheTest'), 'The returned value was not the expected unserialized array.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFetchesFalseBooleanValueFromBackend(): void
     {
         $backend = $this->getMockBuilder(AbstractBackend::class)
@@ -140,9 +127,7 @@ final class VariableFrontendTest extends UnitTestCase
         self::assertFalse($cache->get('VariableCacheTest'), 'The returned value was not the FALSE.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasReturnsResultFromBackend(): void
     {
         $backend = $this->getMockBuilder(AbstractBackend::class)
@@ -156,9 +141,7 @@ final class VariableFrontendTest extends UnitTestCase
         self::assertTrue($cache->has('VariableCacheTest'), 'has() did not return TRUE.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeCallsBackend(): void
     {
         $cacheIdentifier = 'someCacheIdentifier';
diff --git a/typo3/sysext/core/Tests/Unit/Category/Collection/CategoryCollectionTest.php b/typo3/sysext/core/Tests/Unit/Category/Collection/CategoryCollectionTest.php
index 079e88c7296257fbff50356a368f0ac7410e8760..8f600f010e35f63393ebaf9fc256b78a67b85a9d 100644
--- a/typo3/sysext/core/Tests/Unit/Category/Collection/CategoryCollectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Category/Collection/CategoryCollectionTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Category\Collection;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Category\Collection\CategoryCollection;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CategoryCollectionTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function missingTableNameArgumentForObjectCategoryCollection(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Charset/CharsetConverterTest.php b/typo3/sysext/core/Tests/Unit/Charset/CharsetConverterTest.php
index ae8a795092b32eb38ab6002b34b695ccf19ab642..8817f789b10bec98ab502ac90c754cb453d2b207 100644
--- a/typo3/sysext/core/Tests/Unit/Charset/CharsetConverterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Charset/CharsetConverterTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Charset;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Charset\CharsetConverter;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CharsetConverterTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8DecodeACharacterToAscii(): void
     {
         $charsetConverter = new CharsetConverter();
@@ -42,9 +42,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertSame('ASCII', mb_detect_encoding($targetString, ['ASCII', 'UTF-8']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8DecodeACharacterToIso885915(): void
     {
         $charsetConverter = new CharsetConverter();
@@ -64,9 +62,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertNotSame($string, $targetString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8DecodeEuroSignCharacterToIso885915(): void
     {
         $charsetConverter = new CharsetConverter();
@@ -86,9 +82,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertNotSame($string, $targetString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8DecodeAKanjiToBig5(): void
     {
         $charsetConverter = new CharsetConverter();
@@ -108,9 +102,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertNotSame($string, $targetString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertingAUtf8EmojiSignToNonExistingAsciiRepresentationResultsInAQuestionMarkSign(): void
     {
         $charsetConverter = new CharsetConverter();
@@ -125,9 +117,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertSame('&#x1f602;', $charsetConverter->utf8_decode($string, 'ascii', true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8DecodeToUtf8ReturnsTheSameSign(): void
     {
         self::assertSame(
@@ -136,9 +126,7 @@ final class CharsetConverterTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8EncodeIso885915ACharacter(): void
     {
         $string = "\x41"; // A
@@ -151,9 +139,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertSame($string, $targetString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8EncodeIso885915EuroSign(): void
     {
         $string = "\xA4"; // € sign encoded as iso-8859-15
@@ -165,9 +151,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertNotSame($string, $targetString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8EncodeABig5EncodedSign(): void
     {
         $string = "\xA2\xC5"; // 〣 sign encoded as big5
@@ -180,9 +164,7 @@ final class CharsetConverterTest extends UnitTestCase
         self::assertNotSame($string, $targetString);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8EncodeAlreadyUtf8EncodedSign(): void
     {
         self::assertSame(
@@ -191,9 +173,7 @@ final class CharsetConverterTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function utf8ToNumberArray(): void
     {
         $string = "\xF0\x9F\x98\x82 &ndash; a joyful emoji";
@@ -241,10 +221,8 @@ final class CharsetConverterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validInputForSpecCharsToAscii
-     */
+    #[DataProvider('validInputForSpecCharsToAscii')]
+    #[Test]
     public function specCharsToAsciiConvertsUmlautsToAscii(
         string $input,
         string $expectedString
@@ -277,10 +255,10 @@ final class CharsetConverterTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider invalidInputForSpecCharsToAscii
      * @param mixed $input
      */
+    #[DataProvider('invalidInputForSpecCharsToAscii')]
+    #[Test]
     public function specCharsToAsciiConvertsInvalidInputToEmptyString($input): void
     {
         $subject = new CharsetConverter();
diff --git a/typo3/sysext/core/Tests/Unit/Command/Descriptor/TextDescriptorTest.php b/typo3/sysext/core/Tests/Unit/Command/Descriptor/TextDescriptorTest.php
index a3e32b8707260db589f3a5b3a239149f49276d45..3a41cb9babe477d31d01adda0e7ba4e6459dfbd8 100644
--- a/typo3/sysext/core/Tests/Unit/Command/Descriptor/TextDescriptorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Command/Descriptor/TextDescriptorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Command\Descriptor;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Console\Application;
 use Symfony\Component\Console\Output\OutputInterface;
 use TYPO3\CMS\Core\Command\Descriptor\TextDescriptor;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TextDescriptorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function ensureEmptyStringIsSetForDescriptionIfNoDescriptionForCommandIsGiven(): void
     {
         $commandRegistry = $this->createMock(CommandRegistry::class);
diff --git a/typo3/sysext/core/Tests/Unit/Command/SendEmailCommandTest.php b/typo3/sysext/core/Tests/Unit/Command/SendEmailCommandTest.php
index 37de735da4f138e9abefefaf0cfdedf5dc38700c..b7939eeec5da5a04a424ee844c9f225cb2aa8c43 100644
--- a/typo3/sysext/core/Tests/Unit/Command/SendEmailCommandTest.php
+++ b/typo3/sysext/core/Tests/Unit/Command/SendEmailCommandTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Command;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Console\Tester\CommandTester;
 use Symfony\Component\Mailer\Transport\TransportInterface;
 use TYPO3\CMS\Core\Command\SendEmailCommand;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SendEmailCommandTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function executeWillFlushTheQueue(): void
     {
         $delayedTransportMock = $this->createMock(DelayedTransportInterface::class);
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/CKEditor5MigratorTest.php b/typo3/sysext/core/Tests/Unit/Configuration/CKEditor5MigratorTest.php
index 105b39c07551443eadb7abb85baa0177012dbe8e..233f161debad8534c3e35e03445d6b4e595398f5 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/CKEditor5MigratorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/CKEditor5MigratorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Configuration\CKEditor5Migrator;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -1978,10 +1980,8 @@ final class CKEditor5MigratorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider migrationDataProvider
-     * @test
-     */
+    #[DataProvider('migrationDataProvider')]
+    #[Test]
     public function migrationTests(array $configuration, array $expectation): void
     {
         $finalConfiguration = GeneralUtility::makeInstance(
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/ConfigurationManagerTest.php b/typo3/sysext/core/Tests/Unit/Configuration/ConfigurationManagerTest.php
index 35d1a854e2126e899dcb8c5cc8d41c68d62393b7..1a5f4b724e806290c1ee8f37c04234aa41c39cfc 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/ConfigurationManagerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/ConfigurationManagerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
 use TYPO3\CMS\Core\Core\Environment;
@@ -58,9 +59,7 @@ final class ConfigurationManagerTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultConfigurationExecutesDefinedDefaultConfigurationFile(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -79,9 +78,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $this->subject->getDefaultConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSystemConfigurationExecutesDefinedConfigurationFile(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -99,9 +96,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $this->subject->getLocalConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updateLocalConfigurationWritesNewMergedLocalConfigurationArray(): void
     {
         $currentLocalConfiguration = [
@@ -134,9 +129,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $this->subject->updateLocalConfiguration($overrideConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultConfigurationValueByPathReturnsCorrectValue(): void
     {
         $this->createSubjectWithMockedMethods(
@@ -155,9 +148,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertSame('value', $this->subject->getDefaultConfigurationValueByPath('path'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLocalConfigurationValueByPathReturnsCorrectValue(): void
     {
         $this->createSubjectWithMockedMethods(
@@ -176,9 +167,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertSame('value', $this->subject->getLocalConfigurationValueByPath('path'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationValueByPathReturnsCorrectValue(): void
     {
         $this->createSubjectWithMockedMethods(
@@ -205,9 +194,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertSame('valueOverride', $this->subject->getConfigurationValueByPath('path'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid(): void
     {
         $this->createSubjectWithMockedMethods([
@@ -220,9 +207,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertFalse($this->subject->setLocalConfigurationValueByPath('path', 'value'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLocalConfigurationValueByPathUpdatesValueDefinedByPath(): void
     {
         $currentLocalConfiguration = [
@@ -254,9 +239,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $this->subject->setLocalConfigurationValueByPath('toUpdate', 'updated');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs(): void
     {
         $currentLocalConfiguration = [
@@ -293,9 +276,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $this->subject->setLocalConfigurationValuesByPathValuePairs($pairs);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeLocalConfigurationKeysByPathRemovesGivenPathsFromConfigurationAndReturnsTrue(): void
     {
         $currentLocalConfiguration = [
@@ -327,9 +308,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertTrue($this->subject->removeLocalConfigurationKeysByPath($removePaths));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeLocalConfigurationKeysByPathReturnsFalseIfNothingIsRemoved(): void
     {
         $currentLocalConfiguration = [
@@ -351,9 +330,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNothing));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeLocalConfigurationKeysByPathReturnsFalseIfSomethingInexistentIsRemoved(): void
     {
         $currentLocalConfiguration = [
@@ -375,9 +352,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNonExisting));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable(): void
     {
         $directory = StringUtility::getUniqueId('test_');
@@ -397,9 +372,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function writeLocalConfigurationWritesSortedContentToConfigurationFile(): void
     {
         $configurationFile = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('localConfiguration');
@@ -436,9 +409,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertSame($expectedContent, file_get_contents($configurationFile));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -452,9 +423,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $subject->createLocalConfigurationFromFactoryConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile(): void
     {
         $subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation']);
@@ -484,9 +453,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $subject->createLocalConfigurationFromFactoryConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile(): void
     {
         $subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation', 'getAdditionalFactoryConfigurationFileLocation']);
@@ -528,9 +495,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         $subject->createLocalConfigurationFromFactoryConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidLocalConfigurationPathAcceptsAllowedPath(): void
     {
         $subject = $this->getAccessibleMock(ConfigurationManager::class, null);
@@ -538,9 +503,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         self::assertTrue($subject->_call('isValidLocalConfigurationPath', 'foo/bar/baz'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidLocalConfigurationPathDeniesNotAllowedPath(): void
     {
         $subject = $this->getAccessibleMock(ConfigurationManager::class, null);
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php b/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php
index fbdb6c5ad8a4efce504015b0b268517f451e27c3..0445b319f3c04c001a142cdf2bfe0ec674392f80 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
 use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ExtensionConfigurationTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getWithEmptyPathReturnsEntireExtensionConfiguration(): void
     {
         $extConf = [
@@ -39,9 +38,7 @@ final class ExtensionConfigurationTest extends UnitTestCase
         self::assertSame((new ExtensionConfiguration())->get('someExtension'), $extConf);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getWithPathReturnsGivenValue(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = [
@@ -53,9 +50,7 @@ final class ExtensionConfigurationTest extends UnitTestCase
         self::assertSame((new ExtensionConfiguration())->get('someExtension', 'aFeature'), 'iAmEnabled');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getWithPathReturnsGivenPathSegment(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = [
@@ -67,9 +62,7 @@ final class ExtensionConfigurationTest extends UnitTestCase
         self::assertSame((new ExtensionConfiguration())->get('someExtension', 'aFlagCategory'), ['someFlag' => 'foo']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setThrowsExceptionWithEmptyExtension(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -77,9 +70,7 @@ final class ExtensionConfigurationTest extends UnitTestCase
         (new ExtensionConfiguration())->set('');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRemovesFullExtensionConfiguration(): void
     {
         $configurationManagerMock = $this->createMock(ConfigurationManager::class);
@@ -92,9 +83,7 @@ final class ExtensionConfigurationTest extends UnitTestCase
         self::assertFalse(isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['foo']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setWritesFullExtensionConfig(): void
     {
         $value = ['bar' => 'baz'];
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/FeaturesTest.php b/typo3/sysext/core/Tests/Unit/Configuration/FeaturesTest.php
index 0e3f62b16c538b44fc3bc644894ed1734d116959..c4c3629c26eb8c2707f4568e536a43179661883c 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/FeaturesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/FeaturesTest.php
@@ -17,23 +17,20 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Configuration\Features;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FeaturesTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function nonExistingFeatureReturnsFalse(): void
     {
         $features = new Features();
         self::assertFalse($features->isFeatureEnabled('nonExistingFeature'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfExistingDisabledFeatureIsDisabled(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['features']['nativeFunctionality'] = false;
@@ -41,9 +38,7 @@ final class FeaturesTest extends UnitTestCase
         self::assertFalse($features->isFeatureEnabled('nativeFunctionality'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfExistingEnabledFeatureIsEnabled(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['features']['nativeFunctionality'] = true;
@@ -51,9 +46,7 @@ final class FeaturesTest extends UnitTestCase
         self::assertTrue($features->isFeatureEnabled('nativeFunctionality'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfExistingEnabledFeatureIsDisabled(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['features']['nativeFunctionality'] = false;
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/FlexForm/FlexFormToolsTest.php b/typo3/sysext/core/Tests/Unit/Configuration/FlexForm/FlexFormToolsTest.php
index def39baa9bed2c126c533359c523629b203551f5..aa80dedb9447e0a37d13612dc946bf6f176f81d7 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/FlexForm/FlexFormToolsTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/FlexForm/FlexFormToolsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration\FlexForm;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Core\Tests\Unit\Fixtures\EventDispatcher\MockEventDispatcher;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FlexFormToolsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function traverseFlexFormXmlDataRecurseDoesNotFailOnNotExistingField(): void
     {
         $dataStruct = [
@@ -47,9 +46,7 @@ final class FlexFormToolsTest extends UnitTestCase
         $subject->traverseFlexFormXMLData_recurse($dataStruct, $editData, $pA);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function traverseFlexFormXmlDataRecurseDoesNotFailOnNotExistingArrayField(): void
     {
         $dataStruct = [
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/Loader/YamlFileLoaderTest.php b/typo3/sysext/core/Tests/Unit/Configuration/Loader/YamlFileLoaderTest.php
index 1db08de82cd6681f2465318328935d9379c56ba3..859cacf801ecf5f0460a62ab8db113e7fa0a4d19 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/Loader/YamlFileLoaderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/Loader/YamlFileLoaderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration\Loader;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Configuration\Loader\YamlFileLoader;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -85,10 +87,9 @@ final class YamlFileLoaderTest extends UnitTestCase
 
     /**
      * Method checking for env placeholders
-     *
-     * @dataProvider loadWithEnvVarDataProvider
-     * @test
      */
+    #[DataProvider('loadWithEnvVarDataProvider')]
+    #[Test]
     public function loadWithEnvVarPlaceholders(array $envs, string $yamlContent, array $expected): void
     {
         foreach ($envs as $env) {
@@ -110,9 +111,8 @@ final class YamlFileLoaderTest extends UnitTestCase
 
     /**
      * Method checking for env placeholders
-     *
-     * @test
      */
+    #[Test]
     public function loadWithEnvVarPlaceholdersDoesNotReplaceWithNonExistingValues(): void
     {
         $fileName = 'Berta.yml';
@@ -194,10 +194,8 @@ betterthanbefore: \'%env(mynonexistingenv)%\'
         ];
     }
 
-    /**
-     * @dataProvider isPlaceholderDataProvider
-     * @test
-     */
+    #[DataProvider('isPlaceholderDataProvider')]
+    #[Test]
     public function containsPlaceholderTest(mixed $placeholderValue, bool $expected): void
     {
         $subject = $this->getAccessibleMock(YamlFileLoader::class, null);
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/RichtextTest.php b/typo3/sysext/core/Tests/Unit/Configuration/RichtextTest.php
index c019fe1f3472111fa2e56ca8bea0263970d8aa10..3f1e7263025e59b6f91011c6f8b1e20fdae37a48 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/RichtextTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/RichtextTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Configuration\Richtext;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RichtextTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationUsesOverruleModeFromType(): void
     {
         $fieldConfig = [
@@ -76,9 +76,7 @@ final class RichtextTest extends UnitTestCase
         self::assertSame($expected, $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationUsesOverruleModeFromConfig(): void
     {
         $fieldConfig = [
@@ -126,9 +124,7 @@ final class RichtextTest extends UnitTestCase
         self::assertSame($expected, $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationSetsOverruleModeIfMissing(): void
     {
         $fieldConfig = [
@@ -164,9 +160,7 @@ final class RichtextTest extends UnitTestCase
         self::assertSame($expected, $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOverridesByDefault(): void
     {
         $fieldConfig = [
@@ -243,9 +237,7 @@ final class RichtextTest extends UnitTestCase
         self::assertSame($expected, $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOverridesByFieldSpecificConfig(): void
     {
         $fieldConfig = [
@@ -333,9 +325,7 @@ final class RichtextTest extends UnitTestCase
         self::assertSame($expected, $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOverridesByFieldAndTypeSpecificConfig(): void
     {
         $fieldConfig = [
@@ -437,9 +427,7 @@ final class RichtextTest extends UnitTestCase
         self::assertSame($expected, $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationPageTsOverridesPreset(): void
     {
         $pageId = 42;
@@ -817,10 +805,8 @@ final class RichtextTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider dataProviderGetConfigurationFindPresetInPageTsOverridesPreset
-     * @test
-     */
+    #[DataProvider('dataProviderGetConfigurationFindPresetInPageTsOverridesPreset')]
+    #[Test]
     public function getConfigurationFindPresetInPageTsOverridesPreset($fieldConfig, $pageTsConfig, $expected, $message): void
     {
         // Accessible mock to $subject since getRtePageTsConfigOfPid calls BackendUtility::getPagesTSconfig()
diff --git a/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php b/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php
index 1a894304f20acefd87f00b4e9fae5f54cc4618ca..eb00bcc3cd0b774b649b6d7fcc573b043eb1ca84 100644
--- a/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Configuration/SiteConfigurationTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Yaml\Yaml;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Configuration\Exception\SiteConfigurationWriteException;
@@ -56,17 +58,13 @@ final class SiteConfigurationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveAllExistingSitesReturnsEmptyArrayForNoSiteConfigsFound(): void
     {
         self::assertEmpty($this->siteConfiguration->resolveAllExistingSites());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveAllExistingSitesReadsConfiguration(): void
     {
         $configuration = [
@@ -83,9 +81,7 @@ final class SiteConfigurationTest extends UnitTestCase
         self::assertEquals(new Uri('https://example.com'), $currentSite->getBase());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function writeOnlyWritesModifiedKeys(): void
     {
         $identifier = 'testsite';
@@ -114,9 +110,7 @@ final class SiteConfigurationTest extends UnitTestCase
         self::assertFileEquals($expected, $siteConfig);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function writingOfNestedStructuresPreservesOrder(): void
     {
         $identifier = 'testsite';
@@ -169,10 +163,8 @@ final class SiteConfigurationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider writingPlaceholdersIsHandledDataProvider
-     */
+    #[DataProvider('writingPlaceholdersIsHandledDataProvider')]
+    #[Test]
     public function writingPlaceholdersIsHandled(array $changes, bool $expectedException): void
     {
         if ($expectedException) {
diff --git a/typo3/sysext/core/Tests/Unit/Console/CommandRegistryTest.php b/typo3/sysext/core/Tests/Unit/Console/CommandRegistryTest.php
index fe4180e2ed5a780cdf45b86d88038cfcb1a6f2a4..30357aaaf0023bc49938d42a25d8f0d0ee5f982a 100644
--- a/typo3/sysext/core/Tests/Unit/Console/CommandRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Console/CommandRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Console;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Container\ContainerInterface;
 use Symfony\Component\Console\Command\Command;
@@ -35,18 +36,14 @@ final class CommandRegistryTest extends UnitTestCase
         $this->containerMock = $this->createMock(ContainerInterface::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsCommandLoaderInterface(): void
     {
         $commandRegistry = new CommandRegistry($this->containerMock);
         self::assertInstanceof(CommandLoaderInterface::class, $commandRegistry);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function iteratesLazyCommandsOfActivePackages(): void
     {
         $command1Mock = $this->createMock(Command::class);
diff --git a/typo3/sysext/core/Tests/Unit/Context/ContextTest.php b/typo3/sysext/core/Tests/Unit/Context/ContextTest.php
index 3f1043fb54fb94654771a552cada03e964bd8cc5..d96f63ca38727fce11aca3a66f8f57890f5bcf5e 100644
--- a/typo3/sysext/core/Tests/Unit/Context/ContextTest.php
+++ b/typo3/sysext/core/Tests/Unit/Context/ContextTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Context;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Context\Exception\AspectNotFoundException;
 use TYPO3\CMS\Core\Context\UserAspect;
@@ -42,10 +44,8 @@ final class ContextTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validAspectKeysDataProvider
-     */
+    #[DataProvider('validAspectKeysDataProvider')]
+    #[Test]
     public function hasAspectReturnsTrueOnExistingAspect(string $aspectName): void
     {
         $subject = new Context([
@@ -67,10 +67,8 @@ final class ContextTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidAspectKeysDataProvider
-     */
+    #[DataProvider('invalidAspectKeysDataProvider')]
+    #[Test]
     public function hasAspectReturnsFalseOnNonExistingAspect(string $aspectName): void
     {
         $subject = new Context([
@@ -80,9 +78,7 @@ final class ContextTest extends UnitTestCase
         self::assertFalse($subject->hasAspect($aspectName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorAddsValidAspect(): void
     {
         $subject = new Context([
@@ -93,9 +89,7 @@ final class ContextTest extends UnitTestCase
         self::assertFalse($subject->hasAspect('uncoolio'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAspectThrowsExceptionOnInvalidAspect(): void
     {
         $aspect = new UserAspect();
@@ -108,9 +102,7 @@ final class ContextTest extends UnitTestCase
         $subject->getAspect('uncoolio');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAspectReturnsValidAspect(): void
     {
         $aspect = new UserAspect();
@@ -121,9 +113,7 @@ final class ContextTest extends UnitTestCase
         self::assertSame($aspect, $subject->getAspect('coolio'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidAspectFromgetPropertyFromAspectThrowsException(): void
     {
         $aspect = new UserAspect();
@@ -136,9 +126,7 @@ final class ContextTest extends UnitTestCase
         $subject->getPropertyFromAspect('uncoolio', 'does not matter');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidPropertyFromgetPropertyFromAspectReturnsDefault(): void
     {
         $defaultValue = 'default value';
@@ -151,9 +139,7 @@ final class ContextTest extends UnitTestCase
         self::assertEquals($defaultValue, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validPropertyFromgetPropertyFromAspectReturnsValue(): void
     {
         $aspect = new WorkspaceAspect(13);
@@ -165,9 +151,7 @@ final class ContextTest extends UnitTestCase
         self::assertEquals(13, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAspectSetsAnAspectAndCanReturnIt(): void
     {
         $aspect = new UserAspect();
@@ -177,9 +161,7 @@ final class ContextTest extends UnitTestCase
         self::assertSame($aspect, $subject->getAspect('coolio'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAspectOverridesAnExisting(): void
     {
         $initialAspect = new UserAspect();
diff --git a/typo3/sysext/core/Tests/Unit/Context/DateTimeAspectTest.php b/typo3/sysext/core/Tests/Unit/Context/DateTimeAspectTest.php
index 4fdd1e421640e5512835fef4b7a104c1362a531e..c1ab6821ad3fd8e14c57a3c3cca661706171c534 100644
--- a/typo3/sysext/core/Tests/Unit/Context/DateTimeAspectTest.php
+++ b/typo3/sysext/core/Tests/Unit/Context/DateTimeAspectTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Context;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\DateTimeAspect;
 use TYPO3\CMS\Core\Context\Exception\AspectPropertyNotFoundException;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DateTimeAspectTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getDateTimeReturnsSameObject(): void
     {
         $dateObject = new \DateTimeImmutable('2018-07-15', new \DateTimeZone('Europe/Moscow'));
@@ -34,9 +34,7 @@ final class DateTimeAspectTest extends UnitTestCase
         self::assertSame($dateObject, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionOnInvalidArgument(): void
     {
         $this->expectException(AspectPropertyNotFoundException::class);
@@ -46,9 +44,7 @@ final class DateTimeAspectTest extends UnitTestCase
         $subject->get('football');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTimestampReturnsInteger(): void
     {
         $dateObject = new \DateTimeImmutable('2018-07-15', new \DateTimeZone('Europe/Moscow'));
@@ -84,11 +80,11 @@ final class DateTimeAspectTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider dateFormatValuesDataProvider
      * @param string $key
      * @param string $expectedResult
      */
+    #[DataProvider('dateFormatValuesDataProvider')]
+    #[Test]
     public function getReturnsValidInformationFromProperty($key, $expectedResult): void
     {
         $dateObject = new \DateTimeImmutable('2018-07-15T13:00:05', new \DateTimeZone('Europe/Moscow'));
diff --git a/typo3/sysext/core/Tests/Unit/Context/SecurityAspectTest.php b/typo3/sysext/core/Tests/Unit/Context/SecurityAspectTest.php
index 5b597ea298f0f712a729da991e7cbc644ad601bf..ab8035405a995278acefff9c2b03630526356392 100644
--- a/typo3/sysext/core/Tests/Unit/Context/SecurityAspectTest.php
+++ b/typo3/sysext/core/Tests/Unit/Context/SecurityAspectTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Context;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\SecurityAspect;
 use TYPO3\CMS\Core\Security\NoncePool;
 use TYPO3\CMS\Core\Security\RequestToken;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SecurityAspectTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function receivedRequestTokenIsFunctional(): void
     {
         $aspect = new SecurityAspect();
@@ -40,18 +39,14 @@ final class SecurityAspectTest extends UnitTestCase
         self::assertNull($aspect->getReceivedRequestToken());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function signingSecretResolverIsFunctional(): void
     {
         $aspect = new SecurityAspect();
         self::assertInstanceOf(NoncePool::class, $aspect->getSigningSecretResolver()->findByType('nonce'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function noncePoolIsFunctional(): void
     {
         $aspect = new SecurityAspect();
diff --git a/typo3/sysext/core/Tests/Unit/Context/UserAspectTest.php b/typo3/sysext/core/Tests/Unit/Context/UserAspectTest.php
index 7b1c61d8f6df32538e041a422a593de4aafec216..91dd1882c279878be39bc90bb990f3030c995011 100644
--- a/typo3/sysext/core/Tests/Unit/Context/UserAspectTest.php
+++ b/typo3/sysext/core/Tests/Unit/Context/UserAspectTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Context;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Context\Exception\AspectPropertyNotFoundException;
 use TYPO3\CMS\Core\Context\UserAspect;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class UserAspectTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsProperDefaultValues(): void
     {
         $subject = new UserAspect(null, null);
@@ -38,9 +38,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertEquals([], $subject->get('groupNames'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function alternativeGroupsAreAlwaysReturned(): void
     {
         $subject = new UserAspect(null, []);
@@ -49,9 +47,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertEquals([567], $subject->get('groupIds'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsValidUserId(): void
     {
         $user = new FrontendUserAuthentication();
@@ -62,9 +58,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertEquals(13, $subject->get('id'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsValidUsername(): void
     {
         $user = new FrontendUserAuthentication();
@@ -76,9 +70,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertEquals('Teddy', $subject->get('username'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isLoggedInReturnsTrueOnFrontendUserWithoutUserGroup(): void
     {
         $user = new FrontendUserAuthentication();
@@ -89,9 +81,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertTrue($subject->isLoggedIn());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isLoggedInReturnsTrueOnFrontendUserWithUserGroup(): void
     {
         $user = new FrontendUserAuthentication();
@@ -103,9 +93,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertTrue($subject->isLoggedIn());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isLoggedInReturnsTrueOnBackendUserWithId(): void
     {
         $user = new BackendUserAuthentication();
@@ -116,9 +104,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertTrue($subject->isLoggedIn());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getGroupIdsReturnsFrontendUserGroups(): void
     {
         $user = new FrontendUserAuthentication();
@@ -130,9 +116,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertEquals([0, -2, 23, 54], $subject->getGroupIds());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getGroupIdsReturnsOverriddenGroups(): void
     {
         $user = new FrontendUserAuthentication();
@@ -190,10 +174,8 @@ final class UserAspectTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isUserOrGroupSetDataProvider
-     */
+    #[DataProvider('isUserOrGroupSetDataProvider')]
+    #[Test]
     public function isUserOrGroupSetChecksForValidUser(int $userId, ?array $userGroups, ?array $overriddenGroups, bool $expectedResult): void
     {
         $user = new FrontendUserAuthentication();
@@ -207,9 +189,7 @@ final class UserAspectTest extends UnitTestCase
         self::assertEquals($expectedResult, $subject->isUserOrGroupSet());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionOnInvalidArgument(): void
     {
         $this->expectException(AspectPropertyNotFoundException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Context/VisibilityAspectTest.php b/typo3/sysext/core/Tests/Unit/Context/VisibilityAspectTest.php
index d9b15c4fefdca7963ffe0467b3ad894d3498c772..4a71962154c66496964cfc08db8846f583c4cb27 100644
--- a/typo3/sysext/core/Tests/Unit/Context/VisibilityAspectTest.php
+++ b/typo3/sysext/core/Tests/Unit/Context/VisibilityAspectTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Context;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\Exception\AspectPropertyNotFoundException;
 use TYPO3\CMS\Core\Context\VisibilityAspect;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class VisibilityAspectTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsProperDefaultValues(): void
     {
         $subject = new VisibilityAspect();
@@ -35,9 +34,7 @@ final class VisibilityAspectTest extends UnitTestCase
         self::assertFalse($subject->includeScheduledRecords());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsProperValues(): void
     {
         $subject = new VisibilityAspect(true, true, true, true);
@@ -47,9 +44,7 @@ final class VisibilityAspectTest extends UnitTestCase
         self::assertTrue($subject->includeScheduledRecords());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReturnsProperValues(): void
     {
         $subject = new VisibilityAspect(true, true, true, true);
@@ -59,9 +54,7 @@ final class VisibilityAspectTest extends UnitTestCase
         self::assertTrue($subject->get('includeScheduledRecords'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionOnInvalidArgument(): void
     {
         $this->expectException(AspectPropertyNotFoundException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Context/WorkspaceAspectTest.php b/typo3/sysext/core/Tests/Unit/Context/WorkspaceAspectTest.php
index 59e8708dc2b406b300b6ce3daf116e3d8b790f60..ec3a972a44593c1cfbbf59da04cf885c9dd32781 100644
--- a/typo3/sysext/core/Tests/Unit/Context/WorkspaceAspectTest.php
+++ b/typo3/sysext/core/Tests/Unit/Context/WorkspaceAspectTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Context;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\Exception\AspectPropertyNotFoundException;
 use TYPO3\CMS\Core\Context\WorkspaceAspect;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class WorkspaceAspectTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsProperDefaultValues(): void
     {
         $subject = new WorkspaceAspect();
@@ -36,9 +35,7 @@ final class WorkspaceAspectTest extends UnitTestCase
         self::assertFalse($subject->get('isOffline'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsProperCustomValues(): void
     {
         $subject = new WorkspaceAspect(13);
@@ -49,9 +46,7 @@ final class WorkspaceAspectTest extends UnitTestCase
         self::assertTrue($subject->get('isOffline'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionOnInvalidArgument(): void
     {
         $this->expectException(AspectPropertyNotFoundException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Core/ApplicationContextTest.php b/typo3/sysext/core/Tests/Unit/Core/ApplicationContextTest.php
index d4a2cca9624e38358cf509ce0cfccd96f5ea1ca6..6f0d96e6f19a26370ce6b41c1e8b5f7ec0bf2556 100644
--- a/typo3/sysext/core/Tests/Unit/Core/ApplicationContextTest.php
+++ b/typo3/sysext/core/Tests/Unit/Core/ApplicationContextTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Core;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\ApplicationContext;
 use TYPO3\CMS\Core\Exception;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -42,10 +44,8 @@ final class ApplicationContextTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider allowedContexts
-     */
+    #[DataProvider('allowedContexts')]
+    #[Test]
     public function contextStringCanBeSetInConstructorAndReadByCallingToString($allowedContext): void
     {
         $context = new ApplicationContext($allowedContext);
@@ -65,10 +65,8 @@ final class ApplicationContextTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider forbiddenContexts
-     */
+    #[DataProvider('forbiddenContexts')]
+    #[Test]
     public function constructorThrowsExceptionIfMainContextIsForbidden($forbiddenContext): void
     {
         $this->expectException(Exception::class);
@@ -130,10 +128,8 @@ final class ApplicationContextTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isMethods
-     */
+    #[DataProvider('isMethods')]
+    #[Test]
     public function contextMethodsReturnTheCorrectValues($contextName, $isDevelopment, $isProduction, $isTesting, $parentContext): void
     {
         $context = new ApplicationContext($contextName);
@@ -143,9 +139,7 @@ final class ApplicationContextTest extends UnitTestCase
         self::assertSame((string)$parentContext, (string)$context->getParent());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parentContextIsConnectedRecursively(): void
     {
         $context = new ApplicationContext('Production/Foo/Bar');
diff --git a/typo3/sysext/core/Tests/Unit/Core/ClassLoadingInformationGeneratorTest.php b/typo3/sysext/core/Tests/Unit/Core/ClassLoadingInformationGeneratorTest.php
index 65309e9c0b5740fb9996849c9d6451874bdbedbf..8eb0c0b663f66c15795913d02023d8b9dba201ac 100644
--- a/typo3/sysext/core/Tests/Unit/Core/ClassLoadingInformationGeneratorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Core/ClassLoadingInformationGeneratorTest.php
@@ -18,6 +18,8 @@ declare(strict_types=1);
 namespace TYPO3\CMS\Core\Tests\Unit\Core;
 
 use Composer\Autoload\ClassLoader;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\ClassLoadingInformationGenerator;
 use TYPO3\CMS\Core\Error\Exception;
 use TYPO3\CMS\Core\Package\PackageInterface;
@@ -27,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ClassLoadingInformationGeneratorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildClassAliasMapForPackageThrowsExceptionForWrongComposerManifestInformation(): void
     {
         $this->expectException(Exception::class);
@@ -50,9 +50,7 @@ final class ClassLoadingInformationGeneratorTest extends UnitTestCase
         $generator->buildClassAliasMapForPackage($packageMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildClassAliasMapForPackageThrowsExceptionForWrongClassAliasMapFile(): void
     {
         $this->expectException(Exception::class);
@@ -72,9 +70,7 @@ final class ClassLoadingInformationGeneratorTest extends UnitTestCase
         $generator->buildClassAliasMapForPackage($packageMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildClassAliasMapForPackageReturnsClassAliasMapForClassAliasMapFile(): void
     {
         $expectedClassMap = [
@@ -97,9 +93,7 @@ final class ClassLoadingInformationGeneratorTest extends UnitTestCase
         self::assertEquals($expectedClassMap, $generator->buildClassAliasMapForPackage($packageMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildClassAliasMapForPackageReturnsClassAliasMapForComposerManifestInformation(): void
     {
         $expectedClassMap = [
@@ -247,10 +241,8 @@ final class ClassLoadingInformationGeneratorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider autoloadFilesAreBuildCorrectlyDataProvider
-     */
+    #[DataProvider('autoloadFilesAreBuildCorrectlyDataProvider')]
+    #[Test]
     public function autoloadFilesAreBuildCorrectly(array $packageManifest, array $expectedPsr4Files, array $expectedClassMapFiles): void
     {
         $classLoaderMock = $this->createMock(ClassLoader::class);
@@ -347,10 +339,8 @@ final class ClassLoadingInformationGeneratorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider autoloadDevFilesAreBuildCorrectlyDataProvider
-     */
+    #[DataProvider('autoloadDevFilesAreBuildCorrectlyDataProvider')]
+    #[Test]
     public function autoloadDevFilesAreBuildCorrectly(array $packageManifest, array $expectedPsr4Files, array $expectedClassMapFiles): void
     {
         $classLoaderMock = $this->createMock(ClassLoader::class);
diff --git a/typo3/sysext/core/Tests/Unit/Core/SystemEnvironmentBuilderTest.php b/typo3/sysext/core/Tests/Unit/Core/SystemEnvironmentBuilderTest.php
index 37aba07af820153d1625363ea20343e0459e37b1..2c708088a794dd43812bd6e00cc12d4f031a5f53 100644
--- a/typo3/sysext/core/Tests/Unit/Core/SystemEnvironmentBuilderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Core/SystemEnvironmentBuilderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Core;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder;
 use TYPO3\CMS\Core\Utility\StringUtility;
@@ -36,9 +38,7 @@ final class SystemEnvironmentBuilderTest extends UnitTestCase
         $this->subject = $this->getAccessibleMock(SystemEnvironmentBuilder::class, null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathThisScriptCliReadsLocalPartFromArgv(): void
     {
         $fakedLocalPart = StringUtility::getUniqueId('Test');
@@ -46,9 +46,7 @@ final class SystemEnvironmentBuilderTest extends UnitTestCase
         self::assertStringEndsWith($fakedLocalPart, $this->subject->_call('getPathThisScriptCli'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathThisScriptCliReadsLocalPartFromEnv(): void
     {
         $fakedLocalPart = StringUtility::getUniqueId('Test');
@@ -57,9 +55,7 @@ final class SystemEnvironmentBuilderTest extends UnitTestCase
         self::assertStringEndsWith($fakedLocalPart, $this->subject->_call('getPathThisScriptCli'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathThisScriptCliReadsLocalPartFromServer(): void
     {
         $fakedLocalPart = StringUtility::getUniqueId('Test');
@@ -69,9 +65,7 @@ final class SystemEnvironmentBuilderTest extends UnitTestCase
         self::assertStringEndsWith($fakedLocalPart, $this->subject->_call('getPathThisScriptCli'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathThisScriptCliAddsCurrentWorkingDirectoryFromServerEnvironmentToLocalPathOnUnix(): void
     {
         $GLOBALS['_SERVER']['argv'][0] = 'foo';
@@ -80,9 +74,7 @@ final class SystemEnvironmentBuilderTest extends UnitTestCase
         self::assertStringStartsWith($fakedAbsolutePart, $this->subject->_call('getPathThisScriptCli'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeGlobalVariablesSetsGlobalT3ServicesArray(): void
     {
         unset($GLOBALS['T3_SERVICES']);
@@ -104,10 +96,10 @@ final class SystemEnvironmentBuilderTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider initializeGlobalTimeTrackingVariablesSetsGlobalVariablesDataProvider
      * @param string $variable Variable to check for in $GLOBALS
      */
+    #[DataProvider('initializeGlobalTimeTrackingVariablesSetsGlobalVariablesDataProvider')]
+    #[Test]
     public function initializeGlobalTimeTrackingVariablesSetsGlobalVariables($variable): void
     {
         unset($GLOBALS[$variable]);
@@ -115,18 +107,14 @@ final class SystemEnvironmentBuilderTest extends UnitTestCase
         self::assertTrue(isset($GLOBALS[$variable]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeGlobalTimeTrackingVariablesRoundsAccessTimeToSixtySeconds(): void
     {
         $this->subject->_call('initializeGlobalTimeTrackingVariables');
         self::assertEquals(0, $GLOBALS['ACCESS_TIME'] % 60);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeGlobalTimeTrackingVariablesRoundsSimAccessTimeToSixtySeconds(): void
     {
         $this->subject->_call('initializeGlobalTimeTrackingVariables');
diff --git a/typo3/sysext/core/Tests/Unit/Country/CountryProviderTest.php b/typo3/sysext/core/Tests/Unit/Country/CountryProviderTest.php
index dd52f7a9223003bb4d40f6739d90c5a2b9b9417b..e25a707ee6f6b1fdcca0f9545bde9262515cedd9 100644
--- a/typo3/sysext/core/Tests/Unit/Country/CountryProviderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Country/CountryProviderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Country;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Country\Country;
 use TYPO3\CMS\Core\Country\CountryFilter;
 use TYPO3\CMS\Core\Country\CountryProvider;
@@ -24,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CountryProviderTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function findAllCountriesReturnsCountryObjects(): void
     {
         $subject = new CountryProvider();
@@ -34,9 +34,7 @@ final class CountryProviderTest extends UnitTestCase
         self::assertGreaterThan(150, count($countries));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findByIsoCodeReturnsValidObject(): void
     {
         $subject = new CountryProvider();
@@ -48,9 +46,7 @@ final class CountryProviderTest extends UnitTestCase
         self::assertEquals('French Republic', $countryIsoCode2->getOfficialName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findByThreeLetterIsoCodeReturnsValidObject(): void
     {
         $subject = new CountryProvider();
@@ -68,10 +64,8 @@ final class CountryProviderTest extends UnitTestCase
         self::assertEquals('FRA', $countryIsoCode3->getAlpha3IsoCode());
     }
 
-    /**
-     * @test
-     * @dataProvider findByFilterReturnsValidObjectDataProvider
-     */
+    #[DataProvider('findByFilterReturnsValidObjectDataProvider')]
+    #[Test]
     public function findByFilterReturnsValidObject(int $expectedCount, array $excludedCountries, array $includedCountries): void
     {
         $subject = new CountryProvider();
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2iPasswordHashTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2iPasswordHashTest.php
index 8d31795cc026bb4f88236841e1a48d7cb65d6b14..d1a227669129db8ffbbfab741848d52a3dbc03fb 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2iPasswordHashTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2iPasswordHashTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\Argon2iPasswordHash;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -38,9 +39,7 @@ final class Argon2iPasswordHashTest extends UnitTestCase
         $this->subject = new Argon2iPasswordHash($options);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfMemoryCostIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -48,9 +47,7 @@ final class Argon2iPasswordHashTest extends UnitTestCase
         new Argon2iPasswordHash(['memory_cost' => 1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfTimeCostIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -58,17 +55,13 @@ final class Argon2iPasswordHashTest extends UnitTestCase
         new Argon2iPasswordHash(['time_cost' => 1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNullOnEmptyPassword(): void
     {
         self::assertNull($this->subject->getHashedPassword(''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsString(): void
     {
         $hash = $this->subject->getHashedPassword('password');
@@ -76,9 +69,7 @@ final class Argon2iPasswordHashTest extends UnitTestCase
         self::assertIsString($hash);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidSaltedPwValidatesHastCreatedByGetHashedPassword(): void
     {
         $hash = $this->subject->getHashedPassword('password');
@@ -87,9 +78,8 @@ final class Argon2iPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with alphabet characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidAlphaCharClassPassword(): void
     {
         $password = 'aEjOtY';
@@ -99,9 +89,8 @@ final class Argon2iPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with numeric characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidNumericCharClassPassword(): void
     {
         $password = '01369';
@@ -111,9 +100,8 @@ final class Argon2iPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with US-ASCII special characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidAsciiSpecialCharClassPassword(): void
     {
         $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
@@ -123,9 +111,8 @@ final class Argon2iPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with latin1 special characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidLatin1SpecialCharClassPassword(): void
     {
         $password = '';
@@ -139,9 +126,8 @@ final class Argon2iPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with latin1 umlauts.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidLatin1UmlautCharClassPassword(): void
     {
         $password = '';
@@ -156,9 +142,7 @@ final class Argon2iPasswordHashTest extends UnitTestCase
         self::assertTrue($this->subject->checkPassword($password, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithNonValidPassword(): void
     {
         $password = 'password';
@@ -167,9 +151,7 @@ final class Argon2iPasswordHashTest extends UnitTestCase
         self::assertFalse($this->subject->checkPassword($password1, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalseForJustGeneratedHash(): void
     {
         $password = 'password';
@@ -177,9 +159,7 @@ final class Argon2iPasswordHashTest extends UnitTestCase
         self::assertFalse($this->subject->isHashUpdateNeeded($hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions(): void
     {
         $originalOptions = [
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2idPasswordHashTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2idPasswordHashTest.php
index 576f6d7c4e40be2e0e1aafd58395a1e8f7a8fb55..4d4bf93bdaa54c822ee14ac28dc46bb0c998c32d 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2idPasswordHashTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Argon2idPasswordHashTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\Argon2idPasswordHash;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -35,9 +36,7 @@ final class Argon2idPasswordHashTest extends UnitTestCase
         $this->subject = new Argon2idPasswordHash($options);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfMemoryCostIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -45,9 +44,7 @@ final class Argon2idPasswordHashTest extends UnitTestCase
         new Argon2idPasswordHash(['memory_cost' => 1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfTimeCostIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -55,17 +52,13 @@ final class Argon2idPasswordHashTest extends UnitTestCase
         new Argon2idPasswordHash(['time_cost' => 1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNullOnEmptyPassword(): void
     {
         self::assertNull($this->subject->getHashedPassword(''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsString(): void
     {
         $hash = $this->subject->getHashedPassword('password');
@@ -73,9 +66,7 @@ final class Argon2idPasswordHashTest extends UnitTestCase
         self::assertIsString($hash);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidSaltedPwValidatesHastCreatedByGetHashedPassword(): void
     {
         $hash = $this->subject->getHashedPassword('password');
@@ -84,9 +75,8 @@ final class Argon2idPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with alphabet characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidAlphaCharClassPassword(): void
     {
         $password = 'aEjOtY';
@@ -96,9 +86,8 @@ final class Argon2idPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with numeric characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidNumericCharClassPassword(): void
     {
         $password = '01369';
@@ -108,9 +97,8 @@ final class Argon2idPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with US-ASCII special characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidAsciiSpecialCharClassPassword(): void
     {
         $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
@@ -120,9 +108,8 @@ final class Argon2idPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with latin1 special characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidLatin1SpecialCharClassPassword(): void
     {
         $password = '';
@@ -136,9 +123,8 @@ final class Argon2idPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with latin1 umlauts.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidLatin1UmlautCharClassPassword(): void
     {
         $password = '';
@@ -153,9 +139,7 @@ final class Argon2idPasswordHashTest extends UnitTestCase
         self::assertTrue($this->subject->checkPassword($password, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithNonValidPassword(): void
     {
         $password = 'password';
@@ -164,9 +148,7 @@ final class Argon2idPasswordHashTest extends UnitTestCase
         self::assertFalse($this->subject->checkPassword($password1, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalseForJustGeneratedHash(): void
     {
         $password = 'password';
@@ -174,9 +156,7 @@ final class Argon2idPasswordHashTest extends UnitTestCase
         self::assertFalse($this->subject->isHashUpdateNeeded($hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions(): void
     {
         $originalOptions = [
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BcryptPasswordHashTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BcryptPasswordHashTest.php
index 31121de3f7a47e08988b2c910ea4146fb111ff56..dc922b789e38c7646370b5f6ee0c5501e48d5b6c 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BcryptPasswordHashTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BcryptPasswordHashTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\BcryptPasswordHash;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -37,9 +38,7 @@ final class BcryptPasswordHashTest extends UnitTestCase
         $this->subject = new BcryptPasswordHash($options);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfMemoryCostIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -47,9 +46,7 @@ final class BcryptPasswordHashTest extends UnitTestCase
         new BcryptPasswordHash(['cost' => 9]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfMemoryCostIsTooHigh(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -57,17 +54,13 @@ final class BcryptPasswordHashTest extends UnitTestCase
         new BcryptPasswordHash(['cost' => 32]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNullOnEmptyPassword(): void
     {
         self::assertNull($this->subject->getHashedPassword(''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsString(): void
     {
         $hash = $this->subject->getHashedPassword('password');
@@ -75,9 +68,7 @@ final class BcryptPasswordHashTest extends UnitTestCase
         self::assertIsString($hash);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidSaltedPwValidatesHastCreatedByGetHashedPassword(): void
     {
         $hash = $this->subject->getHashedPassword('password');
@@ -86,9 +77,8 @@ final class BcryptPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with alphabet characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidAlphaCharClassPassword(): void
     {
         $password = 'aEjOtY';
@@ -98,9 +88,8 @@ final class BcryptPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with numeric characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidNumericCharClassPassword(): void
     {
         $password = '01369';
@@ -110,9 +99,8 @@ final class BcryptPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with US-ASCII special characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidAsciiSpecialCharClassPassword(): void
     {
         $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
@@ -122,9 +110,8 @@ final class BcryptPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with latin1 special characters.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidLatin1SpecialCharClassPassword(): void
     {
         $password = '';
@@ -138,9 +125,8 @@ final class BcryptPasswordHashTest extends UnitTestCase
 
     /**
      * Tests authentication procedure with latin1 umlauts.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithValidLatin1UmlautCharClassPassword(): void
     {
         $password = '';
@@ -155,9 +141,7 @@ final class BcryptPasswordHashTest extends UnitTestCase
         self::assertTrue($this->subject->checkPassword($password, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordReturnsTrueForHashedPasswordWithNonValidPassword(): void
     {
         $password = 'password';
@@ -166,18 +150,14 @@ final class BcryptPasswordHashTest extends UnitTestCase
         self::assertFalse($this->subject->checkPassword($password1, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalseForJustGeneratedHash(): void
     {
         $hash = $this->subject->getHashedPassword('password');
         self::assertFalse($this->subject->isHashUpdateNeeded($hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions(): void
     {
         $subject = new BcryptPasswordHash(['cost' => 10]);
@@ -188,9 +168,8 @@ final class BcryptPasswordHashTest extends UnitTestCase
 
     /**
      * Bcrypt truncates on NUL characters by default
-     *
-     * @test
      */
+    #[Test]
     public function getHashedPasswordDoesNotTruncateOnNul(): void
     {
         $password1 = 'pass' . "\x00" . 'word';
@@ -201,9 +180,8 @@ final class BcryptPasswordHashTest extends UnitTestCase
 
     /**
      * Bcrypt truncates after 72 characters by default
-     *
-     * @test
      */
+    #[Test]
     public function getHashedPasswordDoesNotTruncateAfter72Chars(): void
     {
         $prefix = str_repeat('a', 72);
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BlowfishPasswordHashTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BlowfishPasswordHashTest.php
index c12fbf7f1f625baf5552dd8157d73da70257381e..ec312953c07b9dee660030293d868b7f5b9bf2fe 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BlowfishPasswordHashTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/BlowfishPasswordHashTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\BlowfishPasswordHash;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class BlowfishPasswordHashTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfHashCountIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -32,9 +31,7 @@ final class BlowfishPasswordHashTest extends UnitTestCase
         new BlowfishPasswordHash(['hash_count' => 3]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfHashCountIsTooHigh(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -42,27 +39,21 @@ final class BlowfishPasswordHashTest extends UnitTestCase
         new BlowfishPasswordHash(['hash_count' => 18]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordWithEmptyPasswordResultsInNullSaltedPassword(): void
     {
         $password = '';
         self::assertNull((new BlowfishPasswordHash(['hash_count' => 4]))->getHashedPassword($password));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordWithNonEmptyPasswordResultsInNonNullSaltedPassword(): void
     {
         $password = 'a';
         self::assertNotNull((new BlowfishPasswordHash(['hash_count' => 4]))->getHashedPassword($password));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordValidates(): void
     {
         $password = 'password';
@@ -76,9 +67,8 @@ final class BlowfishPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same fixed salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPasswordAndFixedHash(): void
     {
         $password = 'password';
@@ -88,9 +78,8 @@ final class BlowfishPasswordHashTest extends UnitTestCase
 
     /**
      * Tests that authentication procedure fails with broken hash to compare to
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsFalseFailsWithBrokenHash(): void
     {
         $password = 'password';
@@ -103,9 +92,8 @@ final class BlowfishPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPassword(): void
     {
         $password = 'aEjOtY';
@@ -119,9 +107,8 @@ final class BlowfishPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidNumericCharClassPassword(): void
     {
         $password = '01369';
@@ -135,9 +122,8 @@ final class BlowfishPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAsciiSpecialCharClassPassword(): void
     {
         $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
@@ -151,9 +137,8 @@ final class BlowfishPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidLatin1SpecialCharClassPassword(): void
     {
         $password = '';
@@ -171,9 +156,8 @@ final class BlowfishPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsReturnsTrueWithValidLatin1UmlautCharClassPassword(): void
     {
         $password = '';
@@ -191,9 +175,7 @@ final class BlowfishPasswordHashTest extends UnitTestCase
         self::assertTrue($subject->checkPassword($password, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordReturnsFalseWithNonValidPassword(): void
     {
         $password = 'password';
@@ -203,9 +185,7 @@ final class BlowfishPasswordHashTest extends UnitTestCase
         self::assertFalse($subject->checkPassword($password1, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalseForValidSaltedPassword(): void
     {
         $password = 'password';
@@ -214,9 +194,7 @@ final class BlowfishPasswordHashTest extends UnitTestCase
         self::assertFalse($subject->isHashUpdateNeeded($saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsTrueForHashGeneratedWithOldOptions(): void
     {
         $subject = new BlowfishPasswordHash(['hash_count' => 4]);
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Md5PasswordHashTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Md5PasswordHashTest.php
index 74acbfece14d272339d798d8122586edd2492e01..a67ffff8596f434115564c116d09fb4159610775 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Md5PasswordHashTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Md5PasswordHashTest.php
@@ -17,30 +17,25 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\Md5PasswordHash;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class Md5PasswordHashTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNullWithEmptyPassword(): void
     {
         self::assertNull((new Md5PasswordHash())->getHashedPassword(''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNotNullWithNonEmptyPassword(): void
     {
         self::assertNotNull((new Md5PasswordHash())->getHashedPassword('a'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordCreatesAHashThatValidates(): void
     {
         $password = 'password';
@@ -54,9 +49,8 @@ final class Md5PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same fixed salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPasswordAndFixedHash(): void
     {
         $password = 'password';
@@ -66,9 +60,8 @@ final class Md5PasswordHashTest extends UnitTestCase
 
     /**
      * Tests that authentication procedure fails with broken hash to compare to
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsFalseWithBrokenHash(): void
     {
         $password = 'password';
@@ -81,9 +74,8 @@ final class Md5PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPassword(): void
     {
         $password = 'aEjOtY';
@@ -97,9 +89,8 @@ final class Md5PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidNumericCharClassPassword(): void
     {
         $password = '01369';
@@ -113,9 +104,8 @@ final class Md5PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAsciiSpecialCharClassPassword(): void
     {
         $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
@@ -129,9 +119,8 @@ final class Md5PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidLatin1SpecialCharClassPassword(): void
     {
         $password = '';
@@ -149,9 +138,8 @@ final class Md5PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidLatin1UmlautCharClassPassword(): void
     {
         $password = '';
@@ -169,9 +157,7 @@ final class Md5PasswordHashTest extends UnitTestCase
         self::assertTrue($subject->checkPassword($password, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordReturnsFalseWithNonValidPassword(): void
     {
         $password = 'password';
@@ -181,9 +167,7 @@ final class Md5PasswordHashTest extends UnitTestCase
         self::assertFalse($subject->checkPassword($password1, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalse(): void
     {
         $password = 'password';
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PasswordHashFactoryTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PasswordHashFactoryTest.php
index 4d98683b8efa99b1e8fdcafd318e859e85acfa50..f72fc368a5a2358a231c02a4d2c4a01b240cea51 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PasswordHashFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PasswordHashFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\Argon2iPasswordHash;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\InvalidPasswordHashException;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PasswordHashFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionIfModeIsNotBeOrFe(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -37,9 +36,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get('ThisIsNotAValidHash', 'foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionWithBrokenClassNameModeConfiguration(): void
     {
         $this->expectException(\LogicException::class);
@@ -48,9 +45,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get('ThisIsNotAValidHash', 'FE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionWithBrokenOptionsModeConfiguration(): void
     {
         $this->expectException(\LogicException::class);
@@ -59,9 +54,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get('ThisIsNotAValidHash', 'FE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionIfARegisteredHashDoesNotImplementSaltInterface(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['availablePasswordHashAlgorithms'] = [ \stdClass::class ];
@@ -70,9 +63,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get('ThisIsNotAValidHash', 'BE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionIfNoClassIsFoundThatHandlesGivenHash(): void
     {
         $this->expectException(InvalidPasswordHashException::class);
@@ -80,9 +71,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get('ThisIsNotAValidHash', 'BE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionIfClassThatHandlesAHashIsNotAvailable(): void
     {
         $phpassPasswordHashMock = $this->createMock(PhpassPasswordHash::class);
@@ -93,9 +82,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get('$P$C7u7E10SBEie/Jbdz0jDtUcWhzgOPF.', 'BE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionIfClassThatHandlesAHashSaysNoToHash(): void
     {
         GeneralUtility::addInstance(PhpassPasswordHash::class, new PhpassPasswordHash());
@@ -105,9 +92,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get($hash, 'BE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHandsConfiguredOptionsToHashClassIfMethodIsConfiguredDefaultForMode(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['availablePasswordHashAlgorithms'] = [ TestPasswordHash::class ];
@@ -122,9 +107,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->get('someHash', 'FE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReturnsInstanceOfHashClassThatHandlesHash(): void
     {
         $phpassPasswordHash = new PhpassPasswordHash();
@@ -133,9 +116,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         self::assertSame($phpassPasswordHash, (new PasswordHashFactory())->get($hash, 'BE'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashInstanceThrowsExceptionIfModeIsNotBeOrFe(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -143,9 +124,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->getDefaultHashInstance('foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashInstanceThrowsExceptionWithBrokenClassNameModeConfiguration(): void
     {
         $this->expectException(\LogicException::class);
@@ -154,9 +133,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->getDefaultHashInstance('FE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashInstanceThrowsExceptionWithBrokenOptionsModeConfiguration(): void
     {
         $this->expectException(\LogicException::class);
@@ -165,9 +142,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->getDefaultHashInstance('FE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashReturnsInstanceOfConfiguredDefaultFeMethod(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords']['FE']['saltedPWHashingMethod'] = Argon2iPasswordHash::class;
@@ -175,9 +150,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         self::assertInstanceOf(Argon2iPasswordHash::class, $hashInstance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashReturnsInstanceOfConfiguredDefaultBeMethod(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords']['BE']['saltedPWHashingMethod'] = Argon2iPasswordHash::class;
@@ -185,9 +158,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         self::assertInstanceOf(Argon2iPasswordHash::class, $hashInstance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashThrowsExceptionIfDefaultHashMethodDoesNotImplementSaltInterface(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className'] = \stdClass::class;
@@ -197,9 +168,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->getDefaultHashInstance('BE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashThrowsExceptionIfDefaultHashMethodIsNotRegistered(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordHashing']['className'] = \stdClass::class;
@@ -209,9 +178,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->getDefaultHashInstance('BE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHashThrowsExceptionIfDefaultHashMethodIsNotAvailable(): void
     {
         $argon2iPasswordHashMock = $this->createMock(Argon2iPasswordHash::class);
@@ -223,9 +190,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->getDefaultHashInstance('BE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultHoshHandsConfiguredOptionsToHashClass(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['availablePasswordHashAlgorithms'] = [ TestPasswordHash::class ];
@@ -240,9 +205,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         (new PasswordHashFactory())->getDefaultHashInstance('FE');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRegisteredSaltedHashingMethodsReturnsRegisteredMethods(): void
     {
         $methods = [
@@ -253,9 +216,7 @@ final class PasswordHashFactoryTest extends UnitTestCase
         self::assertSame($methods, PasswordHashFactory::getRegisteredSaltedHashingMethods());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRegisteredSaltedHashingMethodsThrowsExceptionIfNoMethodIsConfigured(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Pbkdf2PasswordHashTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Pbkdf2PasswordHashTest.php
index c56a46520f80635a8f067263ce3aed1fafe5def4..26034af26a14b1d527065d026aeed6a3dbfa38d3 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Pbkdf2PasswordHashTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/Pbkdf2PasswordHashTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\Pbkdf2PasswordHash;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class Pbkdf2PasswordHashTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfHashCountIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -32,9 +31,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         new Pbkdf2PasswordHash(['hash_count' => 999]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfHashCountIsTooHigh(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -42,9 +39,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         new Pbkdf2PasswordHash(['hash_count' => 10000001]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNullWithEmptyPassword(): void
     {
         $password = '';
@@ -52,9 +47,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         self::assertNull($subject->getHashedPassword($password));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNotNullWithNullPassword(): void
     {
         $password = 'a';
@@ -62,9 +55,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         self::assertNotNull($subject->getHashedPassword($password));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordValidates(): void
     {
         $password = 'password';
@@ -78,9 +69,8 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same fixed salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPasswordAndFixedHash(): void
     {
         $password = 'password';
@@ -91,9 +81,8 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
 
     /**
      * Tests that authentication procedure fails with broken hash to compare to
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsFalseWithBrokenHash(): void
     {
         $password = 'password';
@@ -107,9 +96,8 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPassword(): void
     {
         $password = 'aEjOtY';
@@ -123,9 +111,8 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidNumericCharClassPassword(): void
     {
         $password = '01369';
@@ -139,9 +126,8 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAsciiSpecialCharClassPassword(): void
     {
         $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
@@ -155,9 +141,8 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidLatin1SpecialCharClassPassword(): void
     {
         $password = '';
@@ -175,9 +160,8 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidLatin1UmlautCharClassPassword(): void
     {
         $password = '';
@@ -195,9 +179,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         self::assertTrue($subject->checkPassword($password, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordReturnsFalseWithNonValidPassword(): void
     {
         $password = 'password';
@@ -207,9 +189,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         self::assertFalse($subject->checkPassword($password1, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalseForValidSaltedPassword(): void
     {
         $password = 'password';
@@ -218,9 +198,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         self::assertFalse($subject->isHashUpdateNeeded($saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsTrueWithChangedHashCount(): void
     {
         $subject = new Pbkdf2PasswordHash(['hash_count' => 1000]);
@@ -229,9 +207,7 @@ final class Pbkdf2PasswordHashTest extends UnitTestCase
         self::assertTrue($subject->isHashUpdateNeeded($saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordIsCompatibleWithPythonPasslibHashes(): void
     {
         $passlibSaltedHash = '$pbkdf2-sha256$6400$.6UI/S.nXIk8jcbdHx3Fhg$98jZicV16ODfEsEZeYPGHU3kbrUrvUEXOPimVSQDD44';
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PhpassPasswordHashTest.php b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PhpassPasswordHashTest.php
index cf201d689c053641689b8d8542f96b3ef660af3b..48a605dbf0ba42476e3d34aad0144ca624f40c60 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PhpassPasswordHashTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/PasswordHashing/PhpassPasswordHashTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto\PasswordHashing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\PasswordHashing\PhpassPasswordHash;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PhpassPasswordHashTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfHashCountIsTooLow(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -32,9 +31,7 @@ final class PhpassPasswordHashTest extends UnitTestCase
         new PhpassPasswordHash(['hash_count' => 6]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfHashCountIsTooHigh(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -42,27 +39,21 @@ final class PhpassPasswordHashTest extends UnitTestCase
         new PhpassPasswordHash(['hash_count' => 25]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNullWithEmptyPassword(): void
     {
         $subject = new PhpassPasswordHash(['hash_count' => 7]);
         self::assertNull($subject->getHashedPassword(''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordReturnsNotNullWithNotEmptyPassword(): void
     {
         $subject = new PhpassPasswordHash(['hash_count' => 7]);
         self::assertNotNull($subject->getHashedPassword('a'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHashedPasswordValidates(): void
     {
         $password = 'password';
@@ -76,9 +67,8 @@ final class PhpassPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same fixed salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPasswordAndFixedHash(): void
     {
         $password = 'password';
@@ -89,9 +79,8 @@ final class PhpassPasswordHashTest extends UnitTestCase
 
     /**
      * Tests that authentication procedure fails with broken hash to compare to
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsFalseWithBrokenHash(): void
     {
         $password = 'password';
@@ -105,9 +94,8 @@ final class PhpassPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAlphaCharClassPassword(): void
     {
         $password = 'aEjOtY';
@@ -121,9 +109,8 @@ final class PhpassPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidNumericCharClassPassword(): void
     {
         $password = '01369';
@@ -137,9 +124,8 @@ final class PhpassPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidAsciiSpecialCharClassPassword(): void
     {
         $password = ' !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
@@ -153,9 +139,8 @@ final class PhpassPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidLatin1SpecialCharClassPassword(): void
     {
         $password = '';
@@ -173,9 +158,8 @@ final class PhpassPasswordHashTest extends UnitTestCase
      *
      * Checks if a "plain-text password" is every time mapped to the
      * same "salted password hash" when using the same salt.
-     *
-     * @test
      */
+    #[Test]
     public function checkPasswordReturnsTrueWithValidLatin1UmlautCharClassPassword(): void
     {
         $password = '';
@@ -193,9 +177,7 @@ final class PhpassPasswordHashTest extends UnitTestCase
         self::assertTrue($subject->checkPassword($password, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPasswordReturnsFalseWithNonValidPassword(): void
     {
         $password = 'password';
@@ -205,9 +187,7 @@ final class PhpassPasswordHashTest extends UnitTestCase
         self::assertFalse($subject->checkPassword($password1, $saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalseForValidSaltedPassword(): void
     {
         $password = 'password';
@@ -216,9 +196,7 @@ final class PhpassPasswordHashTest extends UnitTestCase
         self::assertFalse($subject->isHashUpdateNeeded($saltedHashPassword));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isHashUpdateNeededReturnsFalseForChangedHashCountSaltedPassword(): void
     {
         $password = 'password';
diff --git a/typo3/sysext/core/Tests/Unit/Crypto/RandomTest.php b/typo3/sysext/core/Tests/Unit/Crypto/RandomTest.php
index 40ad40f208145f2c4d8dac046bf9007590086751..c90a437bf16d872a666ed396d077edd5ea646acc 100644
--- a/typo3/sysext/core/Tests/Unit/Crypto/RandomTest.php
+++ b/typo3/sysext/core/Tests/Unit/Crypto/RandomTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Crypto;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Crypto\Random;
 use TYPO3\CMS\Core\Exception\InvalidPasswordRulesException;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RandomTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function generateRandomBytesReturnsExpectedAmountOfBytes(): void
     {
         $subject = new Random();
@@ -57,10 +57,10 @@ final class RandomTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider generateRandomHexStringReturnsExpectedAmountOfCharsDataProvider
      * @param int $numberOfChars Number of Chars to generate
      */
+    #[DataProvider('generateRandomHexStringReturnsExpectedAmountOfCharsDataProvider')]
+    #[Test]
     public function generateRandomHexStringReturnsExpectedAmountOfChars($numberOfChars): void
     {
         $subject = new Random();
@@ -91,10 +91,8 @@ final class RandomTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider generateRandomPasswordThrowsInvalidPasswordRulesExceptionDataProvider
-     */
+    #[DataProvider('generateRandomPasswordThrowsInvalidPasswordRulesExceptionDataProvider')]
+    #[Test]
     public function generateRandomPasswordThrowsInvalidPasswordRulesException(
         array $passwordRules,
         int $exceptionCode
@@ -124,10 +122,8 @@ final class RandomTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider generateRandomPasswordGeneratesRandomWithEncodingDataProvider
-     */
+    #[DataProvider('generateRandomPasswordGeneratesRandomWithEncodingDataProvider')]
+    #[Test]
     public function generateRandomPasswordGeneratesRandomWithEncoding(
         array $passwordRules,
         string $pattern
@@ -163,10 +159,8 @@ final class RandomTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider generateRandomPasswordGeneratesRandomWithCharacterSetsDataProvider
-     */
+    #[DataProvider('generateRandomPasswordGeneratesRandomWithCharacterSetsDataProvider')]
+    #[Test]
     public function generateRandomPasswordGeneratesRandomWithCharacterSets(
         array $passwordRules,
         string $pattern
@@ -202,10 +196,8 @@ final class RandomTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider generateRandomPasswordGeneratesRandomWithLengthDataProvider
-     */
+    #[DataProvider('generateRandomPasswordGeneratesRandomWithLengthDataProvider')]
+    #[Test]
     public function generateRandomPasswordGeneratesRandomWithLength(
         array $passwordRules,
         int $length
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php
index 53ca88f553921b95b1adb1f25ad5ed37e672198e..d4d1300c881ff037bfd10ea024c5d06bc154e9d1 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\Uid\Uuid;
@@ -29,7 +31,8 @@ use TYPO3\CMS\Core\DataHandling\DataHandlerCheckModifyAccessListHookInterface;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\PasswordPolicy\Event\EnrichPasswordValidationContextDataEvent;
 use TYPO3\CMS\Core\PasswordPolicy\Validator\Dto\ContextData;
-use TYPO3\CMS\Core\SysLog;
+use TYPO3\CMS\Core\SysLog\Action;
+use TYPO3\CMS\Core\SysLog\Error;
 use TYPO3\CMS\Core\Tests\Unit\DataHandling\Fixtures\AllowAccessHookFixture;
 use TYPO3\CMS\Core\Tests\Unit\DataHandling\Fixtures\InvalidHookFixture;
 use TYPO3\CMS\Core\Tests\Unit\DataHandling\Fixtures\UserOddNumberFilter;
@@ -56,9 +59,7 @@ final class DataHandlerTest extends UnitTestCase
         $this->subject->start([], [], $this->backendUserMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixtureCanBeCreated(): void
     {
         self::assertInstanceOf(DataHandler::class, $this->subject);
@@ -67,27 +68,21 @@ final class DataHandlerTest extends UnitTestCase
     //////////////////////////////////////////
     // Test concerning checkModifyAccessList
     //////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function adminIsAllowedToModifyNonAdminTable(): void
     {
         $this->subject->admin = true;
         self::assertTrue($this->subject->checkModifyAccessList('tt_content'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonAdminIsNorAllowedToModifyNonAdminTable(): void
     {
         $this->subject->admin = false;
         self::assertFalse($this->subject->checkModifyAccessList('tt_content'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonAdminWithTableModifyAccessIsAllowedToModifyNonAdminTable(): void
     {
         $this->subject->admin = false;
@@ -95,27 +90,21 @@ final class DataHandlerTest extends UnitTestCase
         self::assertTrue($this->subject->checkModifyAccessList('tt_content'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function adminIsAllowedToModifyAdminTable(): void
     {
         $this->subject->admin = true;
         self::assertTrue($this->subject->checkModifyAccessList('be_users'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonAdminIsNotAllowedToModifyAdminTable(): void
     {
         $this->subject->admin = false;
         self::assertFalse($this->subject->checkModifyAccessList('be_users'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonAdminWithTableModifyAccessIsNotAllowedToModifyAdminTable(): void
     {
         $tableName = StringUtility::getUniqueId('aTable');
@@ -144,10 +133,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider checkValueForDatetimeDataProvider
-     */
+    #[DataProvider('checkValueForDatetimeDataProvider')]
+    #[Test]
     public function checkValueForDatetime($input, $serverTimezone, $expectedOutput): void
     {
         $oldTimezone = date_default_timezone_get();
@@ -177,10 +164,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider checkValueForColorDataProvider
-     */
+    #[DataProvider('checkValueForColorDataProvider')]
+    #[Test]
     public function checkValueForColor(string $input, mixed $expected, array $additionalFieldConfig = []): void
     {
         $output = $this->subject->_call(
@@ -192,9 +177,7 @@ final class DataHandlerTest extends UnitTestCase
         self::assertEquals($expected, $output['value'] ?? null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkValuePasswordWithSaltedPasswordKeepsExistingHash(): void
     {
         // Note the involved salted passwords are NOT mocked since the factory is static
@@ -203,9 +186,7 @@ final class DataHandlerTest extends UnitTestCase
         self::assertSame($inputValue, $result['value']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkValuePasswordWithSaltedPasswordReturnsHashForSaltedPassword(): void
     {
         $event = new EnrichPasswordValidationContextDataEvent(new ContextData(), [], '');
@@ -249,10 +230,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider numberValueCheckRecognizesStringValuesAsIntegerValuesCorrectlyDataProvider
-     */
+    #[DataProvider('numberValueCheckRecognizesStringValuesAsIntegerValuesCorrectlyDataProvider')]
+    #[Test]
     public function numberValueCheckRecognizesStringValuesAsIntegerValuesCorrectly(string $value, int $expectedReturnValue): void
     {
         $tcaFieldConf = [
@@ -304,10 +283,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider numberValueCheckRecognizesDecimalStringValuesAsFloatValuesCorrectlyDataProvider
-     */
+    #[DataProvider('numberValueCheckRecognizesDecimalStringValuesAsFloatValuesCorrectlyDataProvider')]
+    #[Test]
     public function numberValueCheckRecognizesDecimalStringValuesAsFloatValuesCorrectly(string $value, string $expectedReturnValue): void
     {
         $tcaFieldConf = [
@@ -351,10 +328,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider inputValuesRangeDoubleDataProvider
-     */
+    #[DataProvider('inputValuesRangeDoubleDataProvider')]
+    #[Test]
     public function inputValueCheckRespectsRightLowerAndUpperLimitForDouble(string $value, string|int $expectedReturnValue): void
     {
         $tcaFieldConf = [
@@ -369,10 +344,8 @@ final class DataHandlerTest extends UnitTestCase
         self::assertSame($expectedReturnValue, $returnValue['value']);
     }
 
-    /**
-     * @test
-     * @dataProvider inputValuesRangeDoubleDataProvider
-     */
+    #[DataProvider('inputValuesRangeDoubleDataProvider')]
+    #[Test]
     public function inputValueCheckRespectsRightLowerAndUpperLimitWithDefaultValueForDouble(string $value, string|int $expectedReturnValue): void
     {
         $tcaFieldConf = [
@@ -410,10 +383,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider datetimeValuesDataProvider
-     */
+    #[DataProvider('datetimeValuesDataProvider')]
+    #[Test]
     public function valueCheckRecognizesDatetimeValuesAsIntegerValuesCorrectly(string $value, int $expected): void
     {
         $tcaFieldConf = [
@@ -455,10 +426,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider inputValueRangeCheckIsIgnoredWhenDefaultIsZeroAndInputValueIsEmptyDataProvider
-     * @test
-     */
+    #[DataProvider('inputValueRangeCheckIsIgnoredWhenDefaultIsZeroAndInputValueIsEmptyDataProvider')]
+    #[Test]
     public function inputValueRangeCheckIsIgnoredWhenDefaultIsZeroAndInputValueIsEmpty(
         string|int $inputValue,
         int $expected,
@@ -515,9 +484,9 @@ final class DataHandlerTest extends UnitTestCase
 
     /**
      * Tests whether native dbtype inputs are parsed independent of the server timezone.
-     * @test
-     * @dataProvider datetimeValueCheckDbtypeIsIndependentFromTimezoneDataProvider
      */
+    #[DataProvider('datetimeValueCheckDbtypeIsIndependentFromTimezoneDataProvider')]
+    #[Test]
     public function datetimeValueCheckDbtypeIsIndependentFromTimezone(string $value, string $dbtype, string $expectedOutput): void
     {
         $tcaFieldConf = [
@@ -604,9 +573,9 @@ final class DataHandlerTest extends UnitTestCase
      * @param string $format
      * @param bool $nullable
      * @param mixed|null $expectedOutput
-     * @dataProvider inputValueCheckNativeDbTypeDataProvider
-     * @test
      */
+    #[DataProvider('inputValueCheckNativeDbTypeDataProvider')]
+    #[Test]
     public function inputValueCheckNativeDbType(string|null $value, string $dbType, string $format, bool $nullable, $expectedOutput): void
     {
         $tcaFieldConf = [
@@ -627,8 +596,8 @@ final class DataHandlerTest extends UnitTestCase
     //
     /**
      * Tests whether a wrong interface on the 'checkModifyAccessList' hook throws an exception.
-     * @test
      */
+    #[Test]
     public function doesCheckModifyAccessListThrowExceptionOnWrongHookInterface(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -640,9 +609,8 @@ final class DataHandlerTest extends UnitTestCase
 
     /**
      * Tests whether the 'checkModifyAccessList' hook is called correctly.
-     *
-     * @test
      */
+    #[Test]
     public function doesCheckModifyAccessListHookGetsCalled(): void
     {
         $hookClass = StringUtility::getUniqueId('tx_coretest');
@@ -658,9 +626,8 @@ final class DataHandlerTest extends UnitTestCase
 
     /**
      * Tests whether the 'checkModifyAccessList' hook modifies the $accessAllowed variable.
-     *
-     * @test
      */
+    #[Test]
     public function doesCheckModifyAccessListHookModifyAccessAllowed(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['checkModifyAccessList'][] = AllowAccessHookFixture::class;
@@ -670,9 +637,7 @@ final class DataHandlerTest extends UnitTestCase
     /////////////////////////////////////
     // Tests concerning process_datamap
     /////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function processDatamapForFrozenNonZeroWorkspaceReturnsFalse(): void
     {
         $subject = $this->getMockBuilder(DataHandler::class)
@@ -765,10 +730,9 @@ final class DataHandlerTest extends UnitTestCase
     /**
      * This test ensures, that the eval method checkValue_SW is called on
      * flexform structures.
-     *
-     * @test
-     * @dataProvider checkValue_flex_procInData_travDSDataProvider
      */
+    #[DataProvider('checkValue_flex_procInData_travDSDataProvider')]
+    #[Test]
     public function checkValue_flex_procInData_travDS(array $dataValues, array $DSelements, array $expected): void
     {
         $pParams = [
@@ -789,33 +753,27 @@ final class DataHandlerTest extends UnitTestCase
     /////////////////////////////////////
     // Tests concerning log
     /////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function logCallsWriteLogOfBackendUserIfLoggingIsEnabled(): void
     {
         $backendUser = $this->createMock(BackendUserAuthentication::class);
         $backendUser->expects(self::once())->method('writelog');
         $this->subject->enableLogging = true;
         $this->subject->BE_USER = $backendUser;
-        $this->subject->log('', 23, SysLog\Action::UNDEFINED, 42, SysLog\Error::MESSAGE, 'details');
+        $this->subject->log('', 23, Action::UNDEFINED, 42, Error::MESSAGE, 'details');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logDoesNotCallWriteLogOfBackendUserIfLoggingIsDisabled(): void
     {
         $backendUser = $this->createMock(BackendUserAuthentication::class);
         $backendUser->expects(self::never())->method('writelog');
         $this->subject->enableLogging = false;
         $this->subject->BE_USER = $backendUser;
-        $this->subject->log('', 23, SysLog\Action::UNDEFINED, 42, SysLog\Error::MESSAGE, 'details');
+        $this->subject->log('', 23, Action::UNDEFINED, 42, Error::MESSAGE, 'details');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logAddsEntryToLocalErrorLogArray(): void
     {
         $backendUser = $this->createMock(BackendUserAuthentication::class);
@@ -823,14 +781,12 @@ final class DataHandlerTest extends UnitTestCase
         $this->subject->enableLogging = true;
         $this->subject->errorLog = [];
         $logDetailsUnique = StringUtility::getUniqueId('details');
-        $this->subject->log('', 23, SysLog\Action::UNDEFINED, 42, SysLog\Error::USER_ERROR, $logDetailsUnique);
+        $this->subject->log('', 23, Action::UNDEFINED, 42, Error::USER_ERROR, $logDetailsUnique);
         self::assertArrayHasKey(0, $this->subject->errorLog);
         self::assertStringEndsWith($logDetailsUnique, $this->subject->errorLog[0]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logFormatsDetailMessageWithAdditionalDataInLocalErrorArray(): void
     {
         $backendUser = $this->createMock(BackendUserAuthentication::class);
@@ -838,14 +794,12 @@ final class DataHandlerTest extends UnitTestCase
         $this->subject->enableLogging = true;
         $this->subject->errorLog = [];
         $logDetails = StringUtility::getUniqueId('details');
-        $this->subject->log('', 23, SysLog\Action::UNDEFINED, 42, SysLog\Error::USER_ERROR, '%1$s' . $logDetails . '%2$s', -1, ['foo', 'bar']);
+        $this->subject->log('', 23, Action::UNDEFINED, 42, Error::USER_ERROR, '%1$s' . $logDetails . '%2$s', -1, ['foo', 'bar']);
         $expected = 'foo' . $logDetails . 'bar';
         self::assertStringEndsWith($expected, $this->subject->errorLog[0]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logFormatsDetailMessageWithPlaceholders(): void
     {
         $backendUser = $this->createMock(BackendUserAuthentication::class);
@@ -853,16 +807,14 @@ final class DataHandlerTest extends UnitTestCase
         $this->subject->enableLogging = true;
         $this->subject->errorLog = [];
         $logDetails = 'An error occurred on {table}:{uid} when localizing';
-        $this->subject->log('', 23, SysLog\Action::UNDEFINED, 42, SysLog\Error::USER_ERROR, $logDetails, -1, ['table' => 'tx_sometable', 0 => 'some random value']);
+        $this->subject->log('', 23, Action::UNDEFINED, 42, Error::USER_ERROR, $logDetails, -1, ['table' => 'tx_sometable', 0 => 'some random value']);
         // UID is kept as non-replaced, and other properties are not replaced.
         $expected = 'An error occurred on tx_sometable:{uid} when localizing';
         self::assertStringEndsWith($expected, $this->subject->errorLog[0]);
     }
 
-    /**
-     * @dataProvider equalSubmittedAndStoredValuesAreDeterminedDataProvider
-     * @test
-     */
+    #[DataProvider('equalSubmittedAndStoredValuesAreDeterminedDataProvider')]
+    #[Test]
     public function equalSubmittedAndStoredValuesAreDetermined(bool $expected, string|int|null $submittedValue, string|int|null $storedValue, string $storedType, bool $allowNull): void
     {
         $result = \Closure::bind(function () use ($submittedValue, $storedValue, $storedType, $allowNull) {
@@ -1049,9 +1001,7 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deletePagesOnRootLevelIsDenied(): void
     {
         $dataHandlerMock = $this->getMockBuilder(DataHandler::class)
@@ -1068,9 +1018,7 @@ final class DataHandlerTest extends UnitTestCase
         $dataHandlerMock->deletePages(0);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deleteRecord_procBasedOnFieldTypeRespectsEnableCascadingDelete(): void
     {
         $table = StringUtility::getUniqueId('foo_');
@@ -1124,10 +1072,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider checkValue_checkReturnsExpectedValuesDataProvider
-     * @test
-     */
+    #[DataProvider('checkValue_checkReturnsExpectedValuesDataProvider')]
+    #[Test]
     public function checkValue_checkReturnsExpectedValues(string|int $value, string|int $expectedValue): void
     {
         $expectedResult = [
@@ -1144,9 +1090,7 @@ final class DataHandlerTest extends UnitTestCase
         self::assertSame($expectedResult, $this->subject->_call('checkValueForCheck', $result, $value, $tcaFieldConfiguration, '', 0, 0, ''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkValueForInputConvertsNullToEmptyString(): void
     {
         $expectedResult = ['value' => ''];
@@ -1173,10 +1117,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider checkValueForJsonDataProvider
-     */
+    #[DataProvider('checkValueForJsonDataProvider')]
+    #[Test]
     public function checkValueForJson(string|array $input, array $expected): void
     {
         self::assertSame(
@@ -1189,9 +1131,7 @@ final class DataHandlerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkValueForUuidReturnsValidUuidUnmodified(): void
     {
         self::assertEquals(
@@ -1200,27 +1140,21 @@ final class DataHandlerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkValueForUuidCreatesValidUuidValueForReqiredFieldsWithInvalidUuidGiven(): void
     {
         self::assertTrue(Uuid::isValid($this->subject->_call('checkValueForUuid', '', [])['value']));
         self::assertTrue(Uuid::isValid($this->subject->_call('checkValueForUuid', '-_invalid_-', [])['value']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkValueForUuidDiscardsInvalidUuidIfFieldIsNotRequired(): void
     {
         self::assertEmpty($this->subject->_call('checkValueForUuid', '', ['required' => false]));
         self::assertEmpty($this->subject->_call('checkValueForUuid', '-_invalid_-', ['required' => false]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkValueForUuidCreatesValidUuidValueWithDefinedVersion(): void
     {
         self::assertEquals(6, (int)$this->subject->_call('checkValueForUuid', '', ['version' => 6])['value'][14]);
@@ -1232,10 +1166,8 @@ final class DataHandlerTest extends UnitTestCase
         self::assertEquals(4, (int)$this->subject->_call('checkValueForUuid', '', [])['value'][14]);
     }
 
-    /**
-     * @test
-     * @dataProvider referenceValuesAreCastedDataProvider
-     */
+    #[DataProvider('referenceValuesAreCastedDataProvider')]
+    #[Test]
     public function referenceValuesAreCasted(string $value, array $configuration, bool $isNew, int|string $expected): void
     {
         self::assertEquals(
@@ -1289,10 +1221,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider clearPrefixFromValueRemovesPrefixDataProvider
-     */
+    #[DataProvider('clearPrefixFromValueRemovesPrefixDataProvider')]
+    #[Test]
     public function clearPrefixFromValueRemovesPrefix(string $input, string $expected): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -1338,18 +1268,14 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider applyFiltersToValuesFiltersValuesDataProvider
-     * @test
-     */
+    #[DataProvider('applyFiltersToValuesFiltersValuesDataProvider')]
+    #[Test]
     public function applyFiltersToValuesFiltersValues(array $tcaFieldConfiguration, array $values, array $expected): void
     {
         self::assertEqualsCanonicalizing($expected, $this->subject->_call('applyFiltersToValues', $tcaFieldConfiguration, $values));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function applyFiltersToValuesExpectsArray(): void
     {
         $tcaFieldConfiguration = [
@@ -1409,10 +1335,8 @@ final class DataHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider validateValueForRequiredReturnsExpectedValueDataHandler
-     * @test
-     */
+    #[DataProvider('validateValueForRequiredReturnsExpectedValueDataHandler')]
+    #[Test]
     public function validateValueForRequiredReturnsExpectedValue(array $tcaFieldConfig, $input, bool $expectation): void
     {
         self::assertSame($expectation, $this->subject->_call('validateValueForRequired', $tcaFieldConfig, $input));
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/Localization/StateTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/Localization/StateTest.php
index 08769f1a6378c60de2d167a4725b6841d481b08d..91cff8d8b063b9a1b022a31171045ab97cd08a5c 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/Localization/StateTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/Localization/StateTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\Localization;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\DataHandling\Localization\State;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,10 +32,8 @@ final class StateTest extends UnitTestCase
         $GLOBALS['TCA'] = [];
     }
 
-    /**
-     * @test
-     * @dataProvider stateObjectCanBeCreatedDataProvider
-     */
+    #[DataProvider('stateObjectCanBeCreatedDataProvider')]
+    #[Test]
     public function stateObjectCanBeCreated(string $tableName, array $states): void
     {
         $subject = new State($tableName, $states);
@@ -55,10 +55,8 @@ final class StateTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider statesAreEnrichedAndSanitizedOnObjectCreationDataProvider
-     */
+    #[DataProvider('statesAreEnrichedAndSanitizedOnObjectCreationDataProvider')]
+    #[Test]
     public function statesAreEnrichedAndSanitizedOnObjectCreation(
         array $states,
         array $expected
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/Model/CorrelationIdTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/Model/CorrelationIdTest.php
index a47b7f3f0a1a62d5f265b2a01c50ff052ed28a22..2e925a88b9573f21a5e37a9a668502701d172e2b 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/Model/CorrelationIdTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/Model/CorrelationIdTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\Model;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\DataHandling\Model\CorrelationId;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -44,10 +46,8 @@ final class CorrelationIdTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canBeParsedDataProvider
-     */
+    #[DataProvider('canBeParsedDataProvider')]
+    #[Test]
     public function canBeParsed(string $string, array $expectations): void
     {
         $correlationId = CorrelationId::fromString($string);
@@ -59,9 +59,7 @@ final class CorrelationIdTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function subjectIsConsidered(): void
     {
         $correlationId = CorrelationId::forSubject('subject')
@@ -69,9 +67,7 @@ final class CorrelationIdTest extends UnitTestCase
         self::assertSame('0400$subject/aspect-a', (string)$correlationId);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function scopeIsConsidered(): void
     {
         $correlationId = CorrelationId::forScope('scope')
@@ -80,9 +76,7 @@ final class CorrelationIdTest extends UnitTestCase
         self::assertSame('0400$scope:subject/aspect-a', (string)$correlationId);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function doesNotVary(): void
     {
         $correlationId = '0400$scope:subject/aspect-a/aspect-b';
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SlugHelperTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SlugHelperTest.php
index 5cb575d3faa3cb0520d2bbc2c1382bd85f5c05e5..067a54287c02ee1a933d4ed6ca4742a4aae73f28 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SlugHelperTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SlugHelperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\DataHandling\SlugHelper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -134,10 +136,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeDataProvider
-     */
+    #[DataProvider('sanitizeDataProvider')]
+    #[Test]
     public function sanitizeConvertsString(array $configuration, string $input, string $expected): void
     {
         $subject = new SlugHelper(
@@ -173,10 +173,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider generateNeverDeliversEmptySlugDataProvider
-     * @test
-     */
+    #[DataProvider('generateNeverDeliversEmptySlugDataProvider')]
+    #[Test]
     public function generateNeverDeliversEmptySlug(string $input, string $expected): void
     {
         $GLOBALS['dummyTable']['ctrl'] = [];
@@ -326,10 +324,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeForPagesDataProvider
-     */
+    #[DataProvider('sanitizeForPagesDataProvider')]
+    #[Test]
     public function sanitizeConvertsStringForPages(array $configuration, string $input, string $expected): void
     {
         $subject = new SlugHelper(
@@ -365,10 +361,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider generateNeverDeliversEmptySlugForPagesDataProvider
-     * @test
-     */
+    #[DataProvider('generateNeverDeliversEmptySlugForPagesDataProvider')]
+    #[Test]
     public function generateNeverDeliversEmptySlugForPages(string $input, string $expected): void
     {
         $GLOBALS['dummyTable']['ctrl'] = [];
@@ -466,10 +460,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider generatePrependsSlugsForPagesDataProvider
-     * @test
-     */
+    #[DataProvider('generatePrependsSlugsForPagesDataProvider')]
+    #[Test]
     public function generatePrependsSlugsForPages(string $input, string $expected, array $options): void
     {
         $GLOBALS['dummyTable']['ctrl'] = [];
@@ -607,10 +599,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider generateSlugWithNavTitleAndFallbackForPagesDataProvider
-     * @test
-     */
+    #[DataProvider('generateSlugWithNavTitleAndFallbackForPagesDataProvider')]
+    #[Test]
     public function generateSlugWithNavTitleAndFallbackForPages(array $input, string $expected, array $options): void
     {
         $GLOBALS['dummyTable']['ctrl'] = [];
@@ -631,9 +621,7 @@ final class SlugHelperTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateSlugWithHookModifiers(): void
     {
         $options = [];
@@ -682,10 +670,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider generateSlugWithPid0DataProvider
-     * @test
-     */
+    #[DataProvider('generateSlugWithPid0DataProvider')]
+    #[Test]
     public function generateSlugWithPid0(array $input, string $expected)
     {
         if (empty($GLOBALS[$input['table']]['ctrl'])) {
@@ -718,10 +704,8 @@ final class SlugHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider generatePrependsSlugsForNonPagesDataProvider
-     */
+    #[DataProvider('generatePrependsSlugsForNonPagesDataProvider')]
+    #[Test]
     public function generatePrependsSlugsForNonPages(string $input, string $expected, array $options): void
     {
         $GLOBALS['dummyTable']['ctrl'] = [];
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/EmailSoftReferenceParserTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/EmailSoftReferenceParserTest.php
index 6ae993f421f4db4922be76b79870100a6a5930f9..77d7cdbb4a4ffb81a6994716f0357b4a6f8f1e71 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/EmailSoftReferenceParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/EmailSoftReferenceParserTest.php
@@ -17,6 +17,9 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\SoftReference;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
+
 final class EmailSoftReferenceParserTest extends AbstractSoftReferenceParserTestCase
 {
     public static function emailSoftReferenceParserTestDataProvider(): array
@@ -74,10 +77,8 @@ final class EmailSoftReferenceParserTest extends AbstractSoftReferenceParserTest
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider emailSoftReferenceParserTestDataProvider
-     */
+    #[DataProvider('emailSoftReferenceParserTestDataProvider')]
+    #[Test]
     public function emailSoftReferenceParserTest(string $content, string $expectedContent, array $expectedElements, bool $expectedHasMatched): void
     {
         $subject = $this->getParserByKey('email');
@@ -87,9 +88,7 @@ final class EmailSoftReferenceParserTest extends AbstractSoftReferenceParserTest
         self::assertEquals($expectedHasMatched, $result->hasMatched());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emailSoftReferenceParserSubstituteTest(): void
     {
         $content = 'My email is: foo@bar.baz';
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/ExtensionPathSoftReferenceParserTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/ExtensionPathSoftReferenceParserTest.php
index 5e39326b3cd437132f8a875fc61b3d7e027eab66..59d42f172df54002923502406ecbcdabbaac61d9 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/ExtensionPathSoftReferenceParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/ExtensionPathSoftReferenceParserTest.php
@@ -17,6 +17,9 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\SoftReference;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
+
 final class ExtensionPathSoftReferenceParserTest extends AbstractSoftReferenceParserTestCase
 {
     public static function extensionPathSoftReferenceParserDataProvider(): array
@@ -64,10 +67,8 @@ final class ExtensionPathSoftReferenceParserTest extends AbstractSoftReferencePa
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider extensionPathSoftReferenceParserDataProvider
-     */
+    #[DataProvider('extensionPathSoftReferenceParserDataProvider')]
+    #[Test]
     public function extensionPathSoftReferenceParserTest(string $content, string $expectedContent, array $expectedElements, bool $expectedHasMatched): void
     {
         $subject = $this->getParserByKey('ext_fileref');
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/NotifySoftReferenceParserTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/NotifySoftReferenceParserTest.php
index f8c6dafd1dffcbf2b38746291d7b03f07586ec7a..c1a1a326fb1c1691c10f4804149bacf306159bd6 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/NotifySoftReferenceParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/NotifySoftReferenceParserTest.php
@@ -17,11 +17,11 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\SoftReference;
 
+use PHPUnit\Framework\Attributes\Test;
+
 final class NotifySoftReferenceParserTest extends AbstractSoftReferenceParserTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function notifySoftReferenceParserTest(): void
     {
         $subject = $this->getParserByKey('notify');
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/SubstituteSoftReferenceParserTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/SubstituteSoftReferenceParserTest.php
index 44fd2009bbf927e539934b7af0fae089f0fd5ee4..c7a2e5dc319921e544dd9e103e803e7af1b586ff 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/SubstituteSoftReferenceParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/SubstituteSoftReferenceParserTest.php
@@ -17,11 +17,11 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\SoftReference;
 
+use PHPUnit\Framework\Attributes\Test;
+
 final class SubstituteSoftReferenceParserTest extends AbstractSoftReferenceParserTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteSoftReferenceParserTest(): void
     {
         $subject = $this->getParserByKey('substitute');
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkSoftReferenceParserTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkSoftReferenceParserTest.php
index e1ca423840d97cbb6e0acb6a7adaae8132b7f09e..70c1cf918edcb13423a47be6a04c37558db03dd9 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkSoftReferenceParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkSoftReferenceParserTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\SoftReference;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Folder;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -149,10 +151,8 @@ final class TypoLinkSoftReferenceParserTest extends AbstractSoftReferenceParserT
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider findRefReturnsParsedElementsDataProvider
-     */
+    #[DataProvider('findRefReturnsParsedElementsDataProvider')]
+    #[Test]
     public function findRefReturnsParsedElements(array $softrefConfiguration, array $expectedElement): void
     {
         $subject = $this->getParserByKey('typolink');
@@ -237,10 +237,8 @@ final class TypoLinkSoftReferenceParserTest extends AbstractSoftReferenceParserT
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider findRefReturnsParsedElementsWithFileDataProvider
-     */
+    #[DataProvider('findRefReturnsParsedElementsWithFileDataProvider')]
+    #[Test]
     public function findRefReturnsParsedElementsWithFile(array $softrefConfiguration, array $expectedElement): void
     {
         $storageObject = $this->createMock(ResourceStorage::class);
@@ -293,10 +291,8 @@ final class TypoLinkSoftReferenceParserTest extends AbstractSoftReferenceParserT
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider findRefReturnsNullWithFolderDataProvider
-     */
+    #[DataProvider('findRefReturnsNullWithFolderDataProvider')]
+    #[Test]
     public function findRefReturnsNullWithFolder(array $softrefConfiguration): void
     {
         $folderObject = $this->createMock(Folder::class);
@@ -334,10 +330,8 @@ final class TypoLinkSoftReferenceParserTest extends AbstractSoftReferenceParserT
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getTypoLinkPartsThrowExceptionWithPharReferencesDataProvider
-     */
+    #[DataProvider('getTypoLinkPartsThrowExceptionWithPharReferencesDataProvider')]
+    #[Test]
     public function getTypoLinkPartsThrowExceptionWithPharReferences(string $pharUrl): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkTagSoftReferenceParserTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkTagSoftReferenceParserTest.php
index eb8d7738b3ddf80bbda5070d3f324ff27f41b671..7b9a7a2a56e2884a29cb2ed4b27693341ea5f674 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkTagSoftReferenceParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/TypoLinkTagSoftReferenceParserTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\SoftReference;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Folder;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -136,10 +138,8 @@ final class TypoLinkTagSoftReferenceParserTest extends AbstractSoftReferencePars
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider findRefReturnsParsedElementsDataProvider
-     */
+    #[DataProvider('findRefReturnsParsedElementsDataProvider')]
+    #[Test]
     public function findRefReturnsParsedElements(array $softrefConfiguration, array $expectedElement): void
     {
         $subject = $this->getParserByKey('typolink_tag');
@@ -181,10 +181,8 @@ final class TypoLinkTagSoftReferenceParserTest extends AbstractSoftReferencePars
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider findRefReturnsParsedElementsWithFileDataProvider
-     */
+    #[DataProvider('findRefReturnsParsedElementsWithFileDataProvider')]
+    #[Test]
     public function findRefReturnsParsedElementsWithFile(array $softrefConfiguration, array $expectedElement): void
     {
         $fileObject = $this->createMock(File::class);
@@ -236,10 +234,8 @@ final class TypoLinkTagSoftReferenceParserTest extends AbstractSoftReferencePars
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider findRefReturnsNullWithFolderDataProvider
-     */
+    #[DataProvider('findRefReturnsNullWithFolderDataProvider')]
+    #[Test]
     public function findRefReturnsNullWithFolder(array $softrefConfiguration): void
     {
         $folderObject = $this->createMock(Folder::class);
diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/UrlSoftReferenceParserTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/UrlSoftReferenceParserTest.php
index a9055139e95dbe603725492c6633106bdb1fc417..bcf625ecbd300d8f0f5e00e1aa7c3e39d5c6f951 100644
--- a/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/UrlSoftReferenceParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/DataHandling/SoftReference/UrlSoftReferenceParserTest.php
@@ -17,6 +17,9 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DataHandling\SoftReference;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
+
 final class UrlSoftReferenceParserTest extends AbstractSoftReferenceParserTestCase
 {
     public static function urlSoftReferenceParserTestDataProvider(): array
@@ -99,10 +102,8 @@ final class UrlSoftReferenceParserTest extends AbstractSoftReferenceParserTestCa
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider urlSoftReferenceParserTestDataProvider
-     */
+    #[DataProvider('urlSoftReferenceParserTestDataProvider')]
+    #[Test]
     public function urlSoftReferenceParserTest(string $content, string $expectedContent, array $expectedElements): void
     {
         $subject = $this->getParserByKey('url');
@@ -111,9 +112,7 @@ final class UrlSoftReferenceParserTest extends AbstractSoftReferenceParserTestCa
         self::assertEquals($expectedElements, $result->getMatchedElements());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function urlSoftReferenceParserSubstituteTest(): void
     {
         $content = 'My website is: https://www.foo-bar.baz';
diff --git a/typo3/sysext/core/Tests/Unit/Database/ConnectionPoolTest.php b/typo3/sysext/core/Tests/Unit/Database/ConnectionPoolTest.php
index 04a4a3d4474f58bb6c4866eebb140c4563b12c67..351362eebbf8c7cfa6d004599243c587caa8dd67 100644
--- a/typo3/sysext/core/Tests/Unit/Database/ConnectionPoolTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/ConnectionPoolTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConnectionPoolTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getConnectionNamesReturnsConfiguredConnectionNames(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/ConnectionTest.php b/typo3/sysext/core/Tests/Unit/Database/ConnectionTest.php
index 2966d0a53b0f36202737b234bf1394e3963fb499..d12ad6e0fbbfa00546c70a94c46be26bf9c9825e 100644
--- a/typo3/sysext/core/Tests/Unit/Database/ConnectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/ConnectionTest.php
@@ -22,6 +22,8 @@ use Doctrine\DBAL\Driver\AbstractMySQLDriver;
 use Doctrine\DBAL\Platforms\AbstractPlatform;
 use Doctrine\DBAL\Platforms\MySQLPlatform;
 use Doctrine\DBAL\Result;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder;
@@ -73,9 +75,7 @@ final class ConnectionTest extends UnitTestCase
             ->willReturn(new MockPlatform());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createQueryBuilderReturnsInstanceOfTypo3QueryBuilder(): void
     {
         self::assertInstanceOf(QueryBuilder::class, $this->connection->createQueryBuilder());
@@ -128,18 +128,14 @@ final class ConnectionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider quoteIdentifierDataProvider
-     */
+    #[DataProvider('quoteIdentifierDataProvider')]
+    #[Test]
     public function quoteIdentifier(string $input, string $expected): void
     {
         self::assertSame($expected, $this->connection->quoteIdentifier($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function quoteIdentifiers(): void
     {
         $input = [
@@ -189,10 +185,8 @@ final class ConnectionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider insertQueriesDataProvider
-     */
+    #[DataProvider('insertQueriesDataProvider')]
+    #[Test]
     public function insertQueries(array $args, string $expectedQuery, array $expectedValues, array $expectedTypes): void
     {
         $this->connection->expects(self::once())
@@ -203,9 +197,7 @@ final class ConnectionTest extends UnitTestCase
         $this->connection->insert(...$args);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function bulkInsert(): void
     {
         $this->connection->expects(self::once())
@@ -246,10 +238,8 @@ final class ConnectionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider updateQueriesDataProvider
-     */
+    #[DataProvider('updateQueriesDataProvider')]
+    #[Test]
     public function updateQueries(array $args, string $expectedQuery, array $expectedValues, array $expectedTypes): void
     {
         // @todo drop else branch and condition once doctrine/dbal is requried in version 2.11.0 minimum
@@ -298,10 +288,8 @@ final class ConnectionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider deleteQueriesDataProvider
-     */
+    #[DataProvider('deleteQueriesDataProvider')]
+    #[Test]
     public function deleteQueries(array $args, string $expectedQuery, array $expectedValues, array $expectedTypes): void
     {
         // @todo drop else branch and condition once doctrine/dbal is requried in version 2.11.0 minimum
@@ -383,10 +371,8 @@ final class ConnectionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider selectQueriesDataProvider
-     */
+    #[DataProvider('selectQueriesDataProvider')]
+    #[Test]
     public function selectQueries(array $args, string $expectedQuery, array $expectedParameters): void
     {
         $resultStatement = $this->createMock(Result::class);
@@ -428,10 +414,8 @@ final class ConnectionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider countQueriesDataProvider
-     */
+    #[DataProvider('countQueriesDataProvider')]
+    #[Test]
     public function countQueries(array $args, string $expectedQuery, array $expectedParameters): void
     {
         $resultStatement = $this->createMock(Result::class);
@@ -446,9 +430,7 @@ final class ConnectionTest extends UnitTestCase
         $this->connection->count(...$args);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function truncateQuery(): void
     {
         $this->connection->expects(self::once())
@@ -459,9 +441,7 @@ final class ConnectionTest extends UnitTestCase
         $this->connection->truncate('aTestTable', false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getServerVersionReportsPlatformVersion(): void
     {
         $wrappedConnectionMock = $this->createMock(Connection::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Platform/PlatformInformationTest.php b/typo3/sysext/core/Tests/Unit/Database/Platform/PlatformInformationTest.php
index 0ad587f0a7fe75f4781d3cbc6051febbb33bb10e..8ec70f9388f3195d5370ce23e41d6a88ffa2e5d4 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Platform/PlatformInformationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Platform/PlatformInformationTest.php
@@ -21,6 +21,8 @@ use Doctrine\DBAL\Platforms\AbstractPlatform;
 use Doctrine\DBAL\Platforms\MySQLPlatform;
 use Doctrine\DBAL\Platforms\PostgreSQL94Platform as PostgreSQLPlatform;
 use Doctrine\DBAL\Platforms\SqlitePlatform;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Platform\PlatformInformation;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -39,10 +41,10 @@ final class PlatformInformationTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @param class-string<AbstractPlatform> $platform
-     * @dataProvider platformDataProvider
      */
+    #[DataProvider('platformDataProvider')]
+    #[Test]
     public function maxBindParameters(string $platform): void
     {
         $platformMock = $this->createMock($platform);
@@ -50,19 +52,17 @@ final class PlatformInformationTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @param class-string<AbstractPlatform> $platform
-     * @dataProvider platformDataProvider
      */
+    #[DataProvider('platformDataProvider')]
+    #[Test]
     public function maxIdentifierLength(string $platform): void
     {
         $platformMock = $this->createMock($platform);
         self::assertGreaterThanOrEqual(1, PlatformInformation::getMaxIdentifierLength($platformMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function maxBindParametersWithUnknownPlatform(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -71,9 +71,7 @@ final class PlatformInformationTest extends UnitTestCase
         self::assertGreaterThanOrEqual(1, PlatformInformation::getMaxBindParameters($platformMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function maxIdentifierLengthWithUnknownPlatform(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/BulkInsertTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/BulkInsertTest.php
index 39262912ad62c195e1c4080d7c42981b3a1da890..383ce92540a1d03b279bd49c052bb95ee667bd34 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/BulkInsertTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/BulkInsertTest.php
@@ -18,6 +18,7 @@ declare(strict_types=1);
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query;
 
 use Doctrine\DBAL\Platforms\AbstractPlatform;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\Query\BulkInsertQuery;
 use TYPO3\CMS\Core\Tests\Unit\Database\Mocks\MockPlatform;
@@ -50,9 +51,7 @@ final class BulkInsertTest extends UnitTestCase
             ->willReturn(new MockPlatform());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSQLWithoutSpecifiedValuesThrowsException(): void
     {
         $this->expectException(\LogicException::class);
@@ -63,9 +62,7 @@ final class BulkInsertTest extends UnitTestCase
         $query->getSQL();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function insertWithoutColumnAndTypeSpecification(): void
     {
         $query = new BulkInsertQuery($this->connection, $this->testTable);
@@ -88,9 +85,7 @@ final class BulkInsertTest extends UnitTestCase
         self::assertSame([], $query->getParameterTypes());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function singleInsertWithoutColumnSpecification(): void
     {
         $query = new BulkInsertQuery($this->connection, $this->testTable);
@@ -113,9 +108,7 @@ final class BulkInsertTest extends UnitTestCase
         self::assertSame([null, Connection::PARAM_INT, Connection::PARAM_BOOL], $query->getParameterTypes());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function multiInsertWithoutColumnSpecification(): void
     {
         $query = new BulkInsertQuery($this->connection, $this->testTable);
@@ -156,9 +149,7 @@ final class BulkInsertTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function singleInsertWithColumnSpecificationAndPositionalTypeValues(): void
     {
         $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
@@ -178,9 +169,7 @@ final class BulkInsertTest extends UnitTestCase
         self::assertSame([null, Connection::PARAM_BOOL], $query->getParameterTypes());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function singleInsertWithColumnSpecificationAndNamedTypeValues(): void
     {
         $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
@@ -200,9 +189,7 @@ final class BulkInsertTest extends UnitTestCase
         self::assertSame([null, Connection::PARAM_INT], $query->getParameterTypes());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function singleInsertWithColumnSpecificationAndMixedTypeValues(): void
     {
         $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
@@ -222,9 +209,7 @@ final class BulkInsertTest extends UnitTestCase
         self::assertSame([Connection::PARAM_INT, Connection::PARAM_BOOL], $query->getParameterTypes());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function multiInsertWithColumnSpecification(): void
     {
         $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
@@ -271,9 +256,7 @@ final class BulkInsertTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emptyInsertWithColumnSpecificationThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -283,9 +266,7 @@ final class BulkInsertTest extends UnitTestCase
         $query->addValues([]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function insertWithColumnSpecificationAndMultipleValuesForColumnThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -295,9 +276,7 @@ final class BulkInsertTest extends UnitTestCase
         $query->addValues(['bar', 'baz', 'baz' => 666]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function insertWithColumnSpecificationAndMultipleTypesForColumnThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php
index 65db7019b7394c61a70627bcbd0e9759c02e4de1..48c6caae446a757fe79690b58316e88eda434824 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Expression/ExpressionBuilderTest.php
@@ -18,6 +18,8 @@ declare(strict_types=1);
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Expression;
 
 use Doctrine\DBAL\Platforms\TrimMode;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression;
@@ -40,9 +42,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject = new ExpressionBuilder($this->connectionMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function andXReturnType(): void
     {
         $result = $this->subject->and('"uid" = 1', '"pid" = 0');
@@ -51,9 +51,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame(CompositeExpression::TYPE_AND, $result->getType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function orXReturnType(): void
     {
         $result = $this->subject->or('"uid" = 1', '"uid" = 7');
@@ -62,9 +60,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame(CompositeExpression::TYPE_OR, $result->getType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function eqQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -73,9 +69,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField = 1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function neqQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -84,9 +78,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField <> 1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ltQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -95,9 +87,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField < 1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function lteQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -106,9 +96,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField <= 1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function gtQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -117,9 +105,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField > 1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function gteQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -128,9 +114,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField >= 1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isNullQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -139,9 +123,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField IS NULL', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isNotNullQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -150,9 +132,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField IS NOT NULL', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function likeQuotesIdentifier(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -166,9 +146,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame("aField LIKE 'aValue%' ESCAPE \"\\\"", $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notLikeQuotesIdentifier(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -182,9 +160,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame("aField NOT LIKE 'aValue%' ESCAPE \"\\\"", $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inWithStringQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -193,9 +169,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField IN (1,2,3)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inWithArrayQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -204,9 +178,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField IN (1, 2, 3)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInWithStringQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -215,9 +187,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField NOT IN (1,2,3)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInWithArrayQuotesIdentifier(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')->willReturnArgument(0);
@@ -226,9 +196,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('aField NOT IN (1, 2, 3)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetThrowsExceptionWithEmptyValue(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -236,9 +204,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->inSet('aField', '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetThrowsExceptionWithInvalidValue(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -246,9 +212,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->inSet('aField', 'an,Invalid,Value');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetForMySQL(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -265,9 +229,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('FIND_IN_SET(\'1\', `aField`)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetForPostgreSQL(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -296,9 +258,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('\'1\' = ANY(string_to_array("aField"::text, \',\'))', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetForPostgreSQLWithColumn(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -316,9 +276,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('"testtable"."uid"::text = ANY(string_to_array("aField"::text, \',\'))', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetForSQLite(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -349,9 +307,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('instr(\',\'||"aField"||\',\', \'%,1,%\')', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetForSQLiteWithQuoteCharactersInValue(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -381,9 +337,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('instr(\',\'||"aField"||\',\', \',\'\'Some\'\'Value,\')', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetForSQLiteThrowsExceptionOnPositionalPlaceholder(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -398,9 +352,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->inSet('aField', '?');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function inSetForSQLiteThrowsExceptionOnNamedPlaceholder(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -415,9 +367,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->inSet('aField', ':dcValue1');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetThrowsExceptionWithEmptyValue(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -425,9 +375,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->notInSet('aField', '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetThrowsExceptionWithInvalidValue(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -435,9 +383,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->notInSet('aField', 'an,Invalid,Value');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetForMySQL(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -454,9 +400,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('NOT FIND_IN_SET(\'1\', `aField`)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetForPostgreSQL(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -485,9 +429,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('\'1\' <> ALL(string_to_array("aField"::text, \',\'))', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetForPostgreSQLWithColumn(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -505,9 +447,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('"testtable"."uid"::text <> ALL(string_to_array("aField"::text, \',\'))', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetForSQLite(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -537,9 +477,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('instr(\',\'||"aField"||\',\', \'%,1,%\') = 0', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetForSQLiteWithQuoteCharactersInValue(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -569,9 +507,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('instr(\',\'||"aField"||\',\', \',\'\'Some\'\'Value,\') = 0', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetForSQLiteThrowsExceptionOnPositionalPlaceholder(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -586,9 +522,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->notInSet('aField', '?');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notInSetForSQLiteThrowsExceptionOnNamedPlaceholder(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -603,9 +537,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         $this->subject->inSet('aField', ':dcValue1');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultBitwiseAnd(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -619,9 +551,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('"aField" & 1', $this->subject->bitAnd('aField', 1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function bitwiseAndForOracle(): void
     {
         $databasePlatform = $this->createMock(MockPlatform::class);
@@ -636,9 +566,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         self::assertSame('BITAND("aField", 1)', $this->subject->bitAnd('aField', 1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function maxQuotesIdentifier(): void
     {
         $this->connectionMock->method('quoteIdentifier')->willReturnCallback(static function (string $identifier): string {
@@ -652,9 +580,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function minQuotesIdentifier(): void
     {
         $this->connectionMock->method('quoteIdentifier')->willReturnCallback(static function (string $identifier): string {
@@ -668,9 +594,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sumQuotesIdentifier(): void
     {
         $this->connectionMock->method('quoteIdentifier')->willReturnCallback(static function (string $identifier): string {
@@ -684,9 +608,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function avgQuotesIdentifier(): void
     {
         $this->connectionMock->method('quoteIdentifier')->willReturnCallback(static function (string $identifier): string {
@@ -700,9 +622,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countQuotesIdentifier(): void
     {
         $this->connectionMock->method('quoteIdentifier')->willReturnCallback(static function (string $identifier): string {
@@ -716,9 +636,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function lengthQuotesIdentifier(): void
     {
         $this->connectionMock->method('quoteIdentifier')->willReturnCallback(static function (string $identifier): string {
@@ -732,9 +650,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function trimQuotesIdentifierWithDefaultValues(): void
     {
         $platform = new MockPlatform();
@@ -778,10 +694,8 @@ final class ExpressionBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider trimQuotesIdentifierDataProvider
-     */
+    #[DataProvider('trimQuotesIdentifierDataProvider')]
+    #[Test]
     public function trimQuotesIdentifier(int $position, string $char, string $expected): void
     {
         $platform = new MockPlatform();
@@ -804,9 +718,7 @@ final class ExpressionBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function literalQuotesValue(): void
     {
         $this->connectionMock->expects(self::atLeastOnce())->method('quote')->with('aField', Connection::PARAM_STR)
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/QueryBuilderTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/QueryBuilderTest.php
index 3e154013fad8e8fd398702df91691be0307adf04..1e49dafbc7debe0b3fbda7da5f0772ce843da94a 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/QueryBuilderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/QueryBuilderTest.php
@@ -24,6 +24,8 @@ use Doctrine\DBAL\Platforms\PostgreSQL94Platform as PostgreSQLPlatform;
 use Doctrine\DBAL\Platforms\SqlitePlatform;
 use Doctrine\DBAL\Query\QueryBuilder as DoctrineQueryBuilder;
 use Doctrine\DBAL\Result;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder;
@@ -57,9 +59,7 @@ final class QueryBuilderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function exprReturnsExpressionBuilderForConnection(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('getExpressionBuilder')
@@ -67,9 +67,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->expr();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTypeDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getType')
@@ -77,9 +75,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getType();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStateDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getState')
@@ -87,9 +83,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getState();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSQLDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getSQL')
@@ -99,9 +93,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getSQL();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setParameterDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('setParameter')->with('aField', 5, self::anything())
@@ -109,9 +101,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->setParameter('aField', 5);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setParametersDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('setParameters')->with(['aField' => 'aValue'], [])
@@ -119,9 +109,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->setParameters(['aField' => 'aValue']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParametersDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getParameters')
@@ -129,9 +117,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getParameters();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParameterDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getParameter')->with('aField')
@@ -139,18 +125,14 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getParameter('aField');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParameterTypesDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getParameterTypes')->willReturn([]);
         $this->subject->getParameterTypes();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParameterTypeDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getParameterType')->with('aField')
@@ -158,9 +140,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getParameterType('aField');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setFirstResultDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('setFirstResult')->with(self::anything())
@@ -168,18 +148,14 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->setFirstResult(1);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFirstResultDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getFirstResult')->willReturn(1);
         $this->subject->getFirstResult();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setMaxResultsDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('setMaxResults')->with(self::anything())
@@ -187,18 +163,14 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->setMaxResults(1);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMaxResultsDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getMaxResults')->willReturn(1);
         $this->subject->getMaxResults();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('add')->with('select', 'aField', self::anything())
@@ -206,9 +178,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->add('select', 'aField');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countBuildsExpressionAndCallsSelect(): void
     {
         $this->connection->method('getDatabasePlatform')->willReturn(new MockPlatform());
@@ -217,9 +187,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->count('*');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function selectQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $series = [
@@ -295,10 +263,8 @@ final class QueryBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider quoteIdentifiersForSelectDataProvider
-     */
+    #[DataProvider('quoteIdentifiersForSelectDataProvider')]
+    #[Test]
     public function quoteIdentifiersForSelect(string $identifier, string $expectedResult): void
     {
         $this->connection->method('quoteIdentifier')->willReturnCallback(
@@ -309,9 +275,7 @@ final class QueryBuilderTest extends UnitTestCase
         self::assertSame([$expectedResult], $this->subject->quoteIdentifiersForSelect([$identifier]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function quoteIdentifiersForSelectWithInvalidAlias(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -324,9 +288,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->quoteIdentifiersForSelect(['aField AS anotherField,someField AS someThing']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function selectDoesNotQuoteStarPlaceholder(): void
     {
         $this->connection->expects(self::never())->method('quoteIdentifier')->with('*');
@@ -335,9 +297,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->select('*');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addSelectQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $series = [
@@ -355,9 +315,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->addSelect('aField', 'anotherField');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addSelectDoesNotQuoteStarPlaceholder(): void
     {
         $this->connection->expects(self::never())->method('quoteIdentifier')->with('*');
@@ -366,9 +324,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->addSelect('*');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function selectLiteralDirectlyDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::never())->method('quoteIdentifier')->with(self::anything());
@@ -377,9 +333,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->selectLiteral('MAX(aField) AS anAlias');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addSelectLiteralDirectlyDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::never())->method('quoteIdentifier')->with(self::anything());
@@ -389,9 +343,9 @@ final class QueryBuilderTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @todo: Test with alias
      */
+    #[Test]
     public function deleteQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aTable')
@@ -401,9 +355,9 @@ final class QueryBuilderTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @todo: Test with alias
      */
+    #[Test]
     public function updateQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aTable')
@@ -412,9 +366,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->update('aTable');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function insertQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aTable')
@@ -424,9 +376,9 @@ final class QueryBuilderTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @todo: Test with alias
      */
+    #[Test]
     public function fromQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aTable')
@@ -435,9 +387,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->from('aTable');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function joinQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $series = [
@@ -456,9 +406,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->join('fromAlias', 'join', 'alias');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function innerJoinQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $series = [
@@ -477,9 +425,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->innerJoin('fromAlias', 'join', 'alias');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function leftJoinQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $series = [
@@ -500,9 +446,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->leftJoin('fromAlias', 'join', 'alias');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rightJoinQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $series = [
@@ -524,9 +468,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->rightJoin('fromAlias', 'join', 'alias');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')
@@ -538,9 +480,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->set('aField', 'aValue');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setWithoutNamedParameterQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')
@@ -551,9 +491,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->set('aField', 'aValue', false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function whereDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('where')->with('uid=1', 'type=9')
@@ -561,9 +499,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->where('uid=1', 'type=9');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function andWhereDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('andWhere')->with('uid=1', 'type=9')
@@ -571,9 +507,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->andWhere('uid=1', 'type=9');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function orWhereDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('orWhere')->with('uid=1', 'type=9')
@@ -581,9 +515,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->orWhere('uid=1', 'type=9');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function groupByQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifiers')->with(['aField', 'anotherField'])
@@ -593,9 +525,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->groupBy('aField', 'anotherField');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addGroupByQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifiers')->with(['aField', 'anotherField'])
@@ -605,9 +535,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->addGroupBy('aField', 'anotherField');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')
@@ -619,9 +547,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->setValue('aField', 'aValue');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueWithoutNamedParameterQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')
@@ -631,9 +557,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->setValue('aField', 'aValue', false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function valuesQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteColumnValuePairs')
@@ -653,9 +577,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->values(['aField' => 1, 'aValue' => 2]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function valuesWithoutNamedParametersQuotesIdentifiersAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteColumnValuePairs')
@@ -665,9 +587,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->values(['aField' => 1, 'aValue' => 2], false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function havingDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('having')->with('uid=1', 'type=9')
@@ -675,9 +595,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->having('uid=1', 'type=9');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function andHavingDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('andHaving')->with('uid=1', 'type=9')
@@ -685,9 +603,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->andHaving('uid=1', 'type=9');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function orHavingDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('orHaving')->with('uid=1', 'type=9')
@@ -695,9 +611,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->orHaving('uid=1', 'type=9');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function orderByQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')
@@ -707,9 +621,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->orderBy('aField');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addOrderByQuotesIdentifierAndDelegatesToConcreteQueryBuilder(): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')
@@ -719,9 +631,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->addOrderBy('aField', 'DESC');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getQueryPartDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getQueryPart')->with('from')
@@ -729,9 +639,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getQueryPart('from');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getQueryPartsDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('getQueryParts')
@@ -739,9 +647,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->getQueryParts();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resetQueryPartsDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('resetQueryParts')->with(['select', 'from'])
@@ -749,9 +655,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->resetQueryParts(['select', 'from']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resetQueryPartDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('resetQueryPart')->with('select')
@@ -759,9 +663,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->resetQueryPart('select');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createNamedParameterDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('createNamedParameter')
@@ -769,9 +671,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->createNamedParameter(5);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createPositionalParameterDelegatesToConcreteQueryBuilder(): void
     {
         $this->concreteQueryBuilder->expects(self::atLeastOnce())->method('createPositionalParameter')
@@ -779,9 +679,7 @@ final class QueryBuilderTest extends UnitTestCase
         $this->subject->createPositionalParameter(5);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function queryRestrictionsAreAddedForSelectOnExecuteQuery(): void
     {
         $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -824,9 +722,7 @@ final class QueryBuilderTest extends UnitTestCase
         $subject->executeQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function queryRestrictionsAreAddedForCountOnExecuteQuery(): void
     {
         $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -869,9 +765,7 @@ final class QueryBuilderTest extends UnitTestCase
         $subject->executeQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function queryRestrictionsAreReevaluatedOnSettingsChangeForGetSQL(): void
     {
         $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -915,9 +809,7 @@ final class QueryBuilderTest extends UnitTestCase
         self::assertSame($expectedSQL, $subject->getSQL());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function queryRestrictionsAreReevaluatedOnSettingsChangeForExecuteQuery(): void
     {
         $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -974,9 +866,7 @@ final class QueryBuilderTest extends UnitTestCase
         $subject->executeQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getQueriedTablesReturnsSameTableTwiceForInnerJoin(): void
     {
         $this->connection->method('getDatabasePlatform')->willReturn(new MockPlatform());
@@ -1036,7 +926,7 @@ final class QueryBuilderTest extends UnitTestCase
                 'expected' => 'anIdentifier',
             ],
             'postgres' => [
-                'platform' => PostgreSqlPlatform::class,
+                'platform' => PostgreSQLPlatform::class,
                 'quoteChar' => '"',
                 'input' => '"anIdentifier"',
                 'expected' => 'anIdentifier',
@@ -1044,10 +934,8 @@ final class QueryBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider unquoteSingleIdentifierUnquotesCorrectlyOnDifferentPlatformsDataProvider
-     */
+    #[DataProvider('unquoteSingleIdentifierUnquotesCorrectlyOnDifferentPlatformsDataProvider')]
+    #[Test]
     public function unquoteSingleIdentifierUnquotesCorrectlyOnDifferentPlatforms(string $platform, string $quoteChar, string $input, string $expected): void
     {
         $connectionMock = $this->createMock(Connection::class);
@@ -1059,18 +947,14 @@ final class QueryBuilderTest extends UnitTestCase
         self::assertEquals($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cloningQueryBuilderClonesConcreteQueryBuilder(): void
     {
         $clonedQueryBuilder = clone $this->subject;
         self::assertNotSame($this->subject->getConcreteQueryBuilder(), $clonedQueryBuilder->getConcreteQueryBuilder());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function changingClonedQueryBuilderDoesNotInfluenceSourceOne(): void
     {
         $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -1128,9 +1012,7 @@ final class QueryBuilderTest extends UnitTestCase
         self::assertSame($expectedCountSQL, $clonedQueryBuilder->getSQL());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function settingRestrictionContainerWillAddAdditionalRestrictionsFromConstructor(): void
     {
         $restrictionClass = get_class($this->createMock(QueryRestrictionInterface::class));
@@ -1149,9 +1031,7 @@ final class QueryBuilderTest extends UnitTestCase
         $queryBuilder->setRestrictions($container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function settingRestrictionContainerWillAddAdditionalRestrictionsFromConfiguration(): void
     {
         $restrictionClass = get_class($this->createMock(QueryRestrictionInterface::class));
@@ -1168,9 +1048,7 @@ final class QueryBuilderTest extends UnitTestCase
         $queryBuilder->setRestrictions($container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function settingRestrictionContainerWillNotAddAdditionalRestrictionsFromConfigurationIfNotDisabled(): void
     {
         $restrictionClass = get_class($this->createMock(QueryRestrictionInterface::class));
@@ -1187,9 +1065,7 @@ final class QueryBuilderTest extends UnitTestCase
         $queryBuilder->setRestrictions($container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resettingToDefaultRestrictionContainerWillAddAdditionalRestrictionsFromConfiguration(): void
     {
         $restrictionClass = get_class($this->createMock(QueryRestrictionInterface::class));
@@ -1210,10 +1086,10 @@ final class QueryBuilderTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider createNamedParameterInput
      * @param mixed $input
      */
+    #[DataProvider('createNamedParameterInput')]
+    #[Test]
     public function setWithNamedParameterPassesGivenTypeToCreateNamedParameter($input, int $type): void
     {
         $this->connection->method('quoteIdentifier')->with('aField')
@@ -1255,7 +1131,7 @@ final class QueryBuilderTest extends UnitTestCase
                 'CONVERT(aField, CHAR)',
             ],
             'Test cast for PostgreSqlPlatform' => [
-                new PostgreSqlPlatform(),
+                new PostgreSQLPlatform(),
                 'aField::text',
             ],
             'Test cast for SqlitePlatform' => [
@@ -1269,10 +1145,8 @@ final class QueryBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider castFieldToTextTypeDataProvider
-     */
+    #[DataProvider('castFieldToTextTypeDataProvider')]
+    #[Test]
     public function castFieldToTextType(AbstractPlatform $platform, string $expectation): void
     {
         $this->connection->expects(self::atLeastOnce())->method('quoteIdentifier')->with('aField')
@@ -1288,9 +1162,7 @@ final class QueryBuilderTest extends UnitTestCase
         self::assertSame($expectation, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function limitRestrictionsToTablesLimitsRestrictionsInTheContainerToTheGivenTables(): void
     {
         $GLOBALS['TCA']['tt_content']['ctrl'] = $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -1337,9 +1209,7 @@ final class QueryBuilderTest extends UnitTestCase
         $subject->executeQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function restrictionsCanStillBeRemovedAfterTheyHaveBeenLimitedToTables(): void
     {
         $GLOBALS['TCA']['tt_content']['ctrl'] = $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -1387,9 +1257,7 @@ final class QueryBuilderTest extends UnitTestCase
         $subject->executeQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function restrictionsAreAppliedInJoinConditionForLeftJoins(): void
     {
         $GLOBALS['TCA']['tt_content']['ctrl'] = $GLOBALS['TCA']['pages']['ctrl'] = [
@@ -1435,9 +1303,7 @@ final class QueryBuilderTest extends UnitTestCase
         $subject->executeQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function restrictionsAreAppliedInJoinConditionForRightJoins(): void
     {
         $GLOBALS['TCA']['tt_content']['ctrl'] = $GLOBALS['TCA']['pages']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/QueryHelperTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/QueryHelperTest.php
index 547bebc20921b60f81f70f9be383aed1eb43ceea..c268242796324b02c466551c9d6d4176e9faf808 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/QueryHelperTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/QueryHelperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\Query\QueryHelper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -46,10 +48,8 @@ final class QueryHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider stripLogicalOperatorPrefixDataProvider
-     */
+    #[DataProvider('stripLogicalOperatorPrefixDataProvider')]
+    #[Test]
     public function stripLogicalOperatorPrefixRemovesConstraintPrefixes(string $input, string $expectedSql): void
     {
         self::assertSame($expectedSql, QueryHelper::stripLogicalOperatorPrefix($input));
@@ -128,10 +128,8 @@ final class QueryHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider parseOrderByDataProvider
-     */
+    #[DataProvider('parseOrderByDataProvider')]
+    #[Test]
     public function parseOrderByTest(string $input, array $expectedResult): void
     {
         self::assertSame($expectedResult, QueryHelper::parseOrderBy($input));
@@ -200,10 +198,8 @@ final class QueryHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider parseTableListDataProvider
-     */
+    #[DataProvider('parseTableListDataProvider')]
+    #[Test]
     public function parseTableListTest(string $input, array $expectedResult): void
     {
         self::assertSame($expectedResult, QueryHelper::parseTableList($input));
@@ -246,10 +242,8 @@ final class QueryHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider parseGroupByDataProvider
-     */
+    #[DataProvider('parseGroupByDataProvider')]
+    #[Test]
     public function parseGroupByTest(string $input, array $expectedResult): void
     {
         self::assertSame($expectedResult, QueryHelper::parseGroupBy($input));
@@ -416,10 +410,8 @@ final class QueryHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider parseJoinDataProvider
-     */
+    #[DataProvider('parseJoinDataProvider')]
+    #[Test]
     public function parseJoinSplitsStatement(string $input, array $expected): void
     {
         self::assertSame($expected, QueryHelper::parseJoin($input));
@@ -450,10 +442,8 @@ final class QueryHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider quoteDatabaseIdentifierDataProvider
-     */
+    #[DataProvider('quoteDatabaseIdentifierDataProvider')]
+    #[Test]
     public function quoteDatabaseIdentifiers(string $input, string $expected): void
     {
         $connectionMock = $this->createMock(Connection::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/AbstractRestrictionContainerTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/AbstractRestrictionContainerTest.php
index a3d60dd8e242332285fde3a7b329eb558b8f3710..e2bf7c4a4c2c8bba70c7da52f893198214711167 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/AbstractRestrictionContainerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/AbstractRestrictionContainerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression;
 use TYPO3\CMS\Core\Tests\Unit\Database\Mocks\InstantiatableAbstractRestrictionContainer;
 use TYPO3\CMS\Core\Tests\Unit\Database\Mocks\MockEnforceableQueryRestriction;
@@ -24,9 +25,7 @@ use TYPO3\CMS\Core\Tests\Unit\Database\Mocks\MockQueryRestriction;
 
 final class AbstractRestrictionContainerTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function enforceableRestrictionsAreKeptWhenRemoveAllIsCalled(): void
     {
         $restriction = $this->createMock(MockEnforceableQueryRestriction::class);
@@ -42,9 +41,7 @@ final class AbstractRestrictionContainerTest extends AbstractRestrictionTestCase
         self::assertSame('"aTable"."pid" = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enforceableRestrictionsWillBeRemovedWhenRemovedByType(): void
     {
         $restriction = $this->createMock(MockEnforceableQueryRestriction::class);
@@ -59,9 +56,7 @@ final class AbstractRestrictionContainerTest extends AbstractRestrictionTestCase
         self::assertSame('', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enforceableRestrictionsWillBeRemovedWhenRemovedByTypeAndRemovedAllIsAdditionallyCalled(): void
     {
         $restriction = $this->createMock(MockEnforceableQueryRestriction::class);
@@ -77,9 +72,7 @@ final class AbstractRestrictionContainerTest extends AbstractRestrictionTestCase
         self::assertSame('', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notEnforceableRestrictionsAreRemovedWhenRemoveAllIsCalled(): void
     {
         $restriction = $this->createMock(MockQueryRestriction::class);
@@ -93,9 +86,7 @@ final class AbstractRestrictionContainerTest extends AbstractRestrictionTestCase
         self::assertSame('', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enforceableRestrictionsThatDeclareThemselvesNonStickyAreRemovedWhenRemoveAllIsCalled(): void
     {
         $restriction = $this->createMock(MockEnforceableQueryRestriction::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DefaultRestrictionContainerTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DefaultRestrictionContainerTest.php
index 76b01f0738534049db99f31aff02d77ed123ce7e..16a4b497bd445626694e4047fa670cc3379cab81 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DefaultRestrictionContainerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DefaultRestrictionContainerTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer;
 
 final class DefaultRestrictionContainerTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsAllDefaultRestrictions(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DeletedRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DeletedRestrictionTest.php
index db1b2f2fcb182ab73a473adf6841d4154ea93d3a..f2f9ef7b962082bf96771b018845a594d9d6490d 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DeletedRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DeletedRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 
 final class DeletedRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsDeletedWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DocumentTypeExclusionRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DocumentTypeExclusionRestrictionTest.php
index 07d9f5f964a208550a44fe4fc6c9f518be4e011f..8e133acdff74e9fdeafc2c19a8f5003db400135f 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DocumentTypeExclusionRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/DocumentTypeExclusionRestrictionTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\DocumentTypeExclusionRestriction;
 
 final class DocumentTypeExclusionRestrictionTest extends AbstractRestrictionTestCase
@@ -39,11 +41,8 @@ final class DocumentTypeExclusionRestrictionTest extends AbstractRestrictionTest
         ];
     }
 
-    /**
-     * @test
-     *
-     * @dataProvider buildRestrictionsAddsDoktypeWhereClauseDataProvider
-     */
+    #[DataProvider('buildRestrictionsAddsDoktypeWhereClauseDataProvider')]
+    #[Test]
     public function buildRestrictionsAddsDoktypeWhereClause($excludedDocumentTypes, string $expected): void
     {
         $subject = new DocumentTypeExclusionRestriction($excludedDocumentTypes);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/EndTimeRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/EndTimeRestrictionTest.php
index d87b28f8424adffee33884a8cee8ab4d74197bd1..98d18c9b90e1d2da9b6623a7c5bb534d4aa9197e 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/EndTimeRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/EndTimeRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\EndTimeRestriction;
 
 final class EndTimeRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsThrowsExceptionInStartTimeIfGlobalsAccessTimeIsMissing(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -40,9 +39,7 @@ final class EndTimeRestrictionTest extends AbstractRestrictionTestCase
         $subject->buildExpression(['aTable' => 'aTable'], $this->expressionBuilder);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsStartTimeWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendGroupRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendGroupRestrictionTest.php
index fb22b15f4eeb3b75e9a8439b3a550c936b7d8d59..e6af823c2fda5d040cc503ddb593f45a6ceb3b83 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendGroupRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendGroupRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\FrontendGroupRestriction;
 
 final class FrontendGroupRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsNoAccessGroupWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -36,9 +35,7 @@ final class FrontendGroupRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(("aTable"."myGroupField" IS NULL) OR ("aTable"."myGroupField" = \'\') OR ("aTable"."myGroupField" = \'0\'))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsGroupWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendRestrictionContainerTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendRestrictionContainerTest.php
index fa13e5bf724aaf28ae2f23e7927d920a334710af..89b1e31569d2d769fdf9c3b021c96cd89c3a770a 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendRestrictionContainerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/FrontendRestrictionContainerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Context\UserAspect;
 use TYPO3\CMS\Core\Context\VisibilityAspect;
@@ -135,10 +137,8 @@ final class FrontendRestrictionContainerTest extends AbstractRestrictionTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider frontendStatesDataProvider
-     */
+    #[DataProvider('frontendStatesDataProvider')]
+    #[Test]
     public function buildExpressionAddsCorrectClause(
         string $tableName,
         string $tableAlias,
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/HiddenRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/HiddenRestrictionTest.php
index fbf773f59879de2a610c917476cb28c3d44fe890..fe6f98c88909cefd0775003c7c654c30eda4f87c 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/HiddenRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/HiddenRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
 
 final class HiddenRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsHiddenWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/LimitToTablesRestrictionContainerTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/LimitToTablesRestrictionContainerTest.php
index 246486f2f60c5e367e23b00ee464fd3ec65415df..8aad415e233c18e55ee67aa4557c622493339746 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/LimitToTablesRestrictionContainerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/LimitToTablesRestrictionContainerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\DefaultRestrictionContainer;
 use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;
@@ -25,9 +26,7 @@ use TYPO3\CMS\Core\Database\Query\Restriction\QueryRestrictionContainerInterface
 
 final class LimitToTablesRestrictionContainerTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsRestrictionsOnlyToGivenAlias(): void
     {
         $GLOBALS['TCA']['bTable']['ctrl']['enablecolumns']['disabled'] = 'hidden';
@@ -38,9 +37,7 @@ final class LimitToTablesRestrictionContainerTest extends AbstractRestrictionTes
         self::assertSame('"bt"."hidden" = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsRestrictionsOfDefaultRestrictionContainerOnlyToGivenAlias(): void
     {
         $GLOBALS['TCA']['bTable']['ctrl']['enablecolumns']['disabled'] = 'hidden';
@@ -52,9 +49,7 @@ final class LimitToTablesRestrictionContainerTest extends AbstractRestrictionTes
         self::assertSame('(("bt"."deleted" = 0) AND ("bt"."hidden" = 0))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByTypeRemovesRestrictionsByTypeAlsoFromDefaultRestrictionContainer(): void
     {
         $GLOBALS['TCA']['bTable']['ctrl']['enablecolumns']['disabled'] = 'hidden';
@@ -67,9 +62,7 @@ final class LimitToTablesRestrictionContainerTest extends AbstractRestrictionTes
         self::assertSame('"bt"."hidden" = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByTypeRemovesRestrictionsByTypeAlsoFromAnyRestrictionContainer(): void
     {
         $GLOBALS['TCA']['bTable']['ctrl']['enablecolumns']['disabled'] = 'hidden';
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PageIdListRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PageIdListRestrictionTest.php
index 3e2962022939299d4b35a9b4654d32e93972c62d..81dccdaf4bdee706af420f69da0c6d5a9b0fe842 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PageIdListRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PageIdListRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\PageIdListRestriction;
 
 final class PageIdListRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsPidWhereClause(): void
     {
         $subject = new PageIdListRestriction([], [0]);
@@ -31,9 +30,7 @@ final class PageIdListRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTable"."pid" IN (0)', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsAliasedPidWhereClause(): void
     {
         $subject = new PageIdListRestriction([], [13, 14]);
@@ -41,9 +38,7 @@ final class PageIdListRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTableAlias"."pid" IN (13, 14)', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsPidWhereClauseIfTableIsSpecified(): void
     {
         $subject = new PageIdListRestriction(['aTable'], [13, 14]);
@@ -51,9 +46,7 @@ final class PageIdListRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTable"."pid" IN (13, 14)', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsAliasedPidWhereClauseIfAliasIsSpecified(): void
     {
         $subject = new PageIdListRestriction(['aTableAlias'], [13, 14]);
@@ -61,9 +54,7 @@ final class PageIdListRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTableAlias"."pid" IN (13, 14)', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsConvertsToIntegers(): void
     {
         $subject = new PageIdListRestriction(['aTableAlias'], ['13', '14']);
@@ -71,9 +62,7 @@ final class PageIdListRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTableAlias"."pid" IN (13, 14)', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsSkipsUnrestrictedTablesIfOtherTableIsSpecifiedThanUsedInTheQuery(): void
     {
         $subject = new PageIdListRestriction(['aTable'], [13, 14]);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PagePermissionRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PagePermissionRestrictionTest.php
index dec15deb31c3ee722cf458ba7f77cb1ccf12c1d7..7da4877082b80729f313e6ba75ae63db917d7991 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PagePermissionRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/PagePermissionRestrictionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\UserAspect;
 use TYPO3\CMS\Core\Database\Query\Restriction\PagePermissionRestriction;
 use TYPO3\CMS\Core\Type\Bitmask\Permission;
@@ -62,9 +63,7 @@ final class PagePermissionRestrictionTest extends AbstractRestrictionTestCase
         };
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsOnlyWorksOnPagesTable(): void
     {
         $aspect = $this->getPreparedUserAspect(true, false, 2, [13]);
@@ -75,9 +74,7 @@ final class PagePermissionRestrictionTest extends AbstractRestrictionTestCase
         self::assertEmpty((string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsReturnsAZeroReturnSetWhenNotLoggedIn(): void
     {
         $aspect = $this->getPreparedUserAspect(false, false, 2, [13]);
@@ -86,9 +83,7 @@ final class PagePermissionRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('1 = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsIsSkippedForAdmins(): void
     {
         $aspect = $this->getPreparedUserAspect(true, true, 2, [13]);
@@ -97,9 +92,7 @@ final class PagePermissionRestrictionTest extends AbstractRestrictionTestCase
         self::assertEmpty((string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsContainsNonAdminUserIdAsOwnerAndGroupIdsAsOwnerGroup(): void
     {
         $aspect = $this->getPreparedUserAspect(true, false, 2, [13, 14, 15, 16]);
@@ -108,9 +101,7 @@ final class PagePermissionRestrictionTest extends AbstractRestrictionTestCase
         self::assertEquals('(("pages"."perms_everybody" & 1 = 1) OR ((("pages"."perms_userid" = 2) AND ("pages"."perms_user" & 1 = 1))) OR ((("pages"."perms_groupid" IN (13, 14, 15, 16)) AND ("pages"."perms_group" & 1 = 1))))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsChecksForDeletionPermission(): void
     {
         $aspect = $this->getPreparedUserAspect(true, false, 42, [13, 14, 15, 16]);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/RootLevelRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/RootLevelRestrictionTest.php
index 65259467549e0a41610dd282ed2e04f053c4aec8..20e5654047d6dfcccd53c238bc8c5794b4f7735d 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/RootLevelRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/RootLevelRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\RootLevelRestriction;
 
 final class RootLevelRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsPidWhereClause(): void
     {
         $subject = new RootLevelRestriction();
@@ -31,9 +30,7 @@ final class RootLevelRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTable"."pid" = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsAliasedPidWhereClause(): void
     {
         $subject = new RootLevelRestriction();
@@ -41,9 +38,7 @@ final class RootLevelRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTableAlias"."pid" = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsPidWhereClauseIfTableIsSpecified(): void
     {
         $subject = new RootLevelRestriction(['aTable']);
@@ -51,9 +46,7 @@ final class RootLevelRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTable"."pid" = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsAliasedPidWhereClauseIfAliasIsSpecified(): void
     {
         $subject = new RootLevelRestriction(['aTableAlias']);
@@ -61,9 +54,7 @@ final class RootLevelRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('"aTableAlias"."pid" = 0', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsSkipsUnrestrictedTablesIfOtherTableIsSpecifiedThanUsedInTheQuery(): void
     {
         $subject = new RootLevelRestriction(['aTable']);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/StartTimeRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/StartTimeRestrictionTest.php
index 97e1b55d0807aac9bcad5057d4dcd18d58b02904..ba691e934fc2c48cc1c46942e56d79ac88146a3f 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/StartTimeRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/StartTimeRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\StartTimeRestriction;
 
 final class StartTimeRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsThrowsExceptionInStartTimeIfGlobalsAccessTimeIsMissing(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -40,9 +39,7 @@ final class StartTimeRestrictionTest extends AbstractRestrictionTestCase
         $subject->buildExpression(['aTable' => 'aTable'], $this->expressionBuilder);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildRestrictionsAddsStartTimeWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/WorkspaceRestrictionTest.php b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/WorkspaceRestrictionTest.php
index 75790da9f183e898ba2103e0067172cfc0910009..c0f65c667b79900fb364edfb272d480a420f3615 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/WorkspaceRestrictionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Query/Restriction/WorkspaceRestrictionTest.php
@@ -17,13 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\WorkspaceRestriction;
 
 final class WorkspaceRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsLiveWorkspaceWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -34,9 +33,7 @@ final class WorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(("aTable"."t3ver_wsid" = 0) AND ((("aTable"."t3ver_oid" = 0) OR ("aTable"."t3ver_state" = 4))))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsNonLiveWorkspaceWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -47,9 +44,7 @@ final class WorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(("aTable"."t3ver_wsid" IN (0, 42)) AND ((("aTable"."t3ver_oid" = 0) OR ("aTable"."t3ver_state" = 4))))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsLiveWorkspaceLimitedWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -60,9 +55,7 @@ final class WorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsNonLiveWorkspaceLimitedWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -73,9 +66,7 @@ final class WorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionQueriesAllVersionedRecordsWithinAWorkspaceAsWell(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -85,9 +76,7 @@ final class WorkspaceRestrictionTest extends AbstractRestrictionTestCase
         $expression = $subject->buildExpression(['aTable' => 'aTable'], $this->expressionBuilder);
         self::assertSame('(("aTable"."t3ver_wsid" IN (0, 42)) AND ("t3ver_state" <> 2))', (string)$expression);
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionQueriesAllVersionedRecordsWithinLiveStillRemovesDeletedState(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/RelationHandlerTest.php b/typo3/sysext/core/Tests/Unit/Database/RelationHandlerTest.php
index 140883dcd2415bef7d2d812ec48b9fc6c4545fd2..a6751368ace4b88f36822dab0b168befa2229f97 100644
--- a/typo3/sysext/core/Tests/Unit/Database/RelationHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/RelationHandlerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\RelationHandler;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -33,9 +34,7 @@ final class RelationHandlerTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function purgeItemArrayReturnsFalseIfVersioningForTableIsDisabled(): void
     {
         $GLOBALS['TCA']['sys_category']['ctrl']['versioningWS'] = false;
@@ -47,9 +46,7 @@ final class RelationHandlerTest extends UnitTestCase
         self::assertFalse($this->subject->purgeItemArray(0));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function purgeItemArrayReturnsTrueIfItemsHaveBeenPurged(): void
     {
         $GLOBALS['TCA']['sys_category']['ctrl']['versioningWS'] = true;
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/ConnectionMigratorTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/ConnectionMigratorTest.php
index 70a210b1c3697b1e96a4b35b1aaeb5dedd022dff..74af9351159f8f208fd9b592b565a2c0bc34e19c 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/ConnectionMigratorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/ConnectionMigratorTest.php
@@ -23,6 +23,7 @@ use Doctrine\DBAL\Schema\SchemaDiff;
 use Doctrine\DBAL\Schema\Table;
 use Doctrine\DBAL\Schema\TableDiff;
 use Doctrine\DBAL\Types\Type;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\Platform\PlatformInformation;
@@ -54,9 +55,7 @@ final class ConnectionMigratorTest extends UnitTestCase
         $this->subject->_set('connection', $connectionMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tableNamesStickToTheMaximumCharactersWhenPrefixedForRemoval(): void
     {
         $originalSchemaDiff = new SchemaDiff([], [], [$this->getTable()]);
@@ -69,9 +68,7 @@ final class ConnectionMigratorTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnNamesStickToTheMaximumCharactersWhenPrefixedForRemoval(): void
     {
         $table = $this->getTable();
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/DefaultTcaSchemaTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/DefaultTcaSchemaTest.php
index 6f413acde3f341599ed798ff651ca05655951881..86c85ccb166ea89bc0afb4051b9694427342b1ed 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/DefaultTcaSchemaTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/DefaultTcaSchemaTest.php
@@ -24,6 +24,7 @@ use Doctrine\DBAL\Schema\Table;
 use Doctrine\DBAL\Types\IntegerType;
 use Doctrine\DBAL\Types\StringType;
 use Doctrine\DBAL\Types\Type;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\DefaultTcaSchema;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -39,18 +40,14 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         $this->defaultTable = new Table('aTable');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichKeepsGivenTablesArrayWithEmptyTca(): void
     {
         $GLOBALS['TCA'] = [];
         self::assertEquals([$this->defaultTable], $this->subject->enrich([$this->defaultTable]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichDoesNotAddColumnIfExists(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [];
@@ -70,9 +67,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->enrich($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichDoesNotAddColumnIfTableExistsMultipleTimesAndUidExists(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [];
@@ -98,9 +93,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->enrich($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsFieldToFirstTableDefinitionOfThatName(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [];
@@ -118,9 +111,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertInstanceOf(Column::class, $result[0]->getColumn('uid'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsUidAndPrimaryKey(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [];
@@ -139,9 +130,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedPrimaryKey, $result[0]->getPrimaryKey());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsPid(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [];
@@ -158,9 +147,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedPidColumn, $result[0]->getColumn('pid'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsTstamp(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -179,9 +166,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('updatedon'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsCrdate(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -200,9 +185,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('createdon'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsDeleted(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -221,9 +204,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('deleted'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsDisabled(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -244,9 +225,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('disabled'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsStarttime(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -267,9 +246,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('starttime'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsEndtime(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -290,9 +267,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('endtime'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsFegroup(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -313,9 +288,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('fe_group'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsSorting(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -334,9 +307,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('sorting'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsParentKey(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [];
@@ -345,9 +316,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedIndex, $result[0]->getIndex('parent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsParentKeyWithDelete(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -358,9 +327,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedIndex, $result[0]->getIndex('parent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsParentKeyWithDisabled(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -373,9 +340,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedIndex, $result[0]->getIndex('parent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsParentKeyInCorrectOrder(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -389,9 +354,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedIndex, $result[0]->getIndex('parent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsSysLanguageUid(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -410,9 +373,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('sys_language_uid'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsL10nParent(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -432,9 +393,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('l10n_parent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichDoesNotAddL10nParentIfLanguageFieldIsNotDefined(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -445,9 +404,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         $result[0]->getColumn('l10n_parent');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsDescription(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -465,9 +422,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('rowDescription'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsEditlock(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -486,9 +441,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('editlock'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsL10nSource(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -508,9 +461,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('l10n_source'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichDoesNotAddL10nSourceIfLanguageFieldIsNotDefined(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -521,9 +472,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         $result[0]->getColumn('l10n_source');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsL10nState(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -542,9 +491,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('l10n_state'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichDoesNotAddL10nStateIfLanguageFieldIsNotDefined(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -555,9 +502,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         $result[0]->getColumn('l10n_state');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichDoesNotAddL10nStateIfTransOrigPointerFieldIsNotDefined(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -568,9 +513,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         $result[0]->getColumn('l10n_state');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsT3origUid(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -589,9 +532,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('t3_origuid'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsL10nDiffsource(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -609,9 +550,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('l18n_diffsource'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsT3verOid(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -630,9 +569,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('t3ver_oid'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsT3verWsid(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -651,9 +588,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('t3ver_wsid'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsT3verState(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -672,9 +607,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('t3ver_state'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsT3verStage(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -693,9 +626,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedColumn, $result[0]->getColumn('t3ver_stage'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsT3verOidIndex(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -706,9 +637,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedIndex, $result[0]->getIndex('t3ver_oid'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsSimpleMmForSelect(): void
     {
         $GLOBALS['TCA']['aTable']['columns']['aField']['config'] = [
@@ -772,9 +701,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedMmTable, $result[1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsMmWithTcaHasUid(): void
     {
         $GLOBALS['TCA']['aTable']['columns']['aField']['config'] = [
@@ -848,9 +775,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedMmTable, $result[1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsMmWithTablenamesAndFieldname(): void
     {
         $GLOBALS['TCA']['aTable']['columns']['aField']['config'] = [
@@ -935,9 +860,7 @@ final class DefaultTcaSchemaTest extends UnitTestCase
         self::assertEquals($expectedMmTable, $result[1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function enrichAddsSlug(): void
     {
         $GLOBALS['TCA']['aTable']['columns']['slug'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/EventListener/SchemaColumnDefinitionListenerTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/EventListener/SchemaColumnDefinitionListenerTest.php
index 0a2891476eb952444e18f83e446f37d2398fca4c..67d3f2342a45e63e170fc51733a12b9981ca98a0 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/EventListener/SchemaColumnDefinitionListenerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/EventListener/SchemaColumnDefinitionListenerTest.php
@@ -21,6 +21,7 @@ use Doctrine\DBAL\Event\SchemaColumnDefinitionEventArgs;
 use Doctrine\DBAL\Platforms\AbstractPlatform;
 use Doctrine\DBAL\Schema\Column;
 use Doctrine\DBAL\Types\Type;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\Schema\EventListener\SchemaColumnDefinitionListener;
@@ -41,9 +42,7 @@ final class SchemaColumnDefinitionListenerTest extends UnitTestCase
         $this->connectionMock = $this->createMock(Connection::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isInactiveForStandardColumnTypes(): void
     {
         $event = new SchemaColumnDefinitionEventArgs(
@@ -58,9 +57,7 @@ final class SchemaColumnDefinitionListenerTest extends UnitTestCase
         self::assertNull($event->getColumn());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildsColumnForEnumDataType(): void
     {
         if (Type::hasType('enum')) {
@@ -86,9 +83,7 @@ final class SchemaColumnDefinitionListenerTest extends UnitTestCase
         self::assertSame(['value1', 'value2', 'value3'], $event->getColumn()->getPlatformOption('unquotedValues'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildsColumnForSetDataType(): void
     {
         if (Type::hasType('set')) {
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionAttributesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionAttributesTest.php
index bae59261946db9e783e075cc84c1e1a17feabb70..fbe9b94c98e06e533647aa62d74d37e4e7363bd6 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionAttributesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionAttributesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateColumnDefinitionItem;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\Parser;
@@ -334,10 +336,10 @@ final class ColumnDefinitionAttributesTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider canParseColumnDefinitionAttributesDataProvider
      * @param mixed $defaultValue
      */
+    #[DataProvider('canParseColumnDefinitionAttributesDataProvider')]
+    #[Test]
     public function canParseColumnDefinitionAttributes(
         string $columnAttribute,
         bool $allowNull,
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionItemTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionItemTest.php
index e34ee142a487a96b0fb67a4c5ec5c1991f04036f..2a708465a195d366c53151e3e765f75ba7a0fdc2 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionItemTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ColumnDefinitionItemTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateColumnDefinitionItem;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\Parser;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ColumnDefinitionItemTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function canParseUnquotedMysqlKeywordAsTableName(): void
     {
         $subject = $this->createSubject('CREATE TABLE `aTable`(checksum VARCHAR(64));');
@@ -42,9 +41,8 @@ final class ColumnDefinitionItemTest extends UnitTestCase
      * The old regular expression based create table parser processed invalid dump files
      * where the last column/index definition included a comma before the closing parenthesis.
      * Emulate this behaviour to avoid breaking lots of (partial) dump files.
-     *
-     * @test
      */
+    #[Test]
     public function canParseCreateDefinitionWithTrailingComma(): void
     {
         $subject = $this->createSubject('CREATE TABLE `aTable`(aField VARCHAR(64), );');
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/CreateTableFragmentTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/CreateTableFragmentTest.php
index 01a886c2ae931c9bd198c78b59bda1129bdc8bfa..e7af6294aedcfe10487495d5f479795af2678fb3 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/CreateTableFragmentTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/CreateTableFragmentTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\AbstractCreateStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\Parser;
@@ -79,10 +81,8 @@ final class CreateTableFragmentTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseCreateTableFragmentDataProvider
-     */
+    #[DataProvider('canParseCreateTableFragmentDataProvider')]
+    #[Test]
     public function canParseCreateTableFragment(string $statement, string $tableName, bool $isTemporary): void
     {
         $subject = $this->createSubject($statement);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/CharacterTypeAttributesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/CharacterTypeAttributesTest.php
index 7c63b22325f38616f146be42ed32fbeab839137b..27c0acc65b26aef1ebcab37c146cc2690526bf6f 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/CharacterTypeAttributesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/CharacterTypeAttributesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypeAttributes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
 
 /**
@@ -54,10 +56,8 @@ final class CharacterTypeAttributesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseCharacterDataTypeAttributesProvider
-     */
+    #[DataProvider('canParseCharacterDataTypeAttributesProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, array $options): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/EnumerationTypeAttributesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/EnumerationTypeAttributesTest.php
index 04695abcd9c7f3d18e79d5565cbb384a77bbd35f..f8f4c42e22438167977dda8d66a580d873373bd0 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/EnumerationTypeAttributesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/EnumerationTypeAttributesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypeAttributes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
 
 /**
@@ -46,10 +48,8 @@ final class EnumerationTypeAttributesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseEnumerationDataTypeAttributesProvider
-     */
+    #[DataProvider('canParseEnumerationDataTypeAttributesProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, array $options): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/NumericTypeAttributesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/NumericTypeAttributesTest.php
index 9253d8da5f0c83ea0969a4201d189aedbbad600b..396aa0190e05572789fb5cb67a3c6f91e3a47dec 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/NumericTypeAttributesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypeAttributes/NumericTypeAttributesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypeAttributes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
 
 /**
@@ -46,10 +48,8 @@ final class NumericTypeAttributesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseNumericDataTypeAttributesProvider
-     */
+    #[DataProvider('canParseNumericDataTypeAttributesProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, array $options): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BinaryDataTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BinaryDataTypeTest.php
index 16bec2b980859ae029a982d282bfe07611a331bd..41829dab3bca421e30c0d899e9712f36a9942d39 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BinaryDataTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BinaryDataTypeTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Exception\StatementException;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\BinaryDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\VarBinaryDataType;
@@ -52,10 +54,8 @@ final class BinaryDataTypeTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseBinaryDataTypeProvider
-     */
+    #[DataProvider('canParseBinaryDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className, int $length): void
     {
         $subject = $this->createSubject($columnDefinition);
@@ -64,9 +64,7 @@ final class BinaryDataTypeTest extends AbstractDataTypeBaseTestCase
         self::assertSame($length, $subject->dataType->getLength());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function lengthIsRequiredForVarBinaryType(): void
     {
         $this->expectException(StatementException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BitDataTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BitDataTypeTest.php
index 5715ea5e12659c02171d0e0f470a171e41eb3236..504fbd932034eee443b9ff41e05f0e2ec80f3efb 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BitDataTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BitDataTypeTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\BitDataType;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
 
@@ -44,10 +46,8 @@ final class BitDataTypeTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseBitDataTypeProvider
-     */
+    #[DataProvider('canParseBitDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className, int $length): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BlobTypesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BlobTypesTest.php
index 2613211ce68ef8e21f63c16e4c29e5a05afabeed..9c850d8d8ab034c639186a1f76268ad68ae27b7c 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BlobTypesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/BlobTypesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\BlobDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\LongBlobDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\MediumBlobDataType;
@@ -53,10 +55,8 @@ final class BlobTypesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseBlobDataTypeProvider
-     */
+    #[DataProvider('canParseBlobDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/CharDataTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/CharDataTypeTest.php
index ad0e93f86839a875e29b4797fa8985e77f1df389..6e20987e69d304232e498b7e7b1eed4a6c2c53d8 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/CharDataTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/CharDataTypeTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Exception\StatementException;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\CharDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\VarCharDataType;
@@ -52,10 +54,8 @@ final class CharDataTypeTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseBinaryDataTypeProvider
-     */
+    #[DataProvider('canParseBinaryDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className, int $length): void
     {
         $subject = $this->createSubject($columnDefinition);
@@ -64,9 +64,7 @@ final class CharDataTypeTest extends AbstractDataTypeBaseTestCase
         self::assertSame($length, $subject->dataType->getLength());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function lengthIsRequiredForVarCharType(): void
     {
         $this->expectException(StatementException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/DateTimeTypesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/DateTimeTypesTest.php
index 8e8727be37c15bbd44fef51516751a50c4570cef..df23138cccf94f5aee245e4ddf7a78c8b42e8442 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/DateTimeTypesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/DateTimeTypesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Exception\StatementException;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\DateDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\DateTimeDataType;
@@ -79,10 +81,8 @@ final class DateTimeTypesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseDateTimeTypeProvider
-     */
+    #[DataProvider('canParseDateTimeTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className, int $length = null): void
     {
         $subject = $this->createSubject($columnDefinition);
@@ -95,9 +95,7 @@ final class DateTimeTypesTest extends AbstractDataTypeBaseTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseDateTimeTypeWithInvalidLowerBound(): void
     {
         $this->expectException(StatementException::class);
@@ -107,9 +105,7 @@ final class DateTimeTypesTest extends AbstractDataTypeBaseTestCase
         $this->createSubject('TIME(-1)');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseDateTimeTypeWithInvalidUpperBound(): void
     {
         $this->expectException(StatementException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/EnumDataTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/EnumDataTypeTest.php
index 7aa41fd395eb5c19b18377a0fecb201ec2ca1c7a..2705689e3101e24bba26c7c96d9bb6aeaf11876b 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/EnumDataTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/EnumDataTypeTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\EnumDataType;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
 
@@ -49,10 +51,8 @@ final class EnumDataTypeTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseEnumDataTypeProvider
-     */
+    #[DataProvider('canParseEnumDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className, array $values): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FixedPointTypesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FixedPointTypesTest.php
index 7a76ec1b147e534bc87a953813250a400e4783b6..6e23a3ae1fede6d71d3e00f3ee7884997ca889cb 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FixedPointTypesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FixedPointTypesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\DecimalDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\NumericDataType;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
@@ -71,10 +73,8 @@ final class FixedPointTypesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseFixedPointTypesProvider
-     */
+    #[DataProvider('canParseFixedPointTypesProvider')]
+    #[Test]
     public function canParseDataType(
         string $columnDefinition,
         string $className,
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FloatingPointTypesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FloatingPointTypesTest.php
index 4b12ccaf149831107438f7c5e33b250336264d79..5507bec5ba107a4a5916a754882350ec80af0ff0 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FloatingPointTypesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/FloatingPointTypesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\DoubleDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\FloatDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\RealDataType;
@@ -90,10 +92,8 @@ final class FloatingPointTypesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseFloatingPointTypesProvider
-     */
+    #[DataProvider('canParseFloatingPointTypesProvider')]
+    #[Test]
     public function canParseDataType(
         string $columnDefinition,
         string $className,
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/IntegerTypesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/IntegerTypesTest.php
index 0acfc5370d49c1fe7a31c43cef3940b9e9eedcfe..582bf98f76ebfb1d25ac644df348c47807d32649 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/IntegerTypesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/IntegerTypesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\BigIntDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\IntegerDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\MediumIntDataType;
@@ -102,10 +104,8 @@ final class IntegerTypesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseIntegerDataTypeProvider
-     */
+    #[DataProvider('canParseIntegerDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className, int $length): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/JsonDataTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/JsonDataTypeTest.php
index 2d6a473683a7420ee5ac1d637fadfb8c5335f922..37db67b186e7d6d21b913d0b5f55398809e89b7a 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/JsonDataTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/JsonDataTypeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\JsonDataType;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
 
@@ -25,9 +26,7 @@ use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCas
  */
 final class JsonDataTypeTest extends AbstractDataTypeBaseTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function canParseBitDataType(): void
     {
         $subject = $this->createSubject('JSON');
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/SetDataTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/SetDataTypeTest.php
index eee09bc09b7d35e1081957eca6f50cbd0003a610..5f7378713c698aa0bb5a90ddb63937755164271f 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/SetDataTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/SetDataTypeTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\SetDataType;
 use TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\AbstractDataTypeBaseTestCase;
 
@@ -49,10 +51,8 @@ final class SetDataTypeTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseSetDataTypeProvider
-     */
+    #[DataProvider('canParseSetDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className, array $values): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/TextTypesTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/TextTypesTest.php
index 99ef918dd4fd9c851639c29fe2f25368de3f9661..1a2a73b2a2585df25c8c31373035e10ea9d3fc4f 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/TextTypesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/DataTypes/TextTypesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser\DataTypes;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\LongTextDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\MediumTextDataType;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\DataType\TextDataType;
@@ -53,10 +55,8 @@ final class TextTypesTest extends AbstractDataTypeBaseTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseTextDataTypeProvider
-     */
+    #[DataProvider('canParseTextDataTypeProvider')]
+    #[Test]
     public function canParseDataType(string $columnDefinition, string $className): void
     {
         $subject = $this->createSubject($columnDefinition);
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ForeignKeyDefinitionTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ForeignKeyDefinitionTest.php
index 68a54cfa49673c69d6b76be2457497a4c78519ae..deb75e3cbfffc79f7b9f7f3bf7150ca1860faedb 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ForeignKeyDefinitionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ForeignKeyDefinitionTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateForeignKeyDefinitionItem;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\Parser;
@@ -63,10 +65,8 @@ final class ForeignKeyDefinitionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseForeignKeyDefinitionDataProvider
-     */
+    #[DataProvider('canParseForeignKeyDefinitionDataProvider')]
+    #[Test]
     public function canParseForeignKeyDefinition(
         string $indexDefinition,
         string $indexName,
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/IndexDefinitionTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/IndexDefinitionTest.php
index 07a985ecd3727202c4e872a653862662ebd4b03d..e9f2923d9c8934141780d15529299505f2a7f7a3 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/IndexDefinitionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/IndexDefinitionTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateIndexDefinitionItem;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\Identifier;
@@ -515,10 +517,8 @@ final class IndexDefinitionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseIndexDefinitionDataProvider
-     */
+    #[DataProvider('canParseIndexDefinitionDataProvider')]
+    #[Test]
     public function canParseIndexDefinition(
         string $indexDefinition,
         string $indexName,
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ReferenceDefinitionTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ReferenceDefinitionTest.php
index d9bf92db056c37bc9161fae43c7c79937381089f..88aa24a36ad93696a67353de5c7f9061796af247 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ReferenceDefinitionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/ReferenceDefinitionTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\ReferenceDefinition;
 use TYPO3\CMS\Core\Database\Schema\Parser\Parser;
@@ -170,10 +172,8 @@ final class ReferenceDefinitionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseReferenceDefinitionDataProvider
-     */
+    #[DataProvider('canParseReferenceDefinitionDataProvider')]
+    #[Test]
     public function canParseReferenceDefinition(
         string $columnAttribute,
         string $table,
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableBuilderTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableBuilderTest.php
index c62634716edc7a276a6af0276edb40f3bfedc3c2..052093deb6a749f5a01c25ed0a586f80b4d3eba5 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableBuilderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableBuilderTest.php
@@ -23,6 +23,7 @@ use Doctrine\DBAL\Schema\Table;
 use Doctrine\DBAL\Types\IntegerType;
 use Doctrine\DBAL\Types\SmallIntType;
 use Doctrine\DBAL\Types\TextType;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\Parser;
 use TYPO3\CMS\Core\Database\Schema\SqlReader;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
@@ -46,62 +47,48 @@ final class TableBuilderTest extends UnitTestCase
         $this->table = $parser->parse()[0];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasExpectedTableName(): void
     {
         self::assertSame('aTestTable', $this->table->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasExpectedTableEngine(): void
     {
         self::assertTrue($this->table->hasOption('engine'));
         self::assertSame('MyISAM', $this->table->getOption('engine'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasExpectedTableCollation(): void
     {
         self::assertTrue($this->table->hasOption('charset'));
         self::assertSame('latin1', $this->table->getOption('charset'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasExpectedTableCharacterSet(): void
     {
         self::assertTrue($this->table->hasOption('collate'));
         self::assertSame('latin1_german_cs', $this->table->getOption('collate'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasExpectedTableRowFormat(): void
     {
         self::assertTrue($this->table->hasOption('row_format'));
         self::assertSame('DYNAMIC', $this->table->getOption('row_format'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasExpectedTableAutoIncrementValue(): void
     {
         self::assertTrue($this->table->hasOption('auto_increment'));
         self::assertSame('1', $this->table->getOption('auto_increment'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedUidColumn(): void
     {
         $subject = $this->table->getColumn('uid');
@@ -113,9 +100,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertTrue($subject->getAutoincrement());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedPidColumn(): void
     {
         $subject = $this->table->getColumn('pid');
@@ -127,9 +112,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame('0', $subject->getDefault());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedTstampColumn(): void
     {
         $subject = $this->table->getColumn('tstamp');
@@ -141,9 +124,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame('0', $subject->getDefault());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedSortingColumn(): void
     {
         $subject = $this->table->getColumn('sorting');
@@ -155,9 +136,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame(0, $subject->getDefault());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedDeletedColumn(): void
     {
         $subject = $this->table->getColumn('deleted');
@@ -169,9 +148,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame('0', $subject->getDefault());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedTSconfigColumn(): void
     {
         $subject = $this->table->getColumn('TSconfig');
@@ -181,9 +158,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertNull($subject->getDefault());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedNoCacheColumn(): void
     {
         $subject = $this->table->getColumn('no_cache');
@@ -195,9 +170,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame('0', $subject->getDefault());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedPrimaryKey(): void
     {
         $subject = $this->table->getPrimaryKey();
@@ -206,9 +179,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame(['`uid`'], $subject->getColumns());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedParentKey(): void
     {
         $subject = $this->table->getIndex('parent');
@@ -217,9 +188,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame(['`pid`', '`deleted`', '`sorting`'], $subject->getColumns());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedNoCacheKey(): void
     {
         $subject = $this->table->getIndex('noCache');
@@ -228,9 +197,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame(['`no_cache`'], $subject->getColumns());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExpectedForeignKey(): void
     {
         $subject = $this->table->getForeignKey('fk_overlay');
@@ -241,9 +208,7 @@ final class TableBuilderTest extends UnitTestCase
         self::assertSame('any_foreign_table', $subject->getForeignTableName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasColumnLengthOnIndex(): void
     {
         $subject = $this->table->getIndex('substring');
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableOptionsTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableOptionsTest.php
index 670877a75262e471eae6330011e1576597467195..b1eee0d1f5dde12aec6cb53830e18e5e68628913 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableOptionsTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Parser/TableOptionsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\AbstractCreateStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\AST\CreateTableStatement;
 use TYPO3\CMS\Core\Database\Schema\Parser\Parser;
@@ -138,10 +140,8 @@ final class TableOptionsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canParseTableOptionsDataProvider
-     */
+    #[DataProvider('canParseTableOptionsDataProvider')]
+    #[Test]
     public function canParseTableOptions(
         string $tableOptionsSQL,
         array $expectedTableOptions
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/SqlReaderTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/SqlReaderTest.php
index 23426d7dbecd3382bad86f3da925c5c1ebb39c83..bd1e108629faac10e738646aa4557fa6953cf51a 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/SqlReaderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/SqlReaderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\SqlReader;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Core\Package\PackageManager;
@@ -26,9 +28,7 @@ final class SqlReaderTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatementArraySplitsStatements(): void
     {
         $subject = new SqlReader(new NoopEventDispatcher(), $this->createMock(PackageManager::class));
@@ -42,9 +42,7 @@ final class SqlReaderTest extends UnitTestCase
         self::assertStringStartsWith('INSERT INTO', $result[1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatementArrayFiltersStatements(): void
     {
         $subject = new SqlReader(new NoopEventDispatcher(), $this->createMock(PackageManager::class));
@@ -58,9 +56,7 @@ final class SqlReaderTest extends UnitTestCase
         self::assertStringStartsWith('CREATE TABLE', array_pop($result));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getInsertStatementArrayResult(): void
     {
         $subject = new SqlReader(new NoopEventDispatcher(), $this->createMock(PackageManager::class));
@@ -74,9 +70,7 @@ final class SqlReaderTest extends UnitTestCase
         self::assertStringStartsWith('INSERT', array_pop($result));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getInsertStatementArrayResultWithNewline(): void
     {
         $subject = new SqlReader(new NoopEventDispatcher(), $this->createMock(PackageManager::class));
@@ -92,9 +86,7 @@ final class SqlReaderTest extends UnitTestCase
         self::assertSame('INSERT INTO aTestTable(`aTestField`) VALUES(1);', array_pop($result));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCreateTableStatementArrayResult(): void
     {
         $subject = new SqlReader(new NoopEventDispatcher(), $this->createMock(PackageManager::class));
@@ -107,10 +99,8 @@ final class SqlReaderTest extends UnitTestCase
         self::assertStringStartsWith('CREATE TABLE', array_pop($result));
     }
 
-    /**
-     * @dataProvider commentProvider
-     * @test
-     */
+    #[DataProvider('commentProvider')]
+    #[Test]
     public function getCreateTableStatementArrayResultWithComment(string $comment): void
     {
         $subject = new SqlReader(new NoopEventDispatcher(), $this->createMock(PackageManager::class));
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Types/EnumTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Types/EnumTypeTest.php
index 30f16e23317e06db353c62b39c5fc465d0507fc1..bde4ab2c91d32f9c73c91713d37839c50d715f7b 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Types/EnumTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Types/EnumTypeTest.php
@@ -19,6 +19,7 @@ namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Types;
 
 use Doctrine\DBAL\Platforms\AbstractPlatform;
 use Doctrine\DBAL\Types\Type;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Types\EnumType;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -32,18 +33,14 @@ final class EnumTypeTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getNameReturnsTypeIdentifier(): void
     {
         $subject = Type::getType(EnumType::TYPE);
         self::assertSame(EnumType::TYPE, $subject->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSQLDeclaration(): void
     {
         $fieldDeclaration = [
diff --git a/typo3/sysext/core/Tests/Unit/Database/Schema/Types/SetTypeTest.php b/typo3/sysext/core/Tests/Unit/Database/Schema/Types/SetTypeTest.php
index 6cc9cb66baf650a0af04bd47a66ed40b03e3a78f..dc887a9f2b6676dd2777dbb10f292f6d9ad606cb 100644
--- a/typo3/sysext/core/Tests/Unit/Database/Schema/Types/SetTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Database/Schema/Types/SetTypeTest.php
@@ -19,6 +19,7 @@ namespace TYPO3\CMS\Core\Tests\Unit\Database\Schema\Types;
 
 use Doctrine\DBAL\Platforms\AbstractPlatform;
 use Doctrine\DBAL\Types\Type;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Schema\Types\SetType;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -32,18 +33,14 @@ final class SetTypeTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getNameReturnsTypeIdentifier(): void
     {
         $subject = Type::getType(SetType::TYPE);
         self::assertSame(SetType::TYPE, $subject->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSQLDeclaration(): void
     {
         $fieldDeclaration = [
diff --git a/typo3/sysext/core/Tests/Unit/DependencyInjection/ConsoleCommandPassTest.php b/typo3/sysext/core/Tests/Unit/DependencyInjection/ConsoleCommandPassTest.php
index e9acce06c44ea99b251e54ffcd0f78c5d3ef93be..50a7543bf77a72c13330ba08ea573c8ba44ff049 100644
--- a/typo3/sysext/core/Tests/Unit/DependencyInjection/ConsoleCommandPassTest.php
+++ b/typo3/sysext/core/Tests/Unit/DependencyInjection/ConsoleCommandPassTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DependencyInjection;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use Symfony\Component\Console\Command\Command;
 use TYPO3\CMS\Core\Cache\Frontend\PhpFrontend;
@@ -55,9 +56,7 @@ final class ConsoleCommandPassTest extends UnitTestCase
         return (new ContainerBuilder([]))->createDependencyInjectionContainer($packageManagerMock, $cacheMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function commandRegistrationViaTags(): void
     {
         $container = $this->buildContainer(__METHOD__, [
@@ -78,9 +77,7 @@ final class ConsoleCommandPassTest extends UnitTestCase
         self::assertInstanceOf(Command::class, $commandRegistry->getCommandByIdentifier('test:cmd'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withoutConfiguration(): void
     {
         $container = $this->buildContainer(__METHOD__, [
diff --git a/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php b/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php
index 027648d2b6f07db1cef3e942afe950613dbb38d7..cbe4744611ed40f5a75078207b57afec5c02d8dc 100644
--- a/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php
+++ b/typo3/sysext/core/Tests/Unit/DependencyInjection/FailsafeContainerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DependencyInjection;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerExceptionInterface;
 use Psr\Container\ContainerInterface;
 use Psr\Container\NotFoundExceptionInterface;
@@ -27,17 +29,13 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FailsafeContainerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsInterface(): void
     {
         self::assertInstanceOf(ContainerInterface::class, new Container());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withString(): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -53,10 +51,8 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertEquals('value', $container->get('param'));
     }
 
-    /**
-     * @test
-     * @dataProvider objectFactories
-     */
+    #[DataProvider('objectFactories')]
+    #[Test]
     public function get(mixed $factory): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -70,10 +66,8 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertInstanceOf(Service::class, $container->get('service'));
     }
 
-    /**
-     * @test
-     * @dataProvider objectFactories
-     */
+    #[DataProvider('objectFactories')]
+    #[Test]
     public function multipleGetServicesShouldBeEqual(mixed $factory): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -93,9 +87,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame($extensionOne, $extensionTwo);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function passesContainerAsParameter(): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -114,9 +106,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame($container, $container->get('container'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullValueEntry(): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -132,9 +122,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertNull($container->get('null'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullValueEntryCallsFactoryOnlyOnce(): void
     {
         $calledCount = 0;
@@ -156,9 +144,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertEquals(1, $calledCount);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function has(): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -193,9 +179,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertFalse($container->has('non_existent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultEntry(): void
     {
         $default = ['param' => 'value'];
@@ -204,9 +188,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame('value', $container->get('param'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getValidatesKeyIsPresent(): void
     {
         $container = new Container();
@@ -216,10 +198,8 @@ final class FailsafeContainerTest extends UnitTestCase
         $container->get('foo');
     }
 
-    /**
-     * @test
-     * @dataProvider objectFactories
-     */
+    #[DataProvider('objectFactories')]
+    #[Test]
     public function extension(mixed $factory): void
     {
         $providerMockA = $this->createMock(ServiceProviderInterface::class);
@@ -243,10 +223,8 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame('value', $container->get('service')->value);
     }
 
-    /**
-     * @test
-     * @dataProvider objectFactories
-     */
+    #[DataProvider('objectFactories')]
+    #[Test]
     public function extendingLaterProvider(mixed $factory): void
     {
         $providerMockA = $this->createMock(ServiceProviderInterface::class);
@@ -266,10 +244,8 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame('value', $container->get('service')->value);
     }
 
-    /**
-     * @test
-     * @dataProvider objectFactories
-     */
+    #[DataProvider('objectFactories')]
+    #[Test]
     public function extendingOwnFactory(mixed $factory): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -287,9 +263,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame('value', $container->get('service')->value);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extendingNonExistingFactory(): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -308,10 +282,8 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame('value', $container->get('service')->value);
     }
 
-    /**
-     * @test
-     * @dataProvider objectFactories
-     */
+    #[DataProvider('objectFactories')]
+    #[Test]
     public function multipleExtensions(mixed $factory): void
     {
         $providerMockA = $this->createMock(ServiceProviderInterface::class);
@@ -340,10 +312,8 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertSame('12', $container->get('service')->value);
     }
 
-    /**
-     * @test
-     * @dataProvider objectFactories
-     */
+    #[DataProvider('objectFactories')]
+    #[Test]
     public function entryOverriding(mixed $factory): void
     {
         $providerMockA = $this->createMock(ServiceProviderInterface::class);
@@ -362,9 +332,7 @@ final class FailsafeContainerTest extends UnitTestCase
         self::assertEquals('value', $container->get('service'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cyclicDependency(): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -385,9 +353,7 @@ final class FailsafeContainerTest extends UnitTestCase
         $container->get('A');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cyclicDependencyRetrievedTwice(): void
     {
         $providerMock = $this->createMock(ServiceProviderInterface::class);
@@ -413,18 +379,14 @@ final class FailsafeContainerTest extends UnitTestCase
         $container->get('A');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullContainer(): void
     {
         $container = new Container();
         self::assertFalse($container->has('foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullContainerWithDefaultEntries(): void
     {
         $container = new Container([], ['foo' => 'bar']);
diff --git a/typo3/sysext/core/Tests/Unit/DependencyInjection/ListenerProviderPassTest.php b/typo3/sysext/core/Tests/Unit/DependencyInjection/ListenerProviderPassTest.php
index 0465108eec328f46e145d21f8ed642532476938f..2ef8366957767cc3451e739dc51f5c0a82853b40 100644
--- a/typo3/sysext/core/Tests/Unit/DependencyInjection/ListenerProviderPassTest.php
+++ b/typo3/sysext/core/Tests/Unit/DependencyInjection/ListenerProviderPassTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DependencyInjection;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Config\FileLocator;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Definition;
@@ -51,9 +52,7 @@ final class ListenerProviderPassTest extends UnitTestCase
         return $container;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function simpleChainsAndDependencies(): void
     {
         $container = $this->getContainerWithListenerProvider([
@@ -88,9 +87,7 @@ final class ListenerProviderPassTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cycleException(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -102,9 +99,7 @@ final class ListenerProviderPassTest extends UnitTestCase
         ]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withoutConfiguration(): void
     {
         $container = $this->getContainerWithListenerProvider([]);
diff --git a/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderCompilationPassTest.php b/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderCompilationPassTest.php
index 20200b1c599a5b2f2f7cdd8005b2cb62d36dbe16..6aaa6119fc27b9e8b7eafce823fa85b19e9aa41e 100644
--- a/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderCompilationPassTest.php
+++ b/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderCompilationPassTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DependencyInjection;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Definition;
@@ -65,9 +66,7 @@ final class ServiceProviderCompilationPassTest extends UnitTestCase
         return $container;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function simpleServiceProvider(): void
     {
         $container = $this->getContainer([
@@ -84,9 +83,7 @@ final class ServiceProviderCompilationPassTest extends UnitTestCase
         self::assertIsObject($container->get('function'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function serviceProviderOverrides(): void
     {
         $container = $this->getContainer([
@@ -106,9 +103,7 @@ final class ServiceProviderCompilationPassTest extends UnitTestCase
         self::assertEquals('baz', $serviceE->parameter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function serviceProviderFactoryOverrides(): void
     {
         $container = $this->getContainer([
@@ -122,9 +117,7 @@ final class ServiceProviderCompilationPassTest extends UnitTestCase
         self::assertEquals('remotehost', $serviceA->serviceB->parameter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function serviceProviderFactoryOverridesForSymfonyDefinedServices(): void
     {
         $container = $this->getContainer(
@@ -149,9 +142,7 @@ final class ServiceProviderCompilationPassTest extends UnitTestCase
         self::assertEquals('foobar', $serviceA->serviceB->symfony_defined_parameter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function serviceProviderFactoryOverrideResetsAutowiring(): void
     {
         $container = $this->getContainer(
@@ -178,9 +169,7 @@ final class ServiceProviderCompilationPassTest extends UnitTestCase
         self::assertFalse($container->getDefinition('serviceB')->isAutowired());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function exceptionForNonNullableExtensionArgument(): void
     {
         $this->expectException(\Exception::class);
diff --git a/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderRegistryTest.php b/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderRegistryTest.php
index 386c6fdd5b4454f5cd2e3cb4d7beaa702e91b46e..1b7ebaca272e093c2c0800d7abb5d9b3b8099765 100644
--- a/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/DependencyInjection/ServiceProviderRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\DependencyInjection;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Container\ContainerInterface;
 use TYPO3\CMS\Core\DependencyInjection\ServiceProviderRegistry;
@@ -46,9 +47,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         $this->packageManagerMock->method('getActivePackages')->willReturn([$package]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registry(): void
     {
         $this->mockPackage('core', TestRegistryServiceProvider::class);
@@ -56,9 +55,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         self::assertEquals(new TestRegistryServiceProvider(), $subject->get('core'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registryCaches(): void
     {
         $this->mockPackage('core', TestRegistryServiceProvider::class);
@@ -67,9 +64,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         self::assertSame($subject->get('core'), $subject->get('core'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registryPassesPackageAsConstructorArgument(): void
     {
         $this->mockPackage('core', TestStatefulServiceProvider::class);
@@ -78,9 +73,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         self::assertInstanceOf(Package::class, $subject->get('core')->package);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -88,9 +81,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         $subject->get('backend');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getServices(): void
     {
         $this->mockPackage('core', TestRegistryServiceProvider::class);
@@ -101,9 +92,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         self::assertSame($services['serviceA'], $services2['serviceA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extendServices(): void
     {
         $this->mockPackage('core', TestRegistryServiceProvider::class);
@@ -114,9 +103,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         self::assertSame($services['serviceB'], $services2['serviceB']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getServiceFactory(): void
     {
         $this->mockPackage('core', TestRegistryServiceProvider::class);
@@ -126,9 +113,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         self::assertEquals(42, $subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getServiceExtension(): void
     {
         $this->mockPackage('core', TestRegistryServiceProvider::class);
@@ -138,9 +123,7 @@ final class ServiceProviderRegistryTest extends UnitTestCase
         self::assertInstanceOf(\stdClass::class, $service);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function iterator(): void
     {
         $packages = [
diff --git a/typo3/sysext/core/Tests/Unit/Error/DebugExceptionHandlerTest.php b/typo3/sysext/core/Tests/Unit/Error/DebugExceptionHandlerTest.php
index 391b016d76b9965f4e20786af187f5e971a33b97..e86ce715edd845c0ac760134e119f441fc451dab 100644
--- a/typo3/sysext/core/Tests/Unit/Error/DebugExceptionHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Error/DebugExceptionHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Error;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerTrait;
@@ -54,9 +56,7 @@ final class DebugExceptionHandlerTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function echoExceptionWebEscapesExceptionMessage(): void
     {
         $message = '<b>b</b><script>alert(1);</script>';
@@ -105,10 +105,8 @@ final class DebugExceptionHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider exampleUrlsForTokenAnonymization
-     */
+    #[DataProvider('exampleUrlsForTokenAnonymization')]
+    #[Test]
     public function logEntriesContainAnonymousTokens(string $originalUrl, string $expectedUrl): void
     {
         $subject = new DebugExceptionHandler();
diff --git a/typo3/sysext/core/Tests/Unit/Error/ErrorHandlerTest.php b/typo3/sysext/core/Tests/Unit/Error/ErrorHandlerTest.php
index d537921e0a1169cd706b05cb9535b0f05a404c97..1f0aff148fbcc2b2d86cb9511d09cef83a2f0e08 100644
--- a/typo3/sysext/core/Tests/Unit/Error/ErrorHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Error/ErrorHandlerTest.php
@@ -70,10 +70,6 @@ final class ErrorHandlerTest extends UnitTestCase
     #[WithoutErrorHandler]
     #[Test]
     #[DataProvider('errorTests')]
-    /**
-     * @test
-     * @dataProvider errorTests
-     */
     public function errorHandlerLogsCorrectly(
         int $levelsToHandle,
         int $levelsToThrow,
diff --git a/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php b/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php
index 6f058be113ae3d24d472299164da28c40df94028..03eff59b781365926ebbeb6d4f4c552eab1e0d96 100644
--- a/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Error;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerTrait;
@@ -54,9 +56,7 @@ final class ProductionExceptionHandlerTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function echoExceptionWebEscapesExceptionMessage(): void
     {
         $typo3InformationMock = $this->createMock(Typo3Information::class);
@@ -72,9 +72,7 @@ final class ProductionExceptionHandlerTest extends UnitTestCase
         self::assertStringNotContainsString($message, $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function echoExceptionWebEscapesExceptionTitle(): void
     {
         $typo3InformationMock = $this->createMock(Typo3Information::class);
@@ -129,10 +127,8 @@ final class ProductionExceptionHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider exampleUrlsForTokenAnonymization
-     */
+    #[DataProvider('exampleUrlsForTokenAnonymization')]
+    #[Test]
     public function logEntriesContainAnonymousTokens(string $originalUrl, string $expectedUrl): void
     {
         $typo3InformationMock = $this->createMock(Typo3Information::class);
diff --git a/typo3/sysext/core/Tests/Unit/EventDispatcher/EventDispatcherTest.php b/typo3/sysext/core/Tests/Unit/EventDispatcher/EventDispatcherTest.php
index 1f6f767a0a6ea6cd4ee9c73efd803251cf7a2529..e542839d261dc99c9c85203a0c437217d85f1064 100644
--- a/typo3/sysext/core/Tests/Unit/EventDispatcher/EventDispatcherTest.php
+++ b/typo3/sysext/core/Tests/Unit/EventDispatcher/EventDispatcherTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\EventDispatcher;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use Psr\EventDispatcher\ListenerProviderInterface;
@@ -38,18 +40,14 @@ final class EventDispatcherTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsrInterface(): void
     {
         self::assertInstanceOf(EventDispatcherInterface::class, $this->eventDispatcher);
     }
 
-    /**
-     * @test
-     * @dataProvider callables
-     */
+    #[DataProvider('callables')]
+    #[Test]
     public function dispatchesEvent(callable $callable): void
     {
         $event = new \stdClass();
@@ -64,10 +62,8 @@ final class EventDispatcherTest extends UnitTestCase
         self::assertEquals(1, $event->invoked);
     }
 
-    /**
-     * @test
-     * @dataProvider callables
-     */
+    #[DataProvider('callables')]
+    #[Test]
     public function doesNotDispatchStoppedEvent(callable $callable): void
     {
         $event = new class () implements StoppableEventInterface {
@@ -88,10 +84,8 @@ final class EventDispatcherTest extends UnitTestCase
         self::assertEquals(0, $event->invoked);
     }
 
-    /**
-     * @test
-     * @dataProvider callables
-     */
+    #[DataProvider('callables')]
+    #[Test]
     public function dispatchesMultipleListeners(callable $callable): void
     {
         $event = new \stdClass();
@@ -107,10 +101,8 @@ final class EventDispatcherTest extends UnitTestCase
         self::assertEquals(2, $event->invoked);
     }
 
-    /**
-     * @test
-     * @dataProvider callables
-     */
+    #[DataProvider('callables')]
+    #[Test]
     public function stopsOnStoppedEvent(callable $callable): void
     {
         $event = new class () implements StoppableEventInterface {
@@ -137,9 +129,7 @@ final class EventDispatcherTest extends UnitTestCase
         self::assertEquals(2, $event->invoked);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function listenerExceptionIsPropagated(): void
     {
         $this->expectException(\BadMethodCallException::class);
diff --git a/typo3/sysext/core/Tests/Unit/EventDispatcher/ListenerProviderTest.php b/typo3/sysext/core/Tests/Unit/EventDispatcher/ListenerProviderTest.php
index d6e94d5467db5663c60f9b7466ce38efefe5fc33..06ca360fff62ccfec7157b72a53f2fd939ecd4c1 100644
--- a/typo3/sysext/core/Tests/Unit/EventDispatcher/ListenerProviderTest.php
+++ b/typo3/sysext/core/Tests/Unit/EventDispatcher/ListenerProviderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\EventDispatcher;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Container\ContainerInterface;
 use Psr\EventDispatcher\ListenerProviderInterface;
@@ -37,17 +39,13 @@ final class ListenerProviderTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsrInterface(): void
     {
         self::assertInstanceOf(ListenerProviderInterface::class, $this->listenerProvider);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addedListenersAreReturnedByGetAllListenerDefinitions(): void
     {
         $this->listenerProvider->addListener('Event\\Name', 'listener1');
@@ -61,9 +59,7 @@ final class ListenerProviderTest extends UnitTestCase
         ], $this->listenerProvider->getAllListenerDefinitions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addedListenerCorrectlySetsTheListenerIdentifier(): void
     {
         $this->listenerProvider->addListener(event: 'Event\\Name', service: 'service.name1');
@@ -77,10 +73,8 @@ final class ListenerProviderTest extends UnitTestCase
         ], $this->listenerProvider->getAllListenerDefinitions());
     }
 
-    /**
-     * @test
-     * @dataProvider listeners
-     */
+    #[DataProvider('listeners')]
+    #[Test]
     public function dispatchesEvent($listener, string $method = null): void
     {
         $event = new \stdClass();
@@ -96,10 +90,8 @@ final class ListenerProviderTest extends UnitTestCase
         self::assertEquals(1, $event->invoked);
     }
 
-    /**
-     * @test
-     * @dataProvider listeners
-     */
+    #[DataProvider('listeners')]
+    #[Test]
     public function associatesToEventParentClass($listener, string $method = null): void
     {
         $extendedEvent = new class () extends \stdClass {
@@ -115,10 +107,8 @@ final class ListenerProviderTest extends UnitTestCase
         self::assertEquals(1, $extendedEvent->invoked);
     }
 
-    /**
-     * @test
-     * @dataProvider listeners
-     */
+    #[DataProvider('listeners')]
+    #[Test]
     public function associatesToImplementedInterfaces($listener, string $method = null): void
     {
         $eventImplementation = new class () implements \IteratorAggregate {
@@ -139,9 +129,7 @@ final class ListenerProviderTest extends UnitTestCase
         self::assertEquals(1, $eventImplementation->invoked);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addListenerPreservesOrder(): void
     {
         $this->listenerProvider->addListener(\stdClass::class, 'listener1');
@@ -164,9 +152,7 @@ final class ListenerProviderTest extends UnitTestCase
         self::assertEquals('ab', $event->sequence);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionForInvalidCallable(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/EventDispatcher/NoopEventDispatcherTest.php b/typo3/sysext/core/Tests/Unit/EventDispatcher/NoopEventDispatcherTest.php
index adbfd2505de9e46d874b468c6c1a0b6d6f49e1f5..b540a511142b0049345ef22f70f03ab9e72155f8 100644
--- a/typo3/sysext/core/Tests/Unit/EventDispatcher/NoopEventDispatcherTest.php
+++ b/typo3/sysext/core/Tests/Unit/EventDispatcher/NoopEventDispatcherTest.php
@@ -17,23 +17,20 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\EventDispatcher;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class NoopEventDispatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsEventDispatcherInterface(): void
     {
         self::assertInstanceOf(EventDispatcherInterface::class, new NoopEventDispatcher());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dispatchReturnsProvidedEvent(): void
     {
         $event = new \stdClass();
diff --git a/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php b/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php
index abe5c89123b3141c4098084207c50d623ef2243c..72c1109ff01934e7e427db17f3711f9f167b2149 100644
--- a/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php
+++ b/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\ExpressionLanguage;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\ExpressionLanguage\ExpressionFunction;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Configuration\Features;
@@ -61,10 +63,8 @@ final class ResolverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider basicExpressionsDataProvider
-     */
+    #[DataProvider('basicExpressionsDataProvider')]
+    #[Test]
     public function basicExpressionHandlingResultsWorksAsExpected(string $expression, mixed $expectedResult): void
     {
         $defaultProvider = new DefaultProvider(new Typo3Version(), new Context(), new Features());
@@ -89,10 +89,8 @@ final class ResolverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider basicExpressionsWithVariablesDataProvider
-     */
+    #[DataProvider('basicExpressionsWithVariablesDataProvider')]
+    #[Test]
     public function basicExpressionHandlingWithCustomVariablesWorksAsExpected(string $expression, mixed $expectedResult): void
     {
         $contextMock = $this->createMock(DefaultProvider::class);
@@ -117,10 +115,8 @@ final class ResolverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider basicExpressionHandlingWithContextVariablesDataProvider
-     */
+    #[DataProvider('basicExpressionHandlingWithContextVariablesDataProvider')]
+    #[Test]
     public function basicExpressionHandlingWithContextVariablesWorksAsExpected(string $expression, array $contextVariables, mixed $expectedResult): void
     {
         $contextMock = $this->createMock(DefaultProvider::class);
@@ -147,10 +143,10 @@ final class ResolverTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider basicExpressionsWithVariablesAndExpressionLanguageProviderDataProvider
      * @param mixed $expectedResult
      */
+    #[DataProvider('basicExpressionsWithVariablesAndExpressionLanguageProviderDataProvider')]
+    #[Test]
     public function basicExpressionHandlingWithCustomVariablesAndExpressionLanguageProviderWorksAsExpected(string $expression, mixed $expectedResult): void
     {
         $expressionProviderMock = $this->createMock(DefaultFunctionsProvider::class);
diff --git a/typo3/sysext/core/Tests/Unit/FormProtection/AbstractFormProtectionTest.php b/typo3/sysext/core/Tests/Unit/FormProtection/AbstractFormProtectionTest.php
index 0e0d2b6585b0a108f3805fbd232bea80139c82da..880aa6f56332139b82e6e8515b41fadb9d8a2ee1 100644
--- a/typo3/sysext/core/Tests/Unit/FormProtection/AbstractFormProtectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/FormProtection/AbstractFormProtectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\FormProtection;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\FormProtection\Fixtures\FormProtectionTesting;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -34,9 +35,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenRetrievesTokenOnce(): void
     {
         $subject = $this->getMockBuilder(FormProtectionTesting::class)
@@ -47,9 +46,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         $subject->generateToken('foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenRetrievesTokenOnce(): void
     {
         $subject = $this->getMockBuilder(FormProtectionTesting::class)
@@ -60,9 +57,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         $subject->validateToken('foo', 'bar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cleanMakesTokenInvalid(): void
     {
         $formName = 'foo';
@@ -71,9 +66,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         self::assertFalse($this->subject->validateToken($tokenId, $formName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cleanPersistsToken(): void
     {
         $subject = $this->getMockBuilder(FormProtectionTesting::class)
@@ -83,9 +76,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         $subject->clean();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenFormForEmptyFormNameThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -93,65 +84,49 @@ final class AbstractFormProtectionTest extends UnitTestCase
         $this->subject->generateToken('', 'edit', 'bar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenFormForEmptyActionNotThrowsException(): void
     {
         $this->subject->generateToken('foo', '', '42');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenFormForEmptyFormInstanceNameNotThrowsException(): void
     {
         $this->subject->generateToken('foo', 'edit', '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenFormForOmittedActionAndFormInstanceNameNotThrowsException(): void
     {
         $this->subject->generateToken('foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenReturns32CharacterHexToken(): void
     {
         self::assertMatchesRegularExpression('/^[0-9a-f]{40}$/', $this->subject->generateToken('foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenCalledTwoTimesWithSameParametersReturnsSameTokens(): void
     {
         self::assertEquals($this->subject->generateToken('foo', 'edit', 'bar'), $this->subject->generateToken('foo', 'edit', 'bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithFourEmptyParametersNotThrowsException(): void
     {
         $this->subject->validateToken('', '', '', '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithTwoEmptyAndTwoMissingParametersNotThrowsException(): void
     {
         $this->subject->validateToken('', '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithDataFromGenerateTokenWithFormInstanceNameReturnsTrue(): void
     {
         $formName = 'foo';
@@ -160,18 +135,14 @@ final class AbstractFormProtectionTest extends UnitTestCase
         self::assertTrue($this->subject->validateToken($this->subject->generateToken($formName, $action, $formInstanceName), $formName, $action, $formInstanceName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithDataFromGenerateTokenWithMissingActionAndFormInstanceNameReturnsTrue(): void
     {
         $formName = 'foo';
         self::assertTrue($this->subject->validateToken($this->subject->generateToken($formName), $formName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithValidDataCalledTwoTimesReturnsTrueOnSecondCall(): void
     {
         $formName = 'foo';
@@ -182,9 +153,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         self::assertTrue($this->subject->validateToken($tokenId, $formName, $action, $formInstanceName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithMismatchingTokenIdReturnsFalse(): void
     {
         $formName = 'foo';
@@ -194,9 +163,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         self::assertFalse($this->subject->validateToken('Hello world!', $formName, $action, $formInstanceName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithMismatchingFormNameReturnsFalse(): void
     {
         $formName = 'foo';
@@ -206,9 +173,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         self::assertFalse($this->subject->validateToken($tokenId, 'espresso', $action, $formInstanceName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithMismatchingActionReturnsFalse(): void
     {
         $formName = 'foo';
@@ -218,9 +183,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         self::assertFalse($this->subject->validateToken($tokenId, $formName, 'delete', $formInstanceName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenWithMismatchingFormInstanceNameReturnsFalse(): void
     {
         $formName = 'foo';
@@ -230,9 +193,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         self::assertFalse($this->subject->validateToken($tokenId, $formName, $action, 'beer'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenForValidTokenNotCallsCreateValidationErrorMessage(): void
     {
         $subject = $this->getMockBuilder(FormProtectionTesting::class)
@@ -246,9 +207,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         $subject->validateToken($token, $formName, $action, $formInstanceName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenForInvalidTokenCallsCreateValidationErrorMessage(): void
     {
         $subject = $this->getMockBuilder(FormProtectionTesting::class)
@@ -262,9 +221,7 @@ final class AbstractFormProtectionTest extends UnitTestCase
         $subject->validateToken('an invalid token ...', $formName, $action, $formInstanceName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateTokenForInvalidFormNameCallsCreateValidationErrorMessage(): void
     {
         $subject = $this->getMockBuilder(FormProtectionTesting::class)
diff --git a/typo3/sysext/core/Tests/Unit/FormProtection/BackendFormProtectionTest.php b/typo3/sysext/core/Tests/Unit/FormProtection/BackendFormProtectionTest.php
index 2848da7385a3e82cde04c22606995104663e7359..ec10e991873ee1a710ea82720e4344bcf60bb870 100644
--- a/typo3/sysext/core/Tests/Unit/FormProtection/BackendFormProtectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/FormProtection/BackendFormProtectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\FormProtection;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\FormProtection\BackendFormProtection;
@@ -44,9 +45,7 @@ final class BackendFormProtectionTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateTokenReadsTokenFromSessionData(): void
     {
         $this->backendUserMock
@@ -57,9 +56,7 @@ final class BackendFormProtectionTest extends UnitTestCase
         $this->subject->generateToken('foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tokenFromSessionDataIsAvailableForValidateToken(): void
     {
         $sessionToken = '881ffea2159ac72182557b79dc0c723f5a8d20136f9fab56cdd4f8b3a1dbcfcd';
@@ -82,9 +79,7 @@ final class BackendFormProtectionTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function restoreSessionTokenFromRegistryThrowsExceptionIfSessionTokenIsEmpty(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -93,9 +88,7 @@ final class BackendFormProtectionTest extends UnitTestCase
         $this->subject->setSessionTokenFromRegistry();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function persistSessionTokenWritesTokenToSession(): void
     {
         $this->backendUserMock
@@ -104,9 +97,7 @@ final class BackendFormProtectionTest extends UnitTestCase
         $this->subject->persistSessionToken();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function failingTokenValidationInvokesFailingTokenClosure(): void
     {
         $this->expectException(\Exception::class);
diff --git a/typo3/sysext/core/Tests/Unit/FormProtection/FormProtectionFactoryTest.php b/typo3/sysext/core/Tests/Unit/FormProtection/FormProtectionFactoryTest.php
index 7763a20d6342360179d2368b642710079f79481d..7a3b06bc89b1623595117f24e6049cb2a61c3352 100644
--- a/typo3/sysext/core/Tests/Unit/FormProtection/FormProtectionFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/FormProtection/FormProtectionFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\FormProtection;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Cache\Backend\TransientMemoryBackend;
@@ -61,18 +62,14 @@ final class FormProtectionFactoryTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createForTypeReturnsDisabledIfInvalidTypeIsGiven(): void
     {
         $formProtection = $this->subject->createForType('invalid-type');
         self::assertInstanceOf(DisabledFormProtection::class, $formProtection);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createForTypeReturnsDisabledIfInvalidTypeIsGivenAndSameInstanceIfDisabledIsGivenLaterOn(): void
     {
         $formProtection = $this->subject->createForType('invalid-type');
@@ -82,9 +79,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         self::assertSame($formProtectionDisabled, $formProtection);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createForTypeReturnsDisabledForValidTypeButWithoutValidGlobalArguments(): void
     {
         $formProtection = $this->subject->createForType('frontend');
@@ -93,18 +88,14 @@ final class FormProtectionFactoryTest extends UnitTestCase
         self::assertInstanceOf(DisabledFormProtection::class, $formProtection);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createForTypeAlwaysReturnsInstallToolRegardlessOfRequirementsIfRequested(): void
     {
         $formProtection = $this->subject->createForType('installtool');
         self::assertInstanceOf(InstallToolFormProtection::class, $formProtection);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createForTypeReturnsDisabledIfBackendUserIsNotAvailable(): void
     {
         $user = new BackendUserAuthentication();
@@ -114,9 +105,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         self::assertInstanceOf(DisabledFormProtection::class, $formProtection);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createForTypeReturnsBackendIfBackendUserIsLoggedIn(): void
     {
         $user = new BackendUserAuthentication();
@@ -127,9 +116,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         self::assertInstanceOf(BackendFormProtection::class, $formProtection);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createForTypeReturnsTheSameInstanceEvenThoughUserWasLoggedInLaterOn(): void
     {
         $user = new BackendUserAuthentication();
diff --git a/typo3/sysext/core/Tests/Unit/FormProtection/InstallToolFormProtectionTest.php b/typo3/sysext/core/Tests/Unit/FormProtection/InstallToolFormProtectionTest.php
index 4571d68407082fccf958a93811ae18fee3e6ba6a..61065b6ffd191dafd20193c3f77d3de77728dc68 100644
--- a/typo3/sysext/core/Tests/Unit/FormProtection/InstallToolFormProtectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/FormProtection/InstallToolFormProtectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\FormProtection;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -29,9 +30,7 @@ final class InstallToolFormProtectionTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tokenFromSessionDataIsAvailableForValidateToken(): void
     {
         $sessionToken = '881ffea2159ac72182557b79dc0c723f5a8d20136f9fab56cdd4f8b3a1dbcfcd';
@@ -45,9 +44,7 @@ final class InstallToolFormProtectionTest extends UnitTestCase
         self::assertTrue($subject->validateToken($tokenId, $formName, $action, $formInstanceName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function persistSessionTokenWritesTokensToSession(): void
     {
         $_SESSION['installToolFormToken'] = 'foo';
diff --git a/typo3/sysext/core/Tests/Unit/Hooks/TcaItemsProcessorFunctionsTest.php b/typo3/sysext/core/Tests/Unit/Hooks/TcaItemsProcessorFunctionsTest.php
index fc1f7c8bc249ac89aed7fc0f0245900550f8a417..1531193a9774b59ab33d1ec4d2c15a22fcd161ad 100644
--- a/typo3/sysext/core/Tests/Unit/Hooks/TcaItemsProcessorFunctionsTest.php
+++ b/typo3/sysext/core/Tests/Unit/Hooks/TcaItemsProcessorFunctionsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Hooks;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Backend\Module\ModuleFactory;
 use TYPO3\CMS\Backend\Module\ModuleProvider;
@@ -60,9 +62,7 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function populateAvailableTablesTest(): void
     {
         $fieldDefinition = ['items' => [0 => ['label' => '---', 'value' => 0]]];
@@ -98,9 +98,7 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         self::assertSame($expected, $fieldDefinition);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function populateAvailablePageTypesTest(): void
     {
         $fieldDefinition = ['items' => []];
@@ -142,9 +140,7 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         self::assertSame($expected, $fieldDefinition);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function populateAvailableUserModulesTest(): void
     {
         $moduleProviderMock = $this->createMock(ModuleProvider::class);
@@ -191,10 +187,8 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         self::assertSame($expected, $fieldDefinition);
     }
 
-    /**
-     * @test
-     * @dataProvider populateExcludeFieldsTestDataProvider
-     */
+    #[DataProvider('populateExcludeFieldsTestDataProvider')]
+    #[Test]
     public function populateExcludeFieldsTest(array $tca, array $expectedItems): void
     {
         $GLOBALS['TCA'] = $tca;
@@ -322,9 +316,7 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function populateExcludeFieldsWithFlexFormTest(): void
     {
         $GLOBALS['TCA'] = [
@@ -392,10 +384,8 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         self::assertSame($expected, $fieldDefinition);
     }
 
-    /**
-     * @test
-     * @dataProvider populateExplicitAuthValuesTestDataProvider
-     */
+    #[DataProvider('populateExplicitAuthValuesTestDataProvider')]
+    #[Test]
     public function populateExplicitAuthValuesTest(array $tca, array $expectedItems): void
     {
         $GLOBALS['TCA'] = $tca;
@@ -447,9 +437,7 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function populateCustomPermissionOptionsTest(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['customPermOptions'] = [
@@ -492,9 +480,7 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         self::assertSame($expected, $fieldDefinition);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function populateAvailableCategoryFieldsThrowsExceptionOnMissingTable(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -504,9 +490,7 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         (new TcaItemsProcessorFunctions())->populateAvailableCategoryFields($fieldDefinition);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function populateAvailableCategoryFieldsThrowsExceptionOnInvalidTable(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -516,10 +500,8 @@ final class TcaItemsProcessorFunctionsTest extends UnitTestCase
         (new TcaItemsProcessorFunctions())->populateAvailableCategoryFields($fieldDefinition);
     }
 
-    /**
-     * @test
-     * @dataProvider populateAvailableCategoryFieldsDataProvider
-     */
+    #[DataProvider('populateAvailableCategoryFieldsDataProvider')]
+    #[Test]
     public function populateAvailableCategoryFields(array $itemsProcConfig, array $expectedItems): void
     {
         $GLOBALS['TCA']['aTable']['columns'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Html/HtmlCropperTest.php b/typo3/sysext/core/Tests/Unit/Html/HtmlCropperTest.php
index 58b97ebaadd05fd655b34c30b5bc39e020ee15a0..d547c77f16f37cddb492ab9ff8885eb92a7d1275 100644
--- a/typo3/sysext/core/Tests/Unit/Html/HtmlCropperTest.php
+++ b/typo3/sysext/core/Tests/Unit/Html/HtmlCropperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Html;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Html\HtmlCropper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +32,7 @@ final class HtmlCropperTest extends UnitTestCase
         $this->subject = new HtmlCropper();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cropIsMultibyteSafe(): void
     {
         $actual = $this->subject->crop(
@@ -479,10 +479,8 @@ final class HtmlCropperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cropWorksDataProvicer
-     */
+    #[DataProvider('cropWorksDataProvicer')]
+    #[Test]
     public function cropWorks(string $expected, string $content, int $numberOfChars, string $replacementForEllipsis, bool $cropToSpace): void
     {
         $this->handleCharset($content, $expected);
diff --git a/typo3/sysext/core/Tests/Unit/Html/HtmlParserTest.php b/typo3/sysext/core/Tests/Unit/Html/HtmlParserTest.php
index 0cb748f104ed3afbd289c4c3a43ecb5147f509a0..0e0484eacfc2c17aeb3f700de51dfde29015277d 100644
--- a/typo3/sysext/core/Tests/Unit/Html/HtmlParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/Html/HtmlParserTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Html;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Html\HtmlParser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -123,32 +125,28 @@ final class HtmlParserTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @param string $tag List of tags, comma separated.
      * @param string $content HTML-content
      * @param bool $eliminateExtraEndTags If set, excessive end tags are ignored - you should probably set this in most cases.
      * @param array $expected The expected result
-     * @dataProvider splitIntoBlockDataProvider
      */
+    #[DataProvider('splitIntoBlockDataProvider')]
+    #[Test]
     public function splitIntoBlock(string $tag, string $content, bool $eliminateExtraEndTags, array $expected): void
     {
         self::assertSame($expected, $this->subject->splitIntoBlock($tag, $content, $eliminateExtraEndTags));
     }
 
-    /**
-     * @test
-     * @dataProvider cDataWillRemainUnmodifiedDataProvider
-     */
+    #[DataProvider('cDataWillRemainUnmodifiedDataProvider')]
+    #[Test]
     public function xHtmlCleaningDoesNotModifyCDATA(string $source, string $expected): void
     {
         $result = $this->subject->HTMLcleaner($source, [], 1);
         self::assertSame($expected, $result);
     }
 
-    /**
-     * @test
-     * @dataProvider htmlWithDifferentSingleTagsDataProvider
-     */
+    #[DataProvider('htmlWithDifferentSingleTagsDataProvider')]
+    #[Test]
     public function htmlCleanerKeepsSingleTagsWithAndWithoutEndingSlashUnchanged(string $exampleString): void
     {
         $result = $this->subject->HTMLcleaner($exampleString, ['br' => true], 0);
@@ -188,10 +186,8 @@ final class HtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider spanTagCorrectlyRemovedWhenRmTagIfNoAttribIsConfiguredDataProvider
-     */
+    #[DataProvider('spanTagCorrectlyRemovedWhenRmTagIfNoAttribIsConfiguredDataProvider')]
+    #[Test]
     public function tagCorrectlyRemovedWhenRmTagIfNoAttribIsConfigured(string $content, string $expectedResult): void
     {
         $tsConfig = [
@@ -206,9 +202,7 @@ final class HtmlParserTest extends UnitTestCase
         self::assertEquals($expectedResult, $this->parseConfigAndCleanHtml($tsConfig, $content));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmTagIfNoAttribIsConfiguredDoesNotChangeNestingType(): void
     {
         $tsConfig = [
@@ -250,10 +244,8 @@ final class HtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider localNestingCorrectlyRemovesInvalidTagsDataProvider
-     */
+    #[DataProvider('localNestingCorrectlyRemovesInvalidTagsDataProvider')]
+    #[Test]
     public function localNestingCorrectlyRemovesInvalidTags(string $content, string $expectedResult): void
     {
         $tsConfig = [
@@ -292,10 +284,8 @@ final class HtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider globalNestingCorrectlyRemovesInvalidTagsDataProvider
-     */
+    #[DataProvider('globalNestingCorrectlyRemovesInvalidTagsDataProvider')]
+    #[Test]
     public function globalNestingCorrectlyRemovesInvalidTags(string $content, string $expectedResult): void
     {
         $tsConfig = [
@@ -344,14 +334,14 @@ final class HtmlParserTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider emptyTagsDataProvider
      * @param bool $stripOn TRUE if stripping should be activated.
      * @param string|bool $tagList Comma separated list of tags that should be stripped.
      * @param bool $treatNonBreakingSpaceAsEmpty If TRUE &nbsp; will be considered empty.
      * @param string $content The HTML code that should be modified.
      * @param string $expectedResult The expected HTML code result.
      */
+    #[DataProvider('emptyTagsDataProvider')]
+    #[Test]
     public function stripEmptyTags(
         bool $stripOn,
         $tagList,
@@ -391,13 +381,13 @@ final class HtmlParserTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider stripEmptyTagsKeepsConfiguredTagsDataProvider
      * @param string $tagList List of tags that should be kept, event if they are empty.
      * @param bool $treatNonBreakingSpaceAsEmpty If true &nbsp; will be considered empty.
      * @param string $content The HTML content that should be parsed.
      * @param string $expectedResult The expected HTML code result.
      */
+    #[DataProvider('stripEmptyTagsKeepsConfiguredTagsDataProvider')]
+    #[Test]
     public function stripEmptyTagsKeepsConfiguredTags(
         string $tagList,
         bool $treatNonBreakingSpaceAsEmpty,
@@ -462,12 +452,12 @@ final class HtmlParserTest extends UnitTestCase
      * Returns the first tag in $str
      * Actually everything from the beginning of the $str is returned, so you better make sure the tag is the first thing...
      *
-     * @test
-     * @dataProvider getFirstTagDataProvider
      *
      * @param string $str HTML string with tags
      * @param string $expected The expected result.
      */
+    #[DataProvider('getFirstTagDataProvider')]
+    #[Test]
     public function getFirstTag(string $str, string $expected): void
     {
         self::assertEquals($expected, $this->subject->getFirstTag($str));
@@ -531,13 +521,13 @@ final class HtmlParserTest extends UnitTestCase
     /**
      * Returns the NAME of the first tag in $str
      *
-     * @test
-     * @dataProvider getFirstTagNameDataProvider
      *
      * @param string $str HTML tag (The element name MUST be separated from the attributes by a space character! Just *whitespace* will not do)
      * @param bool $preserveCase If set, then the tag is NOT converted to uppercase by case is preserved.
      * @param string $expected The expected result.
      */
+    #[DataProvider('getFirstTagNameDataProvider')]
+    #[Test]
     public function getFirstTagName(string $str, bool $preserveCase, string $expected): void
     {
         self::assertEquals($expected, $this->subject->getFirstTagName($str, $preserveCase));
@@ -585,10 +575,10 @@ final class HtmlParserTest extends UnitTestCase
      * Removes the first and last tag in the string
      * Anything before the first and after the last tags respectively is also removed
      *
-     * @test
-     * @dataProvider removeFirstAndLastTagDataProvider
      * @param string $str String to process
      */
+    #[DataProvider('removeFirstAndLastTagDataProvider')]
+    #[Test]
     public function removeFirstAndLastTag(string $str, string $expectedResult): void
     {
         self::assertEquals($expectedResult, $this->subject->removeFirstAndLastTag($str));
@@ -626,10 +616,10 @@ final class HtmlParserTest extends UnitTestCase
      * Returns an array with all attributes and its meta information from a tag.
      * Removes tag-name if found
      *
-     * @test
-     * @dataProvider getTagAttributesDataProvider
      * @param string $tag String to process
      */
+    #[DataProvider('getTagAttributesDataProvider')]
+    #[Test]
     public function getTagAttributes(string $tag, array $expectedResult): void
     {
         self::assertEquals($expectedResult, $this->subject->get_tag_attributes($tag));
@@ -673,13 +663,13 @@ final class HtmlParserTest extends UnitTestCase
     /**
      * Strips empty tags from HTML.
      *
-     * @test
-     * @dataProvider stripEmptyTagsDataProvider
      * @param string $content The content to be stripped of empty tags
      * @param string $tagList The comma separated list of tags to be stripped.
      *                        If empty, all empty tags will be stripped
      * @param bool $treatNonBreakingSpaceAsEmpty If TRUE tags containing only &nbsp; entities will be treated as empty.
      */
+    #[DataProvider('stripEmptyTagsDataProvider')]
+    #[Test]
     public function rawStripEmptyTagsTest(
         string $content,
         string $tagList,
@@ -764,10 +754,8 @@ final class HtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider prefixResourcePathDataProvider
-     */
+    #[DataProvider('prefixResourcePathDataProvider')]
+    #[Test]
     public function prefixResourcePathTest(string $content, string $prefix, string $expectedResult): void
     {
         self::assertSame(
diff --git a/typo3/sysext/core/Tests/Unit/Html/Parser/ParserTest.php b/typo3/sysext/core/Tests/Unit/Html/Parser/ParserTest.php
index e13a0f13520dedfc13de3e069a390d755f122a97..4b8fa6a66be06215b2fa09b52202c753d078dd00 100644
--- a/typo3/sysext/core/Tests/Unit/Html/Parser/ParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/Html/Parser/ParserTest.php
@@ -17,7 +17,10 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Html\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Html\SimpleNode;
+use TYPO3\CMS\Core\Html\SimpleParser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ParserTest extends UnitTestCase
@@ -104,12 +107,12 @@ final class ParserTest extends UnitTestCase
 
     /**
      * @param string[] $expectation
-     * @test
-     * @dataProvider nodesAreResolvedDataProvider
      */
+    #[DataProvider('nodesAreResolvedDataProvider')]
+    #[Test]
     public function nodesAreResolved(string $html, array $expectation): void
     {
-        $parser = \TYPO3\CMS\Core\Html\SimpleParser::fromString($html);
+        $parser = SimpleParser::fromString($html);
         $nodes = array_map(
             static function (SimpleNode $node) {
                 return sprintf('[%s]: %s', self::TYPES[$node->getType()], $node);
diff --git a/typo3/sysext/core/Tests/Unit/Html/RteHtmlParserTest.php b/typo3/sysext/core/Tests/Unit/Html/RteHtmlParserTest.php
index 40979236d58b8180dabe178963f2c547419fb7bf..fc0b40fb1b797d26715d6c1d5fc1f3c2ae26b861 100644
--- a/typo3/sysext/core/Tests/Unit/Html/RteHtmlParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/Html/RteHtmlParserTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Html;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Html\RteHtmlParser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -96,10 +98,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider hrTagCorrectlyTransformedOnWayToDataBaseDataProvider
-     */
+    #[DataProvider('hrTagCorrectlyTransformedOnWayToDataBaseDataProvider')]
+    #[Test]
     public function hrTagCorrectlyTransformedOnWayToDataBase($content, $expectedResult): void
     {
         // @todo Explicitly disabled HTML Sanitizer (since it is based on HTML5)
@@ -174,10 +174,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider hrTagCorrectlyTransformedOnWayToDatabaseAndBackToRteProvider
-     */
+    #[DataProvider('hrTagCorrectlyTransformedOnWayToDatabaseAndBackToRteProvider')]
+    #[Test]
     public function hrTagCorrectlyTransformedOnWayToDatabaseAndBackToRte($content, $expectedResult): void
     {
         // @todo Explicitly disabled HTML Sanitizer (since it is based on HTML5)
@@ -208,10 +206,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider brTagCorrectlyTransformedOnWayToDatabaseAndBackToRteProvider
-     */
+    #[DataProvider('brTagCorrectlyTransformedOnWayToDatabaseAndBackToRteProvider')]
+    #[Test]
     public function brTagCorrectlyTransformedOnWayToDatabaseAndBackToRte($content, $expectedResult): void
     {
         // @todo Explicitly disabled HTML Sanitizer (since it is based on HTML5)
@@ -398,10 +394,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider paragraphCorrectlyTransformedOnWayToDatabaseProvider
-     */
+    #[DataProvider('paragraphCorrectlyTransformedOnWayToDatabaseProvider')]
+    #[Test]
     public function paragraphCorrectlyTransformedOnWayToDatabase($content, $expectedResult): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
@@ -498,10 +492,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider lineBreakCorrectlyTransformedOnWayToRTEProvider
-     */
+    #[DataProvider('lineBreakCorrectlyTransformedOnWayToRTEProvider')]
+    #[Test]
     public function lineBreakCorrectlyTransformedOnWayToRTE($content, $expectedResult): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
@@ -650,10 +642,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider paragraphCorrectlyTransformedOnWayToDatabaseAndBackToRteProvider
-     */
+    #[DataProvider('paragraphCorrectlyTransformedOnWayToDatabaseAndBackToRteProvider')]
+    #[Test]
     public function paragraphCorrectlyTransformedOnWayToDatabaseAndBackToRte($content, $expectedResult): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
@@ -686,10 +676,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider anchorCorrectlyTransformedOnWayToDatabaseProvider
-     */
+    #[DataProvider('anchorCorrectlyTransformedOnWayToDatabaseProvider')]
+    #[Test]
     public function anchorCorrectlyTransformedOnWayToDatabase(string $content, string $expectedResult): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
@@ -722,10 +710,8 @@ final class RteHtmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider anchorCorrectlyTransformedOnWayToDatabaseAndBackToRTEProvider
-     */
+    #[DataProvider('anchorCorrectlyTransformedOnWayToDatabaseAndBackToRTEProvider')]
+    #[Test]
     public function anchorCorrectlyTransformedOnWayToDatabaseAndBackToRTE(string $content, string $expectedResult): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
@@ -733,9 +719,7 @@ final class RteHtmlParserTest extends UnitTestCase
         self::assertEquals($expectedResult, $subject->transformTextForRichTextEditor($subject->transformTextForPersistence($content, $this->procOptions), $this->procOptions));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function allowTagsOutsidePreventsWrappingTaginPTag(): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
@@ -744,9 +728,7 @@ final class RteHtmlParserTest extends UnitTestCase
         self::assertEquals('<p><span>Not allowed outside of p-tag</span></p>', $subject->transformTextForRichTextEditor('<span>Not allowed outside of p-tag</span>', $this->procOptions));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tableAndFigureApplyCorrectlyOutsideOfParagraphTags(): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
@@ -755,9 +737,7 @@ final class RteHtmlParserTest extends UnitTestCase
         self::assertEquals('<figure class="table">' . CRLF . '<table>Allowed outside of p-tag</table>' . CRLF . '<figcaption>My Logo</figcaption></figure>', $subject->transformTextForRichTextEditor('<figure class="table">' . CRLF . '<table>Allowed outside of p-tag</table>' . CRLF . '<figcaption>My Logo</figcaption></figure>', $this->procOptions));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resetsAllowTagsWhenProcessingConfigurationChanges(): void
     {
         $eventDispatcher = $this->createMock(EventDispatcherInterface::class);
diff --git a/typo3/sysext/core/Tests/Unit/Http/ApplicationTypeTest.php b/typo3/sysext/core/Tests/Unit/Http/ApplicationTypeTest.php
index 68131252a45d195d7ea6678a02b76230457b90a7..f499422a178c53b373d2b9b0f0c77770cf231e5f 100644
--- a/typo3/sysext/core/Tests/Unit/Http/ApplicationTypeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/ApplicationTypeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder;
 use TYPO3\CMS\Core\Http\ApplicationType;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ApplicationTypeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function fromRequestThrowsIfTypeIsMissing(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -34,9 +33,7 @@ final class ApplicationTypeTest extends UnitTestCase
         ApplicationType::fromRequest(new ServerRequest());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFrontendReturnsTrueIfFrontend(): void
     {
         self::assertTrue(
@@ -45,9 +42,7 @@ final class ApplicationTypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFrontendReturnsFalseIfNotFrontend(): void
     {
         self::assertFalse(
@@ -56,9 +51,7 @@ final class ApplicationTypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isBackendReturnsTrueIfBackend(): void
     {
         self::assertTrue(
@@ -67,9 +60,7 @@ final class ApplicationTypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isBackendReturnsTrueIfNotBackend(): void
     {
         self::assertFalse(
@@ -78,9 +69,7 @@ final class ApplicationTypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFrontendEnumResolved(): void
     {
         $type = ApplicationType::FRONTEND;
@@ -88,9 +77,7 @@ final class ApplicationTypeTest extends UnitTestCase
         self::assertSame('FE', $type->abbreviate());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isBackendEnumResolved(): void
     {
         $type = ApplicationType::BACKEND;
diff --git a/typo3/sysext/core/Tests/Unit/Http/ClientTest.php b/typo3/sysext/core/Tests/Unit/Http/ClientTest.php
index 78ebd2b5f64e3e10eac34a7146b505dc77d5fb17..89f9d9ee789c79195db823822516085ae5965a24 100644
--- a/typo3/sysext/core/Tests/Unit/Http/ClientTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/ClientTest.php
@@ -25,6 +25,7 @@ use GuzzleHttp\Handler\MockHandler as GuzzleMockHandler;
 use GuzzleHttp\HandlerStack as GuzzleHandlerStack;
 use GuzzleHttp\Middleware as GuzzleMiddleware;
 use GuzzleHttp\Psr7\Response as GuzzleResponse;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Client\ClientExceptionInterface;
 use Psr\Http\Client\ClientInterface;
 use Psr\Http\Client\NetworkExceptionInterface;
@@ -37,18 +38,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ClientTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsr18ClientInterface(): void
     {
         $client = new Client();
         self::assertInstanceOf(ClientInterface::class, $client);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sendRequest(): void
     {
         $transactions = [];
@@ -79,9 +76,7 @@ final class ClientTest extends UnitTestCase
         self::assertSame('Baz', $response2->getHeaderLine('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function requestException(): void
     {
         $request = new Request('https://example.com', 'GET', 'php://temp');
@@ -95,9 +90,7 @@ final class ClientTest extends UnitTestCase
         $client->sendRequest($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function networkException(): void
     {
         $request = new Request('https://example.com', 'GET', 'php://temp');
@@ -111,9 +104,7 @@ final class ClientTest extends UnitTestCase
         $client->sendRequest($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function genericGuzzleException(): void
     {
         $request = new Request('https://example.com', 'GET', 'php://temp');
@@ -127,9 +118,7 @@ final class ClientTest extends UnitTestCase
         $client->sendRequest($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function redirectIsNotHandledRecursivelyButReturnedAsResponse(): void
     {
         $transactions = [];
@@ -148,9 +137,7 @@ final class ClientTest extends UnitTestCase
         self::assertSame('https://example.com', $response->getHeaderLine('Location'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function errorResponsesDoNotThrowAnException(): void
     {
         $mock = new GuzzleMockHandler([
diff --git a/typo3/sysext/core/Tests/Unit/Http/MessageTest.php b/typo3/sysext/core/Tests/Unit/Http/MessageTest.php
index f41c0d1a2b24c84ec33ce57983bf22316486d960..fa89b47106220ab15ac55dffa85e5ea6619e6e0e 100644
--- a/typo3/sysext/core/Tests/Unit/Http/MessageTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/MessageTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\Message;
 use TYPO3\CMS\Core\Http\Stream;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -38,17 +40,13 @@ final class MessageTest extends UnitTestCase
         $this->message = (new Message())->withBody($this->stream);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function protocolHasAcceptableDefault(): void
     {
         self::assertEquals('1.1', $this->message->getProtocolVersion());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function protocolMutatorReturnsCloneWithChanges(): void
     {
         $message = $this->message->withProtocolVersion('1.0');
@@ -56,17 +54,13 @@ final class MessageTest extends UnitTestCase
         self::assertEquals('1.0', $message->getProtocolVersion());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function usesStreamProvidedInConstructorAsBody(): void
     {
         self::assertSame($this->stream, $this->message->getBody());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function bodyMutatorReturnsCloneWithChanges(): void
     {
         $stream = new Stream('php://memory', 'wb+');
@@ -75,9 +69,7 @@ final class MessageTest extends UnitTestCase
         self::assertSame($stream, $message->getBody());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderReturnsHeaderValueAsArray(): void
     {
         $message = $this->message->withHeader('X-Foo', ['Foo', 'Bar']);
@@ -85,9 +77,7 @@ final class MessageTest extends UnitTestCase
         self::assertEquals(['Foo', 'Bar'], $message->getHeader('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineReturnsHeaderValueAsCommaConcatenatedString(): void
     {
         $message = $this->message->withHeader('X-Foo', ['Foo', 'Bar']);
@@ -95,9 +85,7 @@ final class MessageTest extends UnitTestCase
         self::assertEquals('Foo,Bar', $message->getHeaderLine('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeadersKeepsHeaderCaseSensitivity(): void
     {
         $message = $this->message->withHeader('X-Foo', ['Foo', 'Bar']);
@@ -105,9 +93,7 @@ final class MessageTest extends UnitTestCase
         self::assertEquals(['X-Foo' => ['Foo', 'Bar']], $message->getHeaders());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeadersReturnsCaseWithWhichHeaderFirstRegistered(): void
     {
         $message = $this->message
@@ -117,17 +103,13 @@ final class MessageTest extends UnitTestCase
         self::assertEquals(['X-Foo' => ['Foo', 'Bar']], $message->getHeaders());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasHeaderReturnsFalseIfHeaderIsNotPresent(): void
     {
         self::assertFalse($this->message->hasHeader('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasHeaderReturnsTrueIfHeaderIsPresent(): void
     {
         $message = $this->message->withHeader('X-Foo', 'Foo');
@@ -135,9 +117,7 @@ final class MessageTest extends UnitTestCase
         self::assertTrue($message->hasHeader('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addHeaderAppendsToExistingHeader(): void
     {
         $message = $this->message->withHeader('X-Foo', 'Foo');
@@ -147,9 +127,7 @@ final class MessageTest extends UnitTestCase
         self::assertEquals('Foo,Bar', $message2->getHeaderLine('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRemoveHeaders(): void
     {
         $message = $this->message->withHeader('X-Foo', 'Foo');
@@ -161,9 +139,7 @@ final class MessageTest extends UnitTestCase
         self::assertFalse($message2->hasHeader('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function headerRemovalIsCaseInsensitive(): void
     {
         $message = $this->message
@@ -193,10 +169,8 @@ final class MessageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidGeneralHeaderValuesDataProvider
-     */
+    #[DataProvider('invalidGeneralHeaderValuesDataProvider')]
+    #[Test]
     public function withHeaderRaisesExceptionForInvalidNestedHeaderValue($value): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -216,9 +190,7 @@ final class MessageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidHeaderValuesDataProvider
-     */
+    #[DataProvider('invalidHeaderValuesDataProvider')]
     public function withHeaderRaisesExceptionForInvalidValueType($value): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -226,9 +198,7 @@ final class MessageTest extends UnitTestCase
         $this->message->withHeader('X-Foo', $value);
     }
 
-    /**
-     * @dataProvider invalidHeaderValuesDataProvider
-     */
+    #[DataProvider('invalidHeaderValuesDataProvider')]
     public function withAddedHeaderRaisesExceptionForNonStringNonArrayValue($value): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -236,9 +206,7 @@ final class MessageTest extends UnitTestCase
         $this->message->withAddedHeader('X-Foo', $value);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withoutHeaderDoesNothingIfHeaderDoesNotExist(): void
     {
         self::assertFalse($this->message->hasHeader('X-Foo'));
@@ -247,17 +215,13 @@ final class MessageTest extends UnitTestCase
         self::assertFalse($message->hasHeader('X-Foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderReturnsAnEmptyArrayWhenHeaderDoesNotExist(): void
     {
         self::assertSame([], $this->message->getHeader('X-Foo-Bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineReturnsEmptyStringWhenHeaderDoesNotExist(): void
     {
         self::assertSame('', $this->message->getHeaderLine('X-Foo-Bar'));
@@ -288,20 +252,16 @@ final class MessageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider headersWithInjectionVectorsDataProvider
-     * @test
-     */
+    #[DataProvider('headersWithInjectionVectorsDataProvider')]
+    #[Test]
     public function doesNotAllowCRLFInjectionWhenCallingWithHeader($name, $value): void
     {
         $this->expectException(\InvalidArgumentException::class);
         $this->message->withHeader($name, $value);
     }
 
-    /**
-     * @dataProvider headersWithInjectionVectorsDataProvider
-     * @test
-     */
+    #[DataProvider('headersWithInjectionVectorsDataProvider')]
+    #[Test]
     public function doesNotAllowCRLFInjectionWhenCallingWithAddedHeader($name, $value): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Http/MiddlewareDispatcherTest.php b/typo3/sysext/core/Tests/Unit/Http/MiddlewareDispatcherTest.php
index 5b59e20630e48338e37d6e47e2a4fefa6d0df234..9cba2fe4f5956166481792cded8535269326c636 100644
--- a/typo3/sysext/core/Tests/Unit/Http/MiddlewareDispatcherTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/MiddlewareDispatcherTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
@@ -30,9 +31,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MiddlewareDispatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function executesKernelWithEmptyMiddlewareStack(): void
     {
         $kernel = new class () implements RequestHandlerInterface {
@@ -48,9 +47,7 @@ final class MiddlewareDispatcherTest extends UnitTestCase
         self::assertSame(204, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function executesMiddlewaresLastInFirstOut(): void
     {
         $kernel = new class () implements RequestHandlerInterface {
@@ -93,9 +90,7 @@ final class MiddlewareDispatcherTest extends UnitTestCase
         self::assertSame(204, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function doesNotInstantiateLazyMiddlewareInCaseOfAnEarlyReturningOuterMiddleware(): void
     {
         $kernel = new class () implements RequestHandlerInterface {
@@ -119,9 +114,7 @@ final class MiddlewareDispatcherTest extends UnitTestCase
         self::assertSame(404, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionForLazyNonMiddlewareInterfaceClasses(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -140,9 +133,7 @@ final class MiddlewareDispatcherTest extends UnitTestCase
         $dispatcher->handle(new ServerRequest());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canBeExecutedMultipleTimes(): void
     {
         $kernel = new class () implements RequestHandlerInterface {
@@ -168,9 +159,7 @@ final class MiddlewareDispatcherTest extends UnitTestCase
         self::assertSame(204, $response2->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canBeReExecutedRecursivelyDuringDispatch(): void
     {
         $kernel = new class () implements RequestHandlerInterface {
@@ -208,9 +197,7 @@ final class MiddlewareDispatcherTest extends UnitTestCase
         self::assertSame(['nested', 'outer'], $response->getHeader('X-TRACE'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fetchesMiddlewareFromContainer(): void
     {
         $kernel = new class () implements RequestHandlerInterface {
diff --git a/typo3/sysext/core/Tests/Unit/Http/MiddlewareStackResolverTest.php b/typo3/sysext/core/Tests/Unit/Http/MiddlewareStackResolverTest.php
index f3093c3a4cfbabece158182c03f7365b373eff23..11c8bddcaf581e2c870860045f681b4056eaebc3 100644
--- a/typo3/sysext/core/Tests/Unit/Http/MiddlewareStackResolverTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/MiddlewareStackResolverTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Http\MiddlewareStackResolver;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MiddlewareStackResolverTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveReturnsMiddlewareStack(): void
     {
         $middlewares = new \ArrayObject(array_replace_recursive(
@@ -53,9 +52,7 @@ final class MiddlewareStackResolverTest extends UnitTestCase
         self::assertEquals($expected, $subject->resolve('testStack'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveReturnsEmptyMiddlewareStackForZeroPackages(): void
     {
         $middlewares = new \ArrayObject();
@@ -75,9 +72,7 @@ final class MiddlewareStackResolverTest extends UnitTestCase
         self::assertEquals($expected, $subject->resolve('testStack'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveAllowsDisablingAMiddleware(): void
     {
         $middlewares = new \ArrayObject(array_replace_recursive(
@@ -103,9 +98,7 @@ final class MiddlewareStackResolverTest extends UnitTestCase
         self::assertEquals($expected, $subject->resolve('testStack'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveAllowsReplacingAMiddleware(): void
     {
         $middlewares = new \ArrayObject(array_replace_recursive(
diff --git a/typo3/sysext/core/Tests/Unit/Http/NormalizedParamsTest.php b/typo3/sysext/core/Tests/Unit/Http/NormalizedParamsTest.php
index b0fa6f10d8660ca73e52049b8e13832cf2663dd3..06f46a665bbdb55f97b65c4aff721d0f015bbadd 100644
--- a/typo3/sysext/core/Tests/Unit/Http/NormalizedParamsTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/NormalizedParamsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\NormalizedParams;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -120,10 +122,8 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getHttpHostReturnsSanitizedValueDataProvider
-     */
+    #[DataProvider('getHttpHostReturnsSanitizedValueDataProvider')]
+    #[Test]
     public function getHttpHostReturnsSanitizedValue(array $serverParams, array $configuration, string $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, $configuration, '', '');
@@ -323,19 +323,15 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isHttpsReturnSanitizedValueDataProvider
-     */
+    #[DataProvider('isHttpsReturnSanitizedValueDataProvider')]
+    #[Test]
     public function isHttpsReturnSanitizedValue(array $serverParams, array $configuration, bool $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, $configuration, '', '');
         self::assertSame($expected, $serverRequestParameters->isHttps());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestHostReturnsRequestHost(): void
     {
         $serverParams = [
@@ -400,10 +396,8 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getScriptNameReturnsExpectedValueDataProvider
-     */
+    #[DataProvider('getScriptNameReturnsExpectedValueDataProvider')]
+    #[Test]
     public function getScriptNameReturnsExpectedValue(array $serverParams, array $configuration, string $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, $configuration, '', '');
@@ -501,19 +495,15 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getRequestUriReturnsExpectedValueDataProvider
-     */
+    #[DataProvider('getRequestUriReturnsExpectedValueDataProvider')]
+    #[Test]
     public function getRequestUriReturnsExpectedValue(array $serverParams, array $configuration, string $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, $configuration, '', '');
         self::assertSame($expected, $serverRequestParameters->getRequestUri());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestUriFetchesFromConfiguredRequestUriVar(): void
     {
         $GLOBALS['foo']['bar'] = '/foo/bar.php';
@@ -528,9 +518,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getRequestUri());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestUrlReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -542,9 +530,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getRequestUrl());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestScriptReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -556,9 +542,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getRequestScript());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestDirReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -616,10 +600,8 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isBehindReverseProxyReturnsExpectedValueDataProvider
-     */
+    #[DataProvider('isBehindReverseProxyReturnsExpectedValueDataProvider')]
+    #[Test]
     public function isBehindReverseProxyReturnsExpectedValue(array $serverParams, array $configuration, bool $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, $configuration, '', '');
@@ -679,10 +661,8 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getRemoteAddressReturnsExpectedValueDataProvider
-     */
+    #[DataProvider('getRemoteAddressReturnsExpectedValueDataProvider')]
+    #[Test]
     public function getRemoteAddressReturnsExpectedValue(array $serverParams, array $configuration, string $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, $configuration, '', '');
@@ -743,10 +723,8 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getRequestHostOnlyReturnsExpectedValueDataProvider
-     */
+    #[DataProvider('getRequestHostOnlyReturnsExpectedValueDataProvider')]
+    #[Test]
     public function getRequestHostOnlyReturnsExpectedValue(array $serverParams, string $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, [], '', '');
@@ -807,19 +785,15 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getRequestPortOnlyReturnsExpectedValueDataProvider
-     */
+    #[DataProvider('getRequestPortOnlyReturnsExpectedValueDataProvider')]
+    #[Test]
     public function getRequestPortReturnsExpectedValue(array $serverParams, int $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, [], '', '');
         self::assertSame($expected, $serverRequestParameters->getRequestPort());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getScriptFilenameReturnsThirdConstructorArgument(): void
     {
         $serverParams = [
@@ -831,9 +805,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame('/var/www/typo3/index.php', $serverRequestParameters->getScriptFilename());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDocumentRootReturnsExpectedPath(): void
     {
         $serverParams = [
@@ -847,9 +819,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getDocumentRoot());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSiteUrlReturnsExpectedUrl(): void
     {
         $serverParams = [
@@ -863,9 +833,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getSiteUrl());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSiteUrlReturnsExpectedUrlForCliCommand(): void
     {
         $serverParams = [];
@@ -909,10 +877,8 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getSitePathReturnsExpectedPathDataProvider
-     */
+    #[DataProvider('getSitePathReturnsExpectedPathDataProvider')]
+    #[Test]
     public function getSitePathReturnsExpectedPath(array $serverParams, string $pathThisScript, string $pathSite, string $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, [], $pathThisScript, $pathSite);
@@ -958,19 +924,15 @@ final class NormalizedParamsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getSiteScriptReturnsExpectedPathDataProvider
-     */
+    #[DataProvider('getSiteScriptReturnsExpectedPathDataProvider')]
+    #[Test]
     public function getSiteScriptReturnsExpectedPath(array $serverParams, string $pathThisScript, string $pathSite, string $expected): void
     {
         $serverRequestParameters = new NormalizedParams($serverParams, [], $pathThisScript, $pathSite);
         self::assertSame($expected, $serverRequestParameters->getSiteScript());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathInfoReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -981,9 +943,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getPathInfo());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHttpRefererReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -994,9 +954,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getHttpReferer());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHttpUserAgentReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -1007,9 +965,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getHttpUserAgent());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHttpAcceptEncodingReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -1020,9 +976,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getHttpAcceptEncoding());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHttpAcceptLanguageReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -1033,9 +987,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getHttpAcceptLanguage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRemoteHostReturnsExpectedValue(): void
     {
         $serverParams = [
@@ -1046,9 +998,7 @@ final class NormalizedParamsTest extends UnitTestCase
         self::assertSame($expected, $serverRequestParameters->getRemoteHost());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getQueryStringReturnsExpectedValue(): void
     {
         $serverParams = [
diff --git a/typo3/sysext/core/Tests/Unit/Http/RedirectResponseTest.php b/typo3/sysext/core/Tests/Unit/Http/RedirectResponseTest.php
index 480350e20ab7b55eceeecad56d2319a9865ba4f3..c532503813e1456d81ce3e84239c963e09f3f7e8 100644
--- a/typo3/sysext/core/Tests/Unit/Http/RedirectResponseTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/RedirectResponseTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\RedirectResponse;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RedirectResponseTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeadersReturnsLocationUrlSetByConstructorArgument(): void
     {
         $subject = new RedirectResponse('theRedirectUrl');
@@ -36,9 +35,7 @@ final class RedirectResponseTest extends UnitTestCase
         self::assertSame($expected, $subject->getHeaders());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderReturnsLocationUrlSetByConstructorArgument(): void
     {
         $subject = new RedirectResponse('theRedirectUrl');
@@ -48,9 +45,7 @@ final class RedirectResponseTest extends UnitTestCase
         self::assertSame($expected, $subject->getHeader('location'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeadersReturnsHeaderSetByConstructorArgument(): void
     {
         $input = [
@@ -72,9 +67,7 @@ final class RedirectResponseTest extends UnitTestCase
         self::assertSame($expected, $subject->getHeaders());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderReturnsHeaderSetByConstructorArgument(): void
     {
         $input = [
@@ -87,9 +80,7 @@ final class RedirectResponseTest extends UnitTestCase
         self::assertSame($expected, $subject->getHeader('lowercasedheadername'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderReturnsHeaderSetByConstructorArgumentLowerCased(): void
     {
         $input = [
diff --git a/typo3/sysext/core/Tests/Unit/Http/RequestFactoryTest.php b/typo3/sysext/core/Tests/Unit/Http/RequestFactoryTest.php
index 052d31f59c064258d639d7c6a700c5146066fa22..dd20d4269c40da9e222345b0aaec893b150a57f0 100644
--- a/typo3/sysext/core/Tests/Unit/Http/RequestFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/RequestFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\RequestFactoryInterface;
 use Psr\Http\Message\RequestInterface;
 use TYPO3\CMS\Core\Http\Client\GuzzleClientFactory;
@@ -28,18 +29,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class RequestFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsr17FactoryInterface(): void
     {
         $factory = new RequestFactory(new GuzzleClientFactory());
         self::assertInstanceOf(RequestFactoryInterface::class, $factory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function requestHasMethodSet(): void
     {
         $factory = new RequestFactory(new GuzzleClientFactory());
@@ -47,9 +44,7 @@ final class RequestFactoryTest extends UnitTestCase
         self::assertSame('POST', $request->getMethod());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function requestFactoryHasAWritableEmptyBody(): void
     {
         $factory = new RequestFactory(new GuzzleClientFactory());
@@ -67,9 +62,7 @@ final class RequestFactoryTest extends UnitTestCase
         self::assertSame('Foo', $body->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function raisesExceptionForInvalidMethod(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Http/RequestTest.php b/typo3/sysext/core/Tests/Unit/Http/RequestTest.php
index 26a85b168f1f5bf821abe2c6196cd64b19616439..6579d6cf88e19caeec688e7545bd9d4ddcd02817 100644
--- a/typo3/sysext/core/Tests/Unit/Http/RequestTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/RequestTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\StreamInterface;
 use TYPO3\CMS\Core\Http\Request;
 use TYPO3\CMS\Core\Http\Stream;
@@ -38,17 +40,13 @@ final class RequestTest extends UnitTestCase
         $this->request = new Request();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMethodIsGetByDefault(): void
     {
         self::assertEquals('GET', $this->request->getMethod());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMethodMutatorReturnsCloneWithChangedMethod(): void
     {
         $request = $this->request->withMethod('GET');
@@ -56,9 +54,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals('GET', $request->getMethod());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withUriReturnsNewInstanceWithNewUri(): void
     {
         $request = $this->request->withUri(new Uri('https://example.com:10082/foo/bar?baz=bat'));
@@ -69,9 +65,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals('/baz/bat?foo=bar', (string)$request2->getUri());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorCanAcceptAllMessageParts(): void
     {
         $uri = new Uri('http://example.com/');
@@ -96,9 +90,7 @@ final class RequestTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorRaisesExceptionForInvalidMethodByString(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -118,10 +110,8 @@ final class RequestTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidRequestBodyDataProvider
-     * @test
-     */
+    #[DataProvider('invalidRequestBodyDataProvider')]
+    #[Test]
     public function constructorRaisesExceptionForInvalidBody($body): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -141,17 +131,15 @@ final class RequestTest extends UnitTestCase
 
     /**
      * @param resource|StreamInterface|string|null $body
-     * @dataProvider validRequestBodyDataProvider
-     * @test
      */
+    #[DataProvider('validRequestBodyDataProvider')]
+    #[Test]
     public function constructorDoesNotRaiseExceptionForValidBody($body): void
     {
         new Request(null, 'GET', $body);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorIgnoresInvalidHeaders(): void
     {
         $headers = [
@@ -177,18 +165,14 @@ final class RequestTest extends UnitTestCase
         self::assertEquals($expected, $request->getHeaders());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestTargetIsSlashWhenNoUriPresent(): void
     {
         $request = new Request();
         self::assertEquals('/', $request->getRequestTarget());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestTargetIsSlashWhenUriHasNoPathOrQuery(): void
     {
         $request = (new Request())
@@ -226,10 +210,8 @@ final class RequestTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider requestsWithUriDataProvider
-     * @test
-     */
+    #[DataProvider('requestsWithUriDataProvider')]
+    #[Test]
     public function getRequestTargetWhenUriIsPresent($request, $expected): void
     {
         self::assertEquals($expected, $request->getRequestTarget());
@@ -247,19 +229,15 @@ final class RequestTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider validRequestTargetsDataProvider
-     * @test
-     */
+    #[DataProvider('validRequestTargetsDataProvider')]
+    #[Test]
     public function getRequestTargetCanProvideARequestTarget($requestTarget): void
     {
         $request = (new Request())->withRequestTarget($requestTarget);
         self::assertEquals($requestTarget, $request->getRequestTarget());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withRequestTargetCannotContainWhitespace(): void
     {
         $request = new Request();
@@ -268,9 +246,7 @@ final class RequestTest extends UnitTestCase
         $request->withRequestTarget('foo bar baz');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestTargetDoesNotCacheBetweenInstances(): void
     {
         $request = (new Request())->withUri(new Uri('https://example.com/foo/bar'));
@@ -279,9 +255,7 @@ final class RequestTest extends UnitTestCase
         self::assertNotEquals($original, $newRequest->getRequestTarget());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRequestTargetIsResetWithNewUri(): void
     {
         $request = (new Request())->withUri(new Uri('https://example.com/foo/bar'));
@@ -289,9 +263,7 @@ final class RequestTest extends UnitTestCase
         $request->withUri(new Uri('http://mwop.net/bar/baz'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeadersContainsHostHeaderIfUriWithHostIsPresent(): void
     {
         $request = new Request('http://example.com');
@@ -300,9 +272,7 @@ final class RequestTest extends UnitTestCase
         self::assertContains('example.com', $headers['host']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeadersContainsNoHostHeaderIfNoUriPresent(): void
     {
         $request = new Request();
@@ -310,9 +280,7 @@ final class RequestTest extends UnitTestCase
         self::assertArrayNotHasKey('host', $headers);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeadersContainsNoHostHeaderIfUriDoesNotContainHost(): void
     {
         $request = new Request(new Uri());
@@ -320,9 +288,7 @@ final class RequestTest extends UnitTestCase
         self::assertArrayNotHasKey('host', $headers);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderWithHostReturnsUriHostWhenPresent(): void
     {
         $request = new Request('http://example.com');
@@ -330,27 +296,21 @@ final class RequestTest extends UnitTestCase
         self::assertEquals(['example.com'], $header);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderWithHostReturnsEmptyArrayIfNoUriPresent(): void
     {
         $request = new Request();
         self::assertSame([], $request->getHeader('host'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderWithHostReturnsEmptyArrayIfUriDoesNotContainHost(): void
     {
         $request = new Request(new Uri());
         self::assertSame([], $request->getHeader('host'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineWithHostReturnsUriHostWhenPresent(): void
     {
         $request = new Request('http://example.com');
@@ -358,27 +318,21 @@ final class RequestTest extends UnitTestCase
         self::assertStringContainsString('example.com', $header);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineWithHostReturnsEmptyStringIfNoUriPresent(): void
     {
         $request = new Request();
         self::assertSame('', $request->getHeaderLine('host'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineWithHostReturnsEmptyStringIfUriDoesNotContainHost(): void
     {
         $request = new Request(new Uri());
         self::assertSame('', $request->getHeaderLine('host'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineWithHostTakesPrecedenceOverModifiedUri(): void
     {
         $request = (new Request())
@@ -390,9 +344,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals('example.com', $new->getHeaderLine('Host'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineWithHostTakesPrecedenceOverEmptyUri(): void
     {
         $request = (new Request())
@@ -404,9 +356,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals('example.com', $new->getHeaderLine('Host'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderLineWithHostDoesNotTakePrecedenceOverHostWithPortFromUri(): void
     {
         $request = (new Request())
@@ -431,10 +381,8 @@ final class RequestTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider headersWithUpperAndLowerCaseValuesDataProvider
-     */
+    #[DataProvider('headersWithUpperAndLowerCaseValuesDataProvider')]
+    #[Test]
     public function headerCanBeRetrieved($header, $value, $expected): void
     {
         $request = new Request(null, 'GET', 'php://memory', [$header => $value]);
@@ -460,28 +408,22 @@ final class RequestTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider headersWithInjectionVectorsDataProvider
-     */
+    #[DataProvider('headersWithInjectionVectorsDataProvider')]
+    #[Test]
     public function constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value): void
     {
         $this->expectException(\InvalidArgumentException::class);
         new Request(null, 'GET', 'php://memory', [$name => $value]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function supportedRequestMethodsWork(): void
     {
         $request = new Request('some-uri', 'PURGE');
         self::assertEquals('PURGE', $request->getMethod());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonSupportedRequestMethodsRaisesException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Http/ResponseFactoryTest.php b/typo3/sysext/core/Tests/Unit/Http/ResponseFactoryTest.php
index c9720637f75102bdd6f71f29340ad5d917ca2280..3e258aa0414a7f6d08dfe8ee3f96b0f66af9c1c8 100644
--- a/typo3/sysext/core/Tests/Unit/Http/ResponseFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/ResponseFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ResponseFactoryInterface;
 use TYPO3\CMS\Core\Http\ResponseFactory;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -26,18 +27,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ResponseFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsr17FactoryInterface(): void
     {
         $factory = new ResponseFactory();
         self::assertInstanceOf(ResponseFactoryInterface::class, $factory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function responseHasStatusCode200ByDefault(): void
     {
         $factory = new ResponseFactory();
@@ -45,9 +42,7 @@ final class ResponseFactoryTest extends UnitTestCase
         self::assertSame(200, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function responseHasStatusCodeSet(): void
     {
         $factory = new ResponseFactory();
@@ -55,9 +50,7 @@ final class ResponseFactoryTest extends UnitTestCase
         self::assertSame(201, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function responseHasDefaultReasonPhrase(): void
     {
         $factory = new ResponseFactory();
@@ -65,9 +58,7 @@ final class ResponseFactoryTest extends UnitTestCase
         self::assertSame('Moved Permanently', $response->getReasonPhrase());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function responseHasCustomReasonPhrase(): void
     {
         $factory = new ResponseFactory();
diff --git a/typo3/sysext/core/Tests/Unit/Http/ResponseTest.php b/typo3/sysext/core/Tests/Unit/Http/ResponseTest.php
index 97b404e94ba2358bfdf8b45273e30cd01ad0a83b..798ce10f9dcc548ead2df8e1bbeba1aee7fb2e0a 100644
--- a/typo3/sysext/core/Tests/Unit/Http/ResponseTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/ResponseTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\Response;
 use TYPO3\CMS\Core\Http\Stream;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -31,17 +33,13 @@ final class ResponseTest extends UnitTestCase
         $this->response = new Response();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function statusCodeIs200ByDefault(): void
     {
         self::assertEquals(200, $this->response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function statusCodeMutatorReturnsCloneWithChanges(): void
     {
         $response = $this->response->withStatus(400);
@@ -57,46 +55,36 @@ final class ResponseTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidStatusCodesDataProvider
-     */
+    #[DataProvider('invalidStatusCodesDataProvider')]
+    #[Test]
     public function cannotSetInvalidStatusCode($code): void
     {
         $this->expectException(\InvalidArgumentException::class);
         $this->response->withStatus($code);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function reasonPhraseDefaultsToStandards(): void
     {
         $response = $this->response->withStatus(422);
         self::assertEquals('Unprocessable Entity', $response->getReasonPhrase());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canSetCustomReasonPhrase(): void
     {
         $response = $this->response->withStatus(422, 'Foo Bar!');
         self::assertEquals('Foo Bar!', $response->getReasonPhrase());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorRaisesExceptionForInvalidStream(): void
     {
         $this->expectException(\InvalidArgumentException::class);
         new Response(['TOTALLY INVALID']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorCanAcceptAllMessageParts(): void
     {
         $body = new Stream('php://memory');
@@ -119,10 +107,8 @@ final class ResponseTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidStatusDataProvider
-     */
+    #[DataProvider('invalidStatusDataProvider')]
+    #[Test]
     public function constructorRaisesExceptionForInvalidStatus($code): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -142,10 +128,8 @@ final class ResponseTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidResponseBodyDataProvider
-     */
+    #[DataProvider('invalidResponseBodyDataProvider')]
+    #[Test]
     public function constructorRaisesExceptionForInvalidBody($body): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -153,9 +137,7 @@ final class ResponseTest extends UnitTestCase
         new Response($body);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorIgnoresInvalidHeaders(): void
     {
         $headers = [
@@ -199,19 +181,15 @@ final class ResponseTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider headersWithInjectionVectorsDataProvider
-     */
+    #[DataProvider('headersWithInjectionVectorsDataProvider')]
+    #[Test]
     public function constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value): void
     {
         $this->expectException(\InvalidArgumentException::class);
         new Response('php://memory', 200, [$name => $value]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderReturnsHeaderSetByConstructorArgument(): void
     {
         $subject = new Response('php://memory', 200, ['location' => 'foo']);
diff --git a/typo3/sysext/core/Tests/Unit/Http/Security/ReferrerEnforcerTest.php b/typo3/sysext/core/Tests/Unit/Http/Security/ReferrerEnforcerTest.php
index e5a527302651d2fc5eb5ed7c12d17ff8985a0d79..32b23da33c500f47dc3dd498c70a4646af75107b 100644
--- a/typo3/sysext/core/Tests/Unit/Http/Security/ReferrerEnforcerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/Security/ReferrerEnforcerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http\Security;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Core\Http\NormalizedParams;
 use TYPO3\CMS\Core\Http\Security\InvalidReferrerException;
@@ -109,10 +111,9 @@ final class ReferrerEnforcerTest extends UnitTestCase
 
     /**
      * @param string[]|null $options
-     *
-     * @test
-     * @dataProvider validReferrerIsHandledDataProvider
      */
+    #[DataProvider('validReferrerIsHandledDataProvider')]
+    #[Test]
     public function validReferrerIsHandled(string $requestUri, string $referrer, ?array $options, ?string $expectedResponse): void
     {
         $subject = $this->buildSubject($requestUri, $referrer);
@@ -153,9 +154,9 @@ final class ReferrerEnforcerTest extends UnitTestCase
 
     /**
      * @param string[]|null $options
-     * @test
-     * @dataProvider invalidReferrerIsHandledDataProvider
      */
+    #[DataProvider('invalidReferrerIsHandledDataProvider')]
+    #[Test]
     public function invalidReferrerIsHandled(string $requestUri, string $referrer, ?array $options): void
     {
         $this->expectException(InvalidReferrerException::class);
@@ -164,9 +165,7 @@ final class ReferrerEnforcerTest extends UnitTestCase
         $subject->handle($options);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function missingReferrerIsHandled(): void
     {
         $this->expectException(MissingReferrerException::class);
@@ -178,9 +177,7 @@ final class ReferrerEnforcerTest extends UnitTestCase
         $subject->handle();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonceIsAppliedToResponse(): void
     {
         $nonce = new ConsumableNonce();
diff --git a/typo3/sysext/core/Tests/Unit/Http/ServerRequestFactoryTest.php b/typo3/sysext/core/Tests/Unit/Http/ServerRequestFactoryTest.php
index 47c035f4effb8f2ab3ecd11416bea0ee74970dc5..86154b97adf79eff2bd7d161445ca74ef840b8a7 100644
--- a/typo3/sysext/core/Tests/Unit/Http/ServerRequestFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/ServerRequestFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ServerRequestFactoryInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -29,18 +30,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ServerRequestFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsr17FactoryInterface(): void
     {
         $factory = new ServerRequestFactory();
         self::assertInstanceOf(ServerRequestFactoryInterface::class, $factory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function serverRequestHasMethodSet(): void
     {
         $factory = new ServerRequestFactory();
@@ -48,9 +45,7 @@ final class ServerRequestFactoryTest extends UnitTestCase
         self::assertSame('POST', $request->getMethod());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function serverRequestFactoryHasAWritableEmptyBody(): void
     {
         $factory = new ServerRequestFactory();
@@ -68,9 +63,7 @@ final class ServerRequestFactoryTest extends UnitTestCase
         self::assertSame('Foo', $body->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function raisesExceptionForInvalidMethod(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -79,9 +72,7 @@ final class ServerRequestFactoryTest extends UnitTestCase
         $factory->createServerRequest('BOGUS-BODY', '/');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uploadedFilesAreNormalizedFromFilesSuperGlobal(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -144,9 +135,7 @@ final class ServerRequestFactoryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uploadedFilesAreNotCreatedForEmptyFilesArray(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -160,9 +149,7 @@ final class ServerRequestFactoryTest extends UnitTestCase
         self::assertEmpty($uploadedFiles);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uploadedFilesAreNotCreatedIfTmpNameIsEmpty(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
@@ -183,9 +170,7 @@ final class ServerRequestFactoryTest extends UnitTestCase
         self::assertEmpty($uploadedFiles);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function handlesNumericKeys(): void
     {
         $_SERVER['HTTP_HOST'] = 'localhost';
diff --git a/typo3/sysext/core/Tests/Unit/Http/ServerRequestTest.php b/typo3/sysext/core/Tests/Unit/Http/ServerRequestTest.php
index 668c893b0d6284967faada2584c017498323ebce..fbcb9ea72eaf2f60f47071773a714052a8ea0d0f 100644
--- a/typo3/sysext/core/Tests/Unit/Http/ServerRequestTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/ServerRequestTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Http\UploadedFile;
 use TYPO3\CMS\Core\Http\Uri;
@@ -37,25 +38,19 @@ final class ServerRequestTest extends UnitTestCase
         $this->request = new ServerRequest();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getServerParamsAreEmptyByDefault(): void
     {
         self::assertEmpty($this->request->getServerParams());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getQueryParamsAreEmptyByDefault(): void
     {
         self::assertEmpty($this->request->getQueryParams());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withQueryParamsMutatorReturnsCloneWithChanges(): void
     {
         $value = ['foo' => 'bar'];
@@ -64,17 +59,13 @@ final class ServerRequestTest extends UnitTestCase
         self::assertEquals($value, $request->getQueryParams());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCookieParamsAreEmptyByDefault(): void
     {
         self::assertEmpty($this->request->getCookieParams());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withCookieParamsMutatorReturnsCloneWithChanges(): void
     {
         $value = ['foo' => 'bar'];
@@ -83,25 +74,19 @@ final class ServerRequestTest extends UnitTestCase
         self::assertEquals($value, $request->getCookieParams());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUploadedFilesAreEmptyByDefault(): void
     {
         self::assertEmpty($this->request->getUploadedFiles());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParsedBodyIsEmptyByDefault(): void
     {
         self::assertEmpty($this->request->getParsedBody());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withParsedBodyMutatorReturnsCloneWithChanges(): void
     {
         $value = ['foo' => 'bar'];
@@ -110,17 +95,13 @@ final class ServerRequestTest extends UnitTestCase
         self::assertEquals($value, $request->getParsedBody());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAttributesAreEmptyByDefault(): void
     {
         self::assertEmpty($this->request->getAttributes());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withAttributeMutatorReturnsCloneWithChanges(): ServerRequest
     {
         $request = $this->request->withAttribute('foo', 'bar');
@@ -130,9 +111,7 @@ final class ServerRequestTest extends UnitTestCase
         return $request;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withoutAttributeReturnsCloneWithoutAttribute(): void
     {
         $request = $this->request;
@@ -141,9 +120,7 @@ final class ServerRequestTest extends UnitTestCase
         self::assertNull($new->getAttribute('foo', null));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorUsesProvidedArguments(): void
     {
         $server = [
diff --git a/typo3/sysext/core/Tests/Unit/Http/StreamFactoryTest.php b/typo3/sysext/core/Tests/Unit/Http/StreamFactoryTest.php
index 7a838d5cd09908055b4dea10b67097473410a02f..fdd41521c5ed431d00aebd85f8d382dc9bf07052 100644
--- a/typo3/sysext/core/Tests/Unit/Http/StreamFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/StreamFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\StreamFactoryInterface;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Http\StreamFactory;
@@ -41,18 +42,14 @@ final class StreamFactoryTest extends UnitTestCase
         return $path;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsr17FactoryInterface(): void
     {
         $factory = new StreamFactory();
         self::assertInstanceOf(StreamFactoryInterface::class, $factory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamReturnsEmptyStreamByDefault(): void
     {
         $factory = new StreamFactory();
@@ -60,9 +57,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('', $stream->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamFromEmptyString(): void
     {
         $factory = new StreamFactory();
@@ -70,9 +65,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('', $stream->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamFromNonEmptyString(): void
     {
         $factory = new StreamFactory();
@@ -80,9 +73,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('Foo', $stream->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamReturnsWritableStream(): void
     {
         $factory = new StreamFactory();
@@ -91,9 +82,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('Foo', $stream->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamReturnsAppendableStream(): void
     {
         $factory = new StreamFactory();
@@ -102,9 +91,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('FooBar', $stream->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamFromFile(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -115,9 +102,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('Foo', $stream->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamFromFileWithMode(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -130,9 +115,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('Foo', $contents);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamFromFileWithInvalidMode(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -144,9 +127,7 @@ final class StreamFactoryTest extends UnitTestCase
         $factory->createStreamFromFile($fileName, 'z');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamFromFileWithMissingFile(): void
     {
         $unavailableFileName = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('test_');
@@ -156,9 +137,7 @@ final class StreamFactoryTest extends UnitTestCase
         $factory->createStreamFromFile($unavailableFileName, 'r');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamFromResource(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -172,9 +151,7 @@ final class StreamFactoryTest extends UnitTestCase
         self::assertSame('Foo', $stream->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createStreamResourceFromInvalidResource(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Http/StreamTest.php b/typo3/sysext/core/Tests/Unit/Http/StreamTest.php
index 07ec60cbe23e1397d573290cf525c5d48ca10df4..5115f40b9dea8ab8e8ab74551d05804d264a9f2c 100644
--- a/typo3/sysext/core/Tests/Unit/Http/StreamTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/StreamTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Http\Stream;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -37,17 +39,13 @@ final class StreamTest extends UnitTestCase
         return $path;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canInstantiateWithStreamIdentifier(): void
     {
         self::assertInstanceOf(Stream::class, new Stream('php://memory', 'wb+'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canInstantiateWithStreamResource(): void
     {
         $resource = fopen('php://memory', 'wb+');
@@ -55,9 +53,7 @@ final class StreamTest extends UnitTestCase
         self::assertInstanceOf(Stream::class, $subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isReadableReturnsFalseIfStreamIsNotReadable(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -66,18 +62,14 @@ final class StreamTest extends UnitTestCase
         self::assertFalse($subject->isReadable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isWritableReturnsFalseIfStreamIsNotWritable(): void
     {
         $subject = new Stream('php://memory', 'r');
         self::assertFalse($subject->isWritable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toStringRetrievesFullContentsOfStream(): void
     {
         $message = 'foo bar';
@@ -86,9 +78,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals($message, (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function detachReturnsResource(): void
     {
         $resource = fopen('php://memory', 'wb+');
@@ -96,18 +86,14 @@ final class StreamTest extends UnitTestCase
         self::assertSame($resource, $subject->detach());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorRaisesExceptionWhenPassingInvalidStreamResource(): void
     {
         $this->expectException(\InvalidArgumentException::class);
         new Stream(['  THIS WILL NOT WORK  ']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toStringSerializationReturnsEmptyStringWhenStreamIsNotReadable(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -117,9 +103,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals('', $subject->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function closeClosesResource(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -132,9 +116,7 @@ final class StreamTest extends UnitTestCase
         self::assertFalse($isResource);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function closeUnsetsResource(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -145,9 +127,7 @@ final class StreamTest extends UnitTestCase
         self::assertNull($subject->detach());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function closeDoesNothingAfterDetach(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -160,9 +140,7 @@ final class StreamTest extends UnitTestCase
         self::assertSame($resource, $detached);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSizeReportsNullWhenNoResourcePresent(): void
     {
         $subject = new Stream('php://memory', 'wb+');
@@ -170,9 +148,7 @@ final class StreamTest extends UnitTestCase
         self::assertNull($subject->getSize());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tellReportsCurrentPositionInResource(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -183,9 +159,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals(2, $subject->tell());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tellRaisesExceptionIfResourceIsDetached(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -199,9 +173,7 @@ final class StreamTest extends UnitTestCase
         $subject->tell();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function eofReportsFalseWhenNotAtEndOfStream(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -212,9 +184,7 @@ final class StreamTest extends UnitTestCase
         self::assertFalse($subject->eof());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function eofReportsTrueWhenAtEndOfStream(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -227,9 +197,7 @@ final class StreamTest extends UnitTestCase
         self::assertTrue($subject->eof());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function eofReportsTrueWhenStreamIsDetached(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -241,9 +209,7 @@ final class StreamTest extends UnitTestCase
         self::assertTrue($subject->eof());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isSeekableReturnsTrueForReadableStreams(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -253,9 +219,7 @@ final class StreamTest extends UnitTestCase
         self::assertTrue($subject->isSeekable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isSeekableReturnsFalseForDetachedStreams(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -266,9 +230,7 @@ final class StreamTest extends UnitTestCase
         self::assertFalse($subject->isSeekable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function seekAdvancesToGivenOffsetOfStream(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -279,9 +241,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals(2, $subject->tell());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rewindResetsToStartOfStream(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -293,9 +253,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals(0, $subject->tell());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function seekRaisesExceptionWhenStreamIsDetached(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -308,9 +266,7 @@ final class StreamTest extends UnitTestCase
         $subject->seek(2);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isWritableReturnsFalseWhenStreamIsDetached(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -321,9 +277,7 @@ final class StreamTest extends UnitTestCase
         self::assertFalse($subject->isWritable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function writeRaisesExceptionWhenStreamIsDetached(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -336,9 +290,7 @@ final class StreamTest extends UnitTestCase
         $subject->write('bar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isReadableReturnsFalseWhenStreamIsDetached(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -349,9 +301,7 @@ final class StreamTest extends UnitTestCase
         self::assertFalse($subject->isReadable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function readRaisesExceptionWhenStreamIsDetached(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -364,9 +314,7 @@ final class StreamTest extends UnitTestCase
         $subject->read(4096);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function readReturnsEmptyStringWhenAtEndOfFile(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -379,9 +327,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals('', $subject->read(4096));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContentsReturnsEmptyStringIfStreamIsNotReadable(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -404,10 +350,8 @@ final class StreamTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidResourcesDataProvider
-     * @test
-     */
+    #[DataProvider('invalidResourcesDataProvider')]
+    #[Test]
     public function attachWithNonStringNonResourceRaisesExceptionByType($resource): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -416,9 +360,7 @@ final class StreamTest extends UnitTestCase
         $subject->attach($resource);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attachWithNonStringNonResourceRaisesExceptionByString(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -427,9 +369,7 @@ final class StreamTest extends UnitTestCase
         $subject->attach('foo-bar-baz');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attachWithResourceAttachesResource(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -441,9 +381,7 @@ final class StreamTest extends UnitTestCase
         self::assertSame($resource, $reflection->getValue($subject));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attachWithStringRepresentingResourceCreatesAndAttachesResource(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -456,9 +394,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals('FooBar', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContentsShouldGetFullStreamContents(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -472,9 +408,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals('FooBar', $subject->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContentsShouldReturnStreamContentsFromCurrentPointer(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -488,9 +422,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals('Bar', $subject->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMetadataReturnsAllMetadataWhenNoKeyPresent(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -502,9 +434,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals($expected, $subject->getMetadata());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMetadataReturnsDataForSpecifiedKey(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -517,9 +447,7 @@ final class StreamTest extends UnitTestCase
         self::assertEquals($expected, $subject->getMetadata('uri'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMetadataReturnsNullIfNoDataExistsForKey(): void
     {
         $fileName = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -530,9 +458,7 @@ final class StreamTest extends UnitTestCase
         self::assertNull($subject->getMetadata('TOTALLY_MADE_UP'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSizeReturnsStreamSize(): void
     {
         $resource = fopen(__FILE__, 'r');
diff --git a/typo3/sysext/core/Tests/Unit/Http/UploadedFileFactoryTest.php b/typo3/sysext/core/Tests/Unit/Http/UploadedFileFactoryTest.php
index 297400466e3f7abe227644c660384f8423324e84..ae687094edf2686ef36e0b03ea8e2307ddb160dc 100644
--- a/typo3/sysext/core/Tests/Unit/Http/UploadedFileFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/UploadedFileFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\UploadedFileFactoryInterface;
 use Psr\Http\Message\UploadedFileInterface;
 use TYPO3\CMS\Core\Http\Stream;
@@ -25,18 +26,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class UploadedFileFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsr17FactoryInterface(): void
     {
         $factory = new UploadedFileFactory();
         self::assertInstanceOf(UploadedFileFactoryInterface::class, $factory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createUploadedFile(): void
     {
         $stream = new Stream('php://memory');
@@ -49,9 +46,7 @@ final class UploadedFileFactoryTest extends UnitTestCase
         self::assertNull($uploadedFile->getClientMediaType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createUploadedFileWithParams(): void
     {
         $stream = new Stream('php://memory');
@@ -64,9 +59,7 @@ final class UploadedFileFactoryTest extends UnitTestCase
         self::assertSame('text/html', $uploadedFile->getClientMediaType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createUploadedFileCreateSizeFromStreamSize(): void
     {
         $stream = new Stream('php://memory', 'rw');
@@ -78,9 +71,7 @@ final class UploadedFileFactoryTest extends UnitTestCase
         self::assertSame(5, $uploadedFile->getSize());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createUploadedFileThrowsExceptionWhenStreamSizeCanNotBeDetermined(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Http/UploadedFileTest.php b/typo3/sysext/core/Tests/Unit/Http/UploadedFileTest.php
index 517eebaa70ab64517b033f27ee9fee1c4f7f9afc..f71a1930bc0482b298ba372b2089217625d89fa9 100644
--- a/typo3/sysext/core/Tests/Unit/Http/UploadedFileTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/UploadedFileTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\Stream;
 use TYPO3\CMS\Core\Http\UploadedFile;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -54,10 +56,8 @@ final class UploadedFileTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidStreamsDataProvider
-     * @test
-     */
+    #[DataProvider('invalidStreamsDataProvider')]
+    #[Test]
     public function constructorRaisesExceptionOnInvalidStreamOrFile($streamOrFile): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -72,10 +72,8 @@ final class UploadedFileTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidErrorStatusesDataProvider
-     * @test
-     */
+    #[DataProvider('invalidErrorStatusesDataProvider')]
+    #[Test]
     public function constructorRaisesExceptionOnInvalidErrorStatus($status): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -83,9 +81,7 @@ final class UploadedFileTest extends UnitTestCase
         new UploadedFile(fopen('php://temp', 'wb+'), 0, $status);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStreamReturnsOriginalStreamObject(): void
     {
         $stream = new Stream('php://temp');
@@ -93,9 +89,7 @@ final class UploadedFileTest extends UnitTestCase
         self::assertSame($stream, $upload->getStream());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStreamReturnsWrappedPhpStream(): void
     {
         $stream = fopen('php://temp', 'wb+');
@@ -104,9 +98,7 @@ final class UploadedFileTest extends UnitTestCase
         self::assertSame($stream, $uploadStream);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStreamReturnsStreamForFile(): void
     {
         $this->tmpFile = $stream = tempnam(sys_get_temp_dir(), 'phly');
@@ -116,9 +108,7 @@ final class UploadedFileTest extends UnitTestCase
         self::assertSame($stream, $r->getValue($uploadStream));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function moveToMovesFileToDesignatedPath(): void
     {
         $stream = new Stream('php://temp', 'wb+');
@@ -132,9 +122,7 @@ final class UploadedFileTest extends UnitTestCase
         self::assertEquals($stream->__toString(), $contents);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function moveToRaisesExceptionForEmptyPath(): void
     {
         $stream = new Stream('php://temp', 'wb+');
@@ -145,9 +133,7 @@ final class UploadedFileTest extends UnitTestCase
         $upload->moveTo('');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function moveToCannotBeCalledMoreThanOnce(): void
     {
         $stream = new Stream('php://temp', 'wb+');
@@ -163,9 +149,7 @@ final class UploadedFileTest extends UnitTestCase
         $upload->moveTo($to);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getGetStreamRaisesExceptionAfterMove(): void
     {
         $stream = new Stream('php://temp', 'wb+');
@@ -183,8 +167,8 @@ final class UploadedFileTest extends UnitTestCase
 
     /**
      * see https://en.wikipedia.org/wiki/Unicode_equivalence#Normalization, "NFD"
-     * @test
      */
+    #[Test]
     public function nfdFileNameIsNormalized(): void
     {
         $clientFileName = hex2bin('6fcc88') . '.png';
diff --git a/typo3/sysext/core/Tests/Unit/Http/UriFactoryTest.php b/typo3/sysext/core/Tests/Unit/Http/UriFactoryTest.php
index 7db7f86812123b86f14875fc736e1b77cb310bad..a2e741c10bfa11f87dd2ffb98bcb46a359e159f8 100644
--- a/typo3/sysext/core/Tests/Unit/Http/UriFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/UriFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\UriFactoryInterface;
 use Psr\Http\Message\UriInterface;
 use TYPO3\CMS\Core\Http\UriFactory;
@@ -27,18 +28,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class UriFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function implementsPsr17FactoryInterface(): void
     {
         $factory = new UriFactory();
         self::assertInstanceOf(UriFactoryInterface::class, $factory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uriIsCreated(): void
     {
         $factory = new UriFactory();
diff --git a/typo3/sysext/core/Tests/Unit/Http/UriTest.php b/typo3/sysext/core/Tests/Unit/Http/UriTest.php
index 24706bc63d77e2145bb50a900f7f7356d083c787..3087eac58b50978669f4f19193821635376441fb 100644
--- a/typo3/sysext/core/Tests/Unit/Http/UriTest.php
+++ b/typo3/sysext/core/Tests/Unit/Http/UriTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\Uri;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class UriTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsAllProperties(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -46,18 +46,14 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canSerializeToStringDataProvider
-     */
+    #[DataProvider('canSerializeToStringDataProvider')]
+    #[Test]
     public function canSerializeToString(string $uri): void
     {
         self::assertEquals($uri, (string)(new Uri($uri)));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withSchemeReturnsNewInstanceWithNewScheme(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -67,9 +63,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('http://user:pass@local.example.com:3001/foo?bar=baz#quz', (string)$new);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withUserInfoReturnsNewInstanceWithProvidedUser(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -79,9 +73,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('https://matthew@local.example.com:3001/foo?bar=baz#quz', (string)$new);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withUserInfoReturnsNewInstanceWithProvidedUserAndPassword(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -91,9 +83,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('https://matthew:zf2@local.example.com:3001/foo?bar=baz#quz', (string)$new);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withHostReturnsNewInstanceWithProvidedHost(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -103,9 +93,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('https://user:pass@framework.zend.com:3001/foo?bar=baz#quz', (string)$new);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withPortAndNullValueReturnsInstanceWithProvidedPort(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -124,10 +112,8 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider validPortsDataProvider
-     * @test
-     */
+    #[DataProvider('validPortsDataProvider')]
+    #[Test]
     public function withPortReturnsNewInstanceWithProvidedPort($port): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -149,10 +135,8 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidPortsDataProviderRange
-     * @test
-     */
+    #[DataProvider('invalidPortsDataProviderRange')]
+    #[Test]
     public function withPortRaisesExceptionForInvalidPortsByRange($port): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -161,36 +145,28 @@ final class UriTest extends UnitTestCase
         $uri->withPort($port);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function standardPortAndSchemeDoesNotRenderPort(): void
     {
         $subject = new Uri('http://www.example.com:80');
         self::assertEquals('http://www.example.com', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function standardPortAndNoSchemeDoesRenderPort(): void
     {
         $subject = new Uri('www.example.com:80');
         self::assertEquals('//www.example.com:80', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function noPortAndNoSchemeDoesNotRenderPort(): void
     {
         $subject = new Uri('www.example.com');
         self::assertEquals('/www.example.com', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withPathReturnsNewInstanceWithProvidedPath(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -200,9 +176,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('https://user:pass@local.example.com:3001/bar/baz?bar=baz#quz', (string)$new);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withPathRaisesExceptionForInvalidPathsWithQuery(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -211,9 +185,7 @@ final class UriTest extends UnitTestCase
         $uri->withPath('/bar/baz?bat=quz');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withPathRaisesExceptionForInvalidPathsWithFragment(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -222,9 +194,7 @@ final class UriTest extends UnitTestCase
         $uri->withPath('/bar/baz#bat');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withQueryReturnsNewInstanceWithProvidedQuery(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -234,9 +204,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('https://user:pass@local.example.com:3001/foo?baz=bat#quz', (string)$new);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withQueryRaisesExceptionForInvalidQueryStringsByFragment(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -245,9 +213,7 @@ final class UriTest extends UnitTestCase
         $uri->withQuery('baz=bat#quz');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withFragmentReturnsNewInstanceWithProvidedFragment(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -267,19 +233,15 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider authorityInfoDataProvider
-     * @test
-     */
+    #[DataProvider('authorityInfoDataProvider')]
+    #[Test]
     public function getAuthorityReturnsExpectedValues($url, $expected): void
     {
         $uri = new Uri($url);
         self::assertEquals($expected, $uri->getAuthority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canEmitOriginFormUrl(): void
     {
         $url = '/foo/bar?baz=bat';
@@ -287,9 +249,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals($url, (string)$uri);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function settingEmptyPathOnAbsoluteUriReturnsAnEmptyPath(): void
     {
         $uri = new Uri('http://example.com/foo');
@@ -297,27 +257,21 @@ final class UriTest extends UnitTestCase
         self::assertEquals('', $new->getPath());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function stringRepresentationOfAbsoluteUriWithNoPathSetsAnEmptyPath(): void
     {
         $uri = new Uri('http://example.com');
         self::assertEquals('http://example.com', (string)$uri);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathOnOriginFormRemainsAnEmptyPath(): void
     {
         $uri = new Uri('?foo=bar');
         self::assertEquals('', $uri->getPath());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function stringRepresentationOfOriginFormWithNoPathRetainsEmptyPath(): void
     {
         $uri = new Uri('?foo=bar');
@@ -337,27 +291,21 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidConstructorUrisDataProvider
-     */
+    #[DataProvider('invalidConstructorUrisDataProvider')]
     public function constructorRaisesExceptionForNonStringURI($uri): void
     {
         $this->expectException(\InvalidArgumentException::class);
         new Uri($uri);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorRaisesExceptionForSeriouslyMalformedURI(): void
     {
         $this->expectException(\InvalidArgumentException::class);
         new Uri('http:///www.php-fig.org/');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withSchemeStripsOffDelimiter(): void
     {
         $uri = new Uri('http://example.com');
@@ -376,10 +324,8 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider invalidSchemesDataProvider
-     * @test
-     */
+    #[DataProvider('invalidSchemesDataProvider')]
+    #[Test]
     public function constructWithUnsupportedSchemeRaisesAnException($scheme): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -387,10 +333,8 @@ final class UriTest extends UnitTestCase
         new Uri($scheme . '://example.com');
     }
 
-    /**
-     * @dataProvider invalidSchemesDataProvider
-     * @test
-     */
+    #[DataProvider('invalidSchemesDataProvider')]
+    #[Test]
     public function withSchemeUsingUnsupportedSchemeRaisesAnException($scheme): void
     {
         $uri = new Uri('http://example.com');
@@ -399,9 +343,7 @@ final class UriTest extends UnitTestCase
         $uri->withScheme($scheme);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withPathIsNotPrefixedWithSlashIfSetWithoutOne(): void
     {
         $uri = new Uri('http://example.com');
@@ -409,9 +351,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('foo/bar', $new->getPath());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withEmptySchemeReturnsNewInstanceWithAbsoluteUri(): void
     {
         $uri = new Uri('https://user:pass@local.example.com:3001/foo?bar=baz#quz');
@@ -422,9 +362,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('//user:pass@local.example.com:3001/foo?bar=baz#quz', (string)$new);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withPathNotSlashPrefixedIsEmittedWithSlashDelimiterWhenUriIsCastToString(): void
     {
         $uri = new Uri('http://example.com');
@@ -432,9 +370,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('http://example.com/foo/bar', $new->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withQueryStripsQueryPrefixIfPresent(): void
     {
         $uri = new Uri('http://example.com');
@@ -442,9 +378,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('foo=bar', $new->getQuery());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withFragmentStripsFragmentPrefixIfPresent(): void
     {
         $uri = new Uri('http://example.com');
@@ -460,10 +394,8 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider standardSchemePortCombinationsDataProvider
-     * @test
-     */
+    #[DataProvider('standardSchemePortCombinationsDataProvider')]
+    #[Test]
     public function getAuthorityOmitsPortForStandardSchemePortCombinations($scheme, $port): void
     {
         $uri = (new Uri())
@@ -473,9 +405,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals('example.com', $uri->getAuthority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathIsProperlyEncoded(): void
     {
         $uri = (new Uri())->withPath('/foo^bar');
@@ -483,9 +413,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals($expected, $uri->getPath());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathDoesNotBecomeDoubleEncoded(): void
     {
         $uri = (new Uri())->withPath('/foo%5Ebar');
@@ -504,29 +432,23 @@ final class UriTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider queryStringsForEncodingDataProvider
-     * @test
-     */
+    #[DataProvider('queryStringsForEncodingDataProvider')]
+    #[Test]
     public function getQueryIsProperlyEncoded($query, $expected): void
     {
         $uri = (new Uri())->withQuery($query);
         self::assertEquals($expected, $uri->getQuery());
     }
 
-    /**
-     * @dataProvider queryStringsForEncodingDataProvider
-     * @test
-     */
+    #[DataProvider('queryStringsForEncodingDataProvider')]
+    #[Test]
     public function getQueryIsNotDoubleEncoded($query, $expected): void
     {
         $uri = (new Uri())->withQuery($expected);
         self::assertEquals($expected, $uri->getQuery());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFragmentIsProperlyEncoded(): void
     {
         $uri = (new Uri())->withFragment('/p^th?key^=`bar#b@z');
@@ -534,9 +456,7 @@ final class UriTest extends UnitTestCase
         self::assertEquals($expected, $uri->getFragment());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFragmentIsNotDoubleEncoded(): void
     {
         $expected = '/p%5Eth?key%5E=%60bar%23b@z';
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/DimensionTest.php b/typo3/sysext/core/Tests/Unit/Imaging/DimensionTest.php
index b1be384dfa9b33d49ff97f8ebc5eaaae118c27af..958ab138006c2fcc8ea39fcb1476b73107ff37fe 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/DimensionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/DimensionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\Dimension;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -36,9 +37,7 @@ final class DimensionTest extends UnitTestCase
         $this->subject = new Dimension(Icon::SIZE_MEDIUM);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getWidthReturnsValidInteger(): void
     {
         $value = $this->subject->getWidth();
@@ -46,9 +45,7 @@ final class DimensionTest extends UnitTestCase
         self::assertIsInt($value);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeightReturnsValidInteger(): void
     {
         $value = $this->subject->getHeight();
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/GraphicalFunctionsTest.php b/typo3/sysext/core/Tests/Unit/Imaging/GraphicalFunctionsTest.php
index e307ef5007d77806e475c52ca5fb4d9768115e91..4f9a11587f828eb863559a43016448897838b986 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/GraphicalFunctionsTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/GraphicalFunctionsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\GraphicalFunctions;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -285,10 +287,8 @@ final class GraphicalFunctionsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getScaleForImageDataProvider
-     */
+    #[DataProvider('getScaleForImageDataProvider')]
+    #[Test]
     public function getScaleForImage(array $info, string $width, string $height, array $options, bool $mayScaleUp, array $expected): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_allowUpscaling'] = $mayScaleUp;
@@ -297,9 +297,7 @@ final class GraphicalFunctionsTest extends UnitTestCase
         self::assertSame($result, $expected);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function imageMagickIdentifyReturnsFormattedValues(): void
     {
         $file = 'myImageFile.png';
@@ -318,9 +316,7 @@ final class GraphicalFunctionsTest extends UnitTestCase
         self::assertEquals($result, $expected);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function imageMagickIdentifyReturnsFormattedValuesWithOffset(): void
     {
         $file = 'myImageFile.png';
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/BitmapIconProviderTest.php b/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/BitmapIconProviderTest.php
index 948397631ac1288a5ee835016846adb89b3adc80..1d37f17c1212b373b021f77bf9f2ded0f3b6aca9 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/BitmapIconProviderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/BitmapIconProviderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging\IconProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider;
@@ -44,27 +45,21 @@ final class BitmapIconProviderTest extends UnitTestCase
         $this->icon->setSize(Icon::SIZE_SMALL);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareIconMarkupWithRelativeSourceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, ['source' => 'fileadmin/foo.png']);
         self::assertEquals('<img src="fileadmin/foo.png" width="16" height="16" alt="" />', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareIconMarkupWithAbsoluteSourceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, ['source' => Environment::getPublicPath() . '/fileadmin/foo.png']);
         self::assertEquals('<img src="fileadmin/foo.png" width="16" height="16" alt="" />', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareIconMarkupEXTSourceReferenceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, ['source' => 'EXT:core/Resources/Public/Images/foo.png']);
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgIconProviderTest.php b/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgIconProviderTest.php
index 7128474511f401f8370ad48edd12e4a9cafabfe5..c285e5a362c3fe154f2116ec125d7102f7afcf08 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgIconProviderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgIconProviderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging\IconProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider;
@@ -44,36 +45,28 @@ final class SvgIconProviderTest extends UnitTestCase
         $this->icon->setSize(Icon::SIZE_SMALL);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareIconMarkupWithRelativeSourceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, ['source' => 'fileadmin/foo.svg']);
         self::assertEquals('<img src="fileadmin/foo.svg" width="16" height="16" alt="" />', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareIconMarkupWithAbsoluteSourceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, ['source' => Environment::getPublicPath() . '/fileadmin/foo.svg']);
         self::assertEquals('<img src="fileadmin/foo.svg" width="16" height="16" alt="" />', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconWithEXTSourceReferenceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, ['source' => 'EXT:core/Resources/Public/Images/foo.svg']);
         self::assertEquals('<img src="typo3/sysext/core/Resources/Public/Images/foo.svg" width="16" height="16" alt="" />', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconWithInlineOptionReturnsCleanSvgMarkup(): void
     {
         $testFile = GeneralUtility::tempnam('svg_', '.svg');
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgSpriteIconProviderTest.php b/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgSpriteIconProviderTest.php
index 227e6ac5311ac677592de528bf571f2f9eb2f426..b7b49798a8bc4ddb905499b2f241fe902dc3c049 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgSpriteIconProviderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/IconProvider/SvgSpriteIconProviderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging\IconProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconProvider\SvgSpriteIconProvider;
@@ -44,9 +45,7 @@ final class SvgSpriteIconProviderTest extends UnitTestCase
         $this->icon->setSize(Icon::SIZE_SMALL);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareIconMarkupWithRelativeSourceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, [
@@ -56,9 +55,7 @@ final class SvgSpriteIconProviderTest extends UnitTestCase
         self::assertEquals('<svg class="icon-color"><use xlink:href="fileadmin/sprites/actions.svg#actions-plus" /></svg>', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareIconMarkupWithAbsoluteSourceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, [
@@ -68,9 +65,7 @@ final class SvgSpriteIconProviderTest extends UnitTestCase
         self::assertEquals('<svg class="icon-color"><use xlink:href="fileadmin/sprites/actions.svg#actions-plus" /></svg>', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconWithEXTSourceReferenceReturnsInstanceOfIconWithCorrectMarkup(): void
     {
         $this->subject->prepareIconMarkup($this->icon, [
@@ -80,9 +75,7 @@ final class SvgSpriteIconProviderTest extends UnitTestCase
         self::assertEquals('<svg class="icon-color"><use xlink:href="typo3/sysext/core/Resources/Public/Images/sprites/actions.svg#actions-plus" /></svg>', $this->icon->getMarkup());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconWithInlineOptionReturnsCleanSvgMarkup(): void
     {
         $testFile = GeneralUtility::tempnam('svg_', '.svg');
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/IconRegistryTest.php b/typo3/sysext/core/Tests/Unit/Imaging/IconRegistryTest.php
index ea88bf6528c36189aeb4919f91cd5ca898c29a31..0fb14e29e7f6c456adfa39f18d5a8fb867cdf3e3 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/IconRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/IconRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Exception;
 use TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider;
@@ -27,18 +28,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IconRegistryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultIconIdentifierReturnsTheCorrectDefaultIconIdentifierString(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getDefaultIconIdentifier();
         self::assertEquals('default-not-found', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isRegisteredReturnsTrueForRegisteredIcon(): void
     {
         $subject = new IconRegistry(new NullFrontend('test'), 'BackendIcons');
@@ -46,18 +43,14 @@ final class IconRegistryTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isRegisteredReturnsFalseForNotRegisteredIcon(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->isRegistered('my-super-unregistered-identifier');
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerIconAddNewIconToRegistry(): void
     {
         $unregisteredIcon = 'foo-bar-unregistered';
@@ -70,9 +63,7 @@ final class IconRegistryTest extends UnitTestCase
         self::assertTrue($subject->isRegistered($unregisteredIcon));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerIconThrowsInvalidArgumentExceptionWithInvalidIconProvider(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -81,9 +72,7 @@ final class IconRegistryTest extends UnitTestCase
         (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->registerIcon('my-super-unregistered-identifier', GeneralUtility::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconConfigurationByIdentifierThrowsExceptionWithUnregisteredIconIdentifier(): void
     {
         $this->expectException(Exception::class);
@@ -92,9 +81,7 @@ final class IconRegistryTest extends UnitTestCase
         (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getIconConfigurationByIdentifier('my-super-unregistered-identifier');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconConfigurationByIdentifierReturnsCorrectConfiguration(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getIconConfigurationByIdentifier('default-not-found');
@@ -105,17 +92,13 @@ final class IconRegistryTest extends UnitTestCase
         self::assertContains(IconProviderInterface::class, class_implements($result['provider']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllRegisteredIconIdentifiersReturnsAnArrayWithIconIdentifiers(): void
     {
         self::assertIsArray((new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getAllRegisteredIconIdentifiers());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllRegisteredIconIdentifiersReturnsArrayWithAllRegisteredIconIdentifiers(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getAllRegisteredIconIdentifiers();
@@ -123,36 +106,28 @@ final class IconRegistryTest extends UnitTestCase
         self::assertContains('default-not-found', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconIdentifierForFileExtensionReturnsDefaultIconIdentifierForEmptyFileExtension(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getIconIdentifierForFileExtension('');
         self::assertEquals('mimetypes-other-other', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconIdentifierForFileExtensionReturnsDefaultIconIdentifierForUnknownFileExtension(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getIconIdentifierForFileExtension('xyz');
         self::assertEquals('mimetypes-other-other', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconIdentifierForFileExtensionReturnsImageIconIdentifierForImageFileExtension(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getIconIdentifierForFileExtension('jpg');
         self::assertEquals('mimetypes-media-image', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerFileExtensionRegisterAnIcon(): void
     {
         $subject = new IconRegistry(new NullFrontend('test'), 'BackendIcons');
@@ -161,9 +136,7 @@ final class IconRegistryTest extends UnitTestCase
         self::assertEquals('xyz', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerFileExtensionOverwriteAnExistingIcon(): void
     {
         $subject = new IconRegistry(new NullFrontend('test'), 'BackendIcons');
@@ -172,9 +145,7 @@ final class IconRegistryTest extends UnitTestCase
         self::assertEquals('xyz', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerMimeTypeIconRegisterAnIcon(): void
     {
         $subject = new IconRegistry(new NullFrontend('test'), 'BackendIcons');
@@ -183,9 +154,7 @@ final class IconRegistryTest extends UnitTestCase
         self::assertEquals('mimetype-foo-bar', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerMimeTypeIconOverwriteAnExistingIcon(): void
     {
         $subject = new IconRegistry(new NullFrontend('test'), 'BackendIcons');
@@ -194,9 +163,7 @@ final class IconRegistryTest extends UnitTestCase
         self::assertEquals('mimetype-foo-bar', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIconIdentifierForMimeTypeWithUnknownMimeTypeReturnNull(): void
     {
         $result = (new IconRegistry(new NullFrontend('test'), 'BackendIcons'))->getIconIdentifierForMimeType('bar/foo');
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php b/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php
index a04ed13ba5e8cf963fc194e20ef16ae5b002d1b1..477c52a2f678032139dea5c8e21fe8f4cfcba3c8 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
@@ -41,41 +43,31 @@ final class IconTest extends UnitTestCase
         $this->subject = $iconFactory->getIcon($this->iconIdentifier, Icon::SIZE_SMALL, $this->overlayIdentifier, IconState::cast(IconState::STATE_DISABLED));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderAndCastToStringReturnsTheSameCode(): void
     {
         self::assertEquals($this->subject->render(), (string)$this->subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierReturnsCorrectIdentifier(): void
     {
         self::assertEquals($this->iconIdentifier, $this->subject->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOverlayIdentifierReturnsCorrectIdentifier(): void
     {
         self::assertEquals($this->overlayIdentifier, $this->subject->getOverlayIcon()->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSizeIdentifierReturnsCorrectIdentifier(): void
     {
         self::assertEquals(Icon::SIZE_SMALL, $this->subject->getSize());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStateReturnsCorrectIdentifier(): void
     {
         self::assertTrue($this->subject->getState()->equals(IconState::STATE_DISABLED));
@@ -109,10 +101,8 @@ final class IconTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider setSizeSetsExpectedValuesDataProvider
-     */
+    #[DataProvider('setSizeSetsExpectedValuesDataProvider')]
+    #[Test]
     public function setSizeSetsExpectedValues(string $size, array $expectedDimensions): void
     {
         $icon = new Icon();
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/ImageDimensionTest.php b/typo3/sysext/core/Tests/Unit/Imaging/ImageDimensionTest.php
index e93d54d1a945ae6c8fcb29c0c87e5a1afb1bab93..374d1c871c560e18e6f8adf2af9b55763934e958 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/ImageDimensionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/ImageDimensionTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\ImageDimension;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\Area;
 use TYPO3\CMS\Core\Resource\File;
@@ -167,10 +169,8 @@ final class ImageDimensionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider givenProcessingInstructionsCalculatesCorrectDimensionDataProvider
-     * @test
-     */
+    #[DataProvider('givenProcessingInstructionsCalculatesCorrectDimensionDataProvider')]
+    #[Test]
     public function givenProcessingInstructionsCalculatesCorrectDimension(
         array $processingConfiguration,
         ImageDimension $originalImageDimension,
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/AreaTest.php b/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/AreaTest.php
index e1861d92f3746b0c51020c8f4fd52449d2928377..15591e706680fba73415816cdcb80586cc9ac308 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/AreaTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/AreaTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging\ImageManipulation;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\Area;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\Ratio;
 use TYPO3\CMS\Core\Resource\File;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AreaTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function makeRelativeToFileReducesSizes(): void
     {
         $imageArea = new Area(50.0, 50.0, 100.0, 100.0);
@@ -68,10 +68,8 @@ final class AreaTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider applyRatioRestrictsAreaToRespectRatioDataProvider
-     */
+    #[DataProvider('applyRatioRestrictsAreaToRespectRatioDataProvider')]
+    #[Test]
     public function applyRatioRestrictsAreaToRespectRatio(array $areaSize, float $ratio): void
     {
         $area = new Area(...$areaSize);
@@ -80,9 +78,7 @@ final class AreaTest extends UnitTestCase
         self::assertSame($areaData['width'] / $areaData['height'], $ratio);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function applyRatioDoesNothingForFreeRatio(): void
     {
         $area = new Area(0.1, 0.1, 0.2, 0.4);
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantCollectionTest.php b/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantCollectionTest.php
index 399908fba1f604666522067e1c3f6f82fc724af2..f2fc573848758d22f98b26eec284a80752f87b5c 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantCollectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantCollectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging\ImageManipulation;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\Area;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariant;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariantCollection;
@@ -68,9 +69,7 @@ final class CropVariantCollectionTest extends UnitTestCase
         ],
     ];
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFromJsonWorks(): void
     {
         $cropVariant1 = self::$tca;
@@ -92,9 +91,7 @@ final class CropVariantCollectionTest extends UnitTestCase
         $assertSameValues(['default' => $cropVariant1, 'Second' => $cropVariant2], $cropVariantCollection->asArray());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function duplicateIdThrowsException(): void
     {
         $this->expectException(InvalidConfigurationException::class);
@@ -103,17 +100,13 @@ final class CropVariantCollectionTest extends UnitTestCase
         new CropVariantCollection([$cropVariant1, $cropVariant2]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createEmptyWorks(): void
     {
         self::assertTrue(CropVariantCollection::create('')->getCropArea()->isEmpty());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function castToStringReturnsJsonArrayOnEmptyInput(): void
     {
         $variants = new CropVariantCollection([]);
diff --git a/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantTest.php b/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantTest.php
index 89486d949123fd4af7e86c5d1b1b5614fee40b8f..6656905500be03dd5e08458b7042b23312f9c839 100644
--- a/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantTest.php
+++ b/typo3/sysext/core/Tests/Unit/Imaging/ImageManipulation/CropVariantTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Imaging\ImageManipulation;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariant;
 use TYPO3\CMS\Core\Imaging\ImageManipulation\InvalidConfigurationException;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -77,9 +78,7 @@ final class CropVariantTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFromTcaWorks(): void
     {
         $cropVariant = CropVariant::createFromConfiguration(self::$expectedConfig['id'], self::$tca);
@@ -87,9 +86,7 @@ final class CropVariantTest extends UnitTestCase
         self::assertSame(self::$expectedConfig, $cropVariant->asArray());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function selectedRatioCanBeNull(): void
     {
         $tca = self::$tca;
@@ -97,9 +94,7 @@ final class CropVariantTest extends UnitTestCase
         self::assertInstanceOf(CropVariant::class, CropVariant::createFromConfiguration(self::$expectedConfig['id'], $tca));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionOnTypeMismatchInRatio(): void
     {
         $tca = self::$tca;
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/EmailLinkHandlerTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/EmailLinkHandlerTest.php
index b6a64440a2cf825ce016b55b3fe91ebc695e1451..f4f64b2cb4398e03584712e68ec85f97ccc58a6d 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/EmailLinkHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/EmailLinkHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\EmailLinkHandler;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -59,15 +61,13 @@ final class EmailLinkHandlerTest extends UnitTestCase
     }
 
     /**
-     * @test
-     *
      * @param string $input
      * @param array $expected
      * @param string $finalString
-     *
-     * @dataProvider resolveParametersForNonFilesDataProvider
      * @todo Defining the method parameter types results in test bench errors
      */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function resolveReturnsSplitParameters($input, $expected, $finalString): void
     {
         $subject = new EmailLinkHandler();
@@ -75,15 +75,13 @@ final class EmailLinkHandlerTest extends UnitTestCase
     }
 
     /**
-     * @test
-     *
      * @param string $input
      * @param array $parameters
      * @param string $expected
-     *
-     * @dataProvider resolveParametersForNonFilesDataProvider
      * @todo Defining the method parameter types results in test bench errors
      */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifier($input, $parameters, $expected): void
     {
         $subject = new EmailLinkHandler();
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/FileLinkHandlerTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/FileLinkHandlerTest.php
index 284efec7cc8f4f6ccea65f55611d0bf1af8d4e06..4f05a5e712318c66be0fabeb92f82e4eb561a3ad 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/FileLinkHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/FileLinkHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\FileLinkHandler;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -82,12 +84,9 @@ final class FileLinkHandlerTest extends UnitTestCase
 
     /**
      * Helpful to know in which if() clause the stuff gets in
-     *
-     * @test
-     *
-     *
-     * @dataProvider resolveParametersForFilesDataProvider
      */
+    #[DataProvider('resolveParametersForFilesDataProvider')]
+    #[Test]
     public function resolveFileReferencesToSplitParameters(array $input, array $expected): void
     {
         $storage = $this->getMockBuilder(ResourceStorage::class)
@@ -111,12 +110,9 @@ final class FileLinkHandlerTest extends UnitTestCase
 
     /**
      * Helpful to know in which if() clause the stuff gets in
-     *
-     * @test
-     *
-     *
-     * @dataProvider resolveParametersForFilesDataProvider
      */
+    #[DataProvider('resolveParametersForFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifierForFiles(array $input, array $parameters, string $expected): void
     {
         $fileObject = $this->getMockBuilder(File::class)
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/FolderLinkHandlerTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/FolderLinkHandlerTest.php
index 8270dd0c08f6dd4934a0549bc2a1c99c42478b43..71c8cc47b1a9c682ed5295d5f7abb24dce665031 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/FolderLinkHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/FolderLinkHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\FolderLinkHandler;
 use TYPO3\CMS\Core\Resource\Folder;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -61,10 +63,9 @@ final class FolderLinkHandlerTest extends UnitTestCase
 
     /**
      * Helpful to know in which if() clause the stuff gets in
-     *
-     * @test
-     * @dataProvider resolveParametersForFilesDataProvider
      */
+    #[DataProvider('resolveParametersForFilesDataProvider')]
+    #[Test]
     public function resolveFileReferencesToSplitParameters(array $input, array $expected): void
     {
         $storage = $this->getMockBuilder(ResourceStorage::class)
@@ -89,10 +90,9 @@ final class FolderLinkHandlerTest extends UnitTestCase
 
     /**
      * Helpful to know in which if() clause the stuff gets in
-     *
-     * @test
-     * @dataProvider resolveParametersForFilesDataProvider
      */
+    #[DataProvider('resolveParametersForFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifierForFiles(array $input, array $parameters, string $expected): void
     {
         $folderObject = $this->getMockBuilder(Folder::class)
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/LegacyLinkNotationConverterTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/LegacyLinkNotationConverterTest.php
index 5eb141034a351f8c05b3ac1d8bb18d24a499798c..671c568f0563c8de6a70fe86a0ed0f8852203c07 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/LegacyLinkNotationConverterTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/LegacyLinkNotationConverterTest.php
@@ -17,6 +17,9 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
+use TYPO3\CMS\Core\LinkHandling\Exception\UnknownLinkHandlerException;
 use TYPO3\CMS\Core\LinkHandling\LegacyLinkNotationConverter;
 use TYPO3\CMS\Core\LinkHandling\LinkService;
 use TYPO3\CMS\Core\Resource\File;
@@ -134,12 +137,8 @@ final class LegacyLinkNotationConverterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     *
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function resolveReturnsSplitParameters(string $input, array $expected): void
     {
         $subject = new LegacyLinkNotationConverter();
@@ -151,12 +150,10 @@ final class LegacyLinkNotationConverterTest extends UnitTestCase
     }
 
     /**
-     * @test
-     *
-     *
-     * @throws \TYPO3\CMS\Core\LinkHandling\Exception\UnknownLinkHandlerException
-     * @dataProvider resolveParametersForNonFilesDataProvider
+     * @throws UnknownLinkHandlerException
      */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifier(string $input, array $parameters, string $expected): void
     {
         $subject = new LinkService();
@@ -248,12 +245,9 @@ final class LegacyLinkNotationConverterTest extends UnitTestCase
 
     /**
      * Helpful to know in which if() clause the stuff gets in
-     *
-     * @test
-     *
-     *
-     * @dataProvider resolveParametersForFilesDataProvider
      */
+    #[DataProvider('resolveParametersForFilesDataProvider')]
+    #[Test]
     public function resolveFileReferencesToSplitParameters(string $input, array $expected): void
     {
         $storage = $this->getMockBuilder(ResourceStorage::class)
@@ -296,12 +290,11 @@ final class LegacyLinkNotationConverterTest extends UnitTestCase
     /**
      * Helpful to know in which if() clause the stuff gets in
      *
-     * @test
      *
-     *
-     * @throws \TYPO3\CMS\Core\LinkHandling\Exception\UnknownLinkHandlerException
-     * @dataProvider resolveParametersForFilesDataProvider
+     * @throws UnknownLinkHandlerException
      */
+    #[DataProvider('resolveParametersForFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifierForFiles(string $input, array $parameters, string $expected): void
     {
         // fake methods to return proper objects
@@ -365,12 +358,8 @@ final class LegacyLinkNotationConverterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     *
-     * @dataProvider resolveThrowExceptionWithPharReferencesDataProvider
-     */
+    #[DataProvider('resolveThrowExceptionWithPharReferencesDataProvider')]
+    #[Test]
     public function resolveThrowExceptionWithPharReferences(string $pharUrl): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/LinkServiceTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/LinkServiceTest.php
index ed223edfd6c5df4950e2a7a4c74021652930afdd..54bfcf4a2352e3968d5ce2a5ece9b6476c1e2ce2 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/LinkServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/LinkServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\LinkService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -176,20 +178,16 @@ final class LinkServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function resolveReturnsSplitParameters(string $input, array $expected, string $finalString): void
     {
         $subject = new LinkService();
         self::assertEquals($expected, $subject->resolve($input));
     }
 
-    /**
-     * @test
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifier(string $input, array $parameters, string $expected): void
     {
         $subject = new LinkService();
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/PageLinkHandlerTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/PageLinkHandlerTest.php
index 01b7cb32191580c4b030c45026f83c005ea8596d..71fe031de2e977e4d19766363fd6688c7984ad25 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/PageLinkHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/PageLinkHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\PageLinkHandler;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -58,10 +60,8 @@ final class PageLinkHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function resolveReturnsSplitParameters(array $input, array $expected, string $finalString): void
     {
         $subject = new PageLinkHandler();
@@ -72,10 +72,8 @@ final class PageLinkHandlerTest extends UnitTestCase
         self::assertSame($expected, $subject->resolveHandlerData($input));
     }
 
-    /**
-     * @test
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifier(array $input, array $parameters, string $expected): void
     {
         $subject = new PageLinkHandler();
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/RecordLinkHandlerTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/RecordLinkHandlerTest.php
index d3182820dbe60cc2331569b29ccc0098e4869b1c..058e944755c1527f883312af6fdca238524a73fe 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/RecordLinkHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/RecordLinkHandlerTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\RecordLinkHandler;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RecordLinkHandlerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function asStringReturnsUrl(): void
     {
         $subject = new RecordLinkHandler();
@@ -57,10 +57,8 @@ final class RecordLinkHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider missingParameterDataProvider
-     */
+    #[DataProvider('missingParameterDataProvider')]
+    #[Test]
     public function resolveHandlerDataThrowsExceptionIfParameterIsMissing(array $parameters): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -70,10 +68,8 @@ final class RecordLinkHandlerTest extends UnitTestCase
         $subject->resolveHandlerData($parameters);
     }
 
-    /**
-     * @test
-     * @dataProvider missingParameterDataProvider
-     */
+    #[DataProvider('missingParameterDataProvider')]
+    #[Test]
     public function asStringThrowsExceptionIfParameterIsMissing(array $parameters): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/TelephoneLinkHandlerTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/TelephoneLinkHandlerTest.php
index 7edf5833896030c10e55adf6048c23c843415ab4..6d2ad3f6a307279913a234511f1fc9322c27bc56 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/TelephoneLinkHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/TelephoneLinkHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\TelephoneLinkHandler;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -79,20 +81,16 @@ final class TelephoneLinkHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function resolveReturnsSplitParameters(array $input, array $expected): void
     {
         $subject = new TelephoneLinkHandler();
         self::assertEquals($expected, $subject->resolveHandlerData($input));
     }
 
-    /**
-     * @test
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifier(array $input, array $parameters, string $expected): void
     {
         $subject = new TelephoneLinkHandler();
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/TypoLinkCodecServiceTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/TypoLinkCodecServiceTest.php
index 7c590f26ca436a88437cd59ab502f541a2bced33..da64d857e6b8f910e275c7a4cceaf37f7fe1fe55 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/TypoLinkCodecServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/TypoLinkCodecServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\TypoLinkCodecService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,10 +32,8 @@ final class TypoLinkCodecServiceTest extends UnitTestCase
         $this->subject = new TypoLinkCodecService();
     }
 
-    /**
-     * @test
-     * @dataProvider encodeReturnsExpectedResultDataProvider
-     */
+    #[DataProvider('encodeReturnsExpectedResultDataProvider')]
+    #[Test]
     public function encodeReturnsExpectedResult(array $parts, string $expected): void
     {
         self::assertSame($expected, $this->subject->encode($parts));
@@ -72,10 +72,8 @@ final class TypoLinkCodecServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeReturnsExpectedResultDataProvider
-     */
+    #[DataProvider('decodeReturnsExpectedResultDataProvider')]
+    #[Test]
     public function decodeReturnsExpectedResult(string $typoLink, array $expected): void
     {
         self::assertSame($expected, $this->subject->decode($typoLink));
diff --git a/typo3/sysext/core/Tests/Unit/LinkHandling/UrlLinkHandlerTest.php b/typo3/sysext/core/Tests/Unit/LinkHandling/UrlLinkHandlerTest.php
index 97d6554206183b20a357800bfac1eb9753099bbd..41dabcb7d498286b71951be0eb4ce1895fbcbb7e 100644
--- a/typo3/sysext/core/Tests/Unit/LinkHandling/UrlLinkHandlerTest.php
+++ b/typo3/sysext/core/Tests/Unit/LinkHandling/UrlLinkHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\LinkHandling;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\LinkHandling\LinkHandlingInterface;
 use TYPO3\CMS\Core\LinkHandling\UrlLinkHandler;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -135,31 +137,23 @@ final class UrlLinkHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function resolveReturnsSplitParameters(array $input, array $expected, string $finalString): void
     {
         $subject = new UrlLinkHandler();
         self::assertEquals($expected, $subject->resolveHandlerData($input));
     }
 
-    /**
-     * @test
-     *
-     * @dataProvider resolveParametersForNonFilesDataProvider
-     */
+    #[DataProvider('resolveParametersForNonFilesDataProvider')]
+    #[Test]
     public function splitParametersToUnifiedIdentifier(array $input, array $parameters, string $expected): void
     {
         $subject = new UrlLinkHandler();
         self::assertEquals($expected, $subject->asString($parameters));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultSchemeForNoSchemeInConfigurationReturnsFallbackScheme(): void
     {
         unset($GLOBALS['TYPO3_CONF_VARS']['SYS']['defaultScheme']);
@@ -169,9 +163,7 @@ final class UrlLinkHandlerTest extends UnitTestCase
         self::assertSame(LinkHandlingInterface::DEFAULT_SCHEME, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultSchemeForEmptySchemeInConfigurationReturnsFallbackScheme(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['defaultScheme'] = '';
@@ -181,9 +173,7 @@ final class UrlLinkHandlerTest extends UnitTestCase
         self::assertSame(LinkHandlingInterface::DEFAULT_SCHEME, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultSchemeForSchemeInConfigurationReturnsSchemeFromConfiguration(): void
     {
         $scheme = 'https';
diff --git a/typo3/sysext/core/Tests/Unit/Localization/DateFormatterTest.php b/typo3/sysext/core/Tests/Unit/Localization/DateFormatterTest.php
index 001bfe89ac082ff94466de898f937348289068bc..179ef113be1fad14a8f0fe5f340e69dc5bd3ed7e 100644
--- a/typo3/sysext/core/Tests/Unit/Localization/DateFormatterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Localization/DateFormatterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Localization;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Localization\DateFormatter;
 use TYPO3\CMS\Core\Localization\Locale;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -154,10 +156,8 @@ final class DateFormatterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider formatDateProvider
-     */
+    #[DataProvider('formatDateProvider')]
+    #[Test]
     public function formatFormatsCorrectly(string $expected, mixed $format, string|Locale|null $locale = 'C'): void
     {
         $input = new \DateTimeImmutable('2023-02-02 13:05:00');
diff --git a/typo3/sysext/core/Tests/Unit/Localization/LocaleTest.php b/typo3/sysext/core/Tests/Unit/Localization/LocaleTest.php
index 5d13a3b773e752a5e1c24bb102217a92ce80ac4c..7612b60b759c529c532e2c20602d97b2a29c1be7 100644
--- a/typo3/sysext/core/Tests/Unit/Localization/LocaleTest.php
+++ b/typo3/sysext/core/Tests/Unit/Localization/LocaleTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Localization;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Localization\Locale;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LocaleTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function localeWithJustLanguageCodeSanitizesIncomingValuesProperly(): void
     {
         $subject = new Locale('en');
@@ -63,9 +62,7 @@ final class LocaleTest extends UnitTestCase
         self::assertEquals('en', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function localeWithLanguageAndScriptCodeSanitizesIncomingValuesProperly(): void
     {
         $subject = new Locale('zh_HANS');
@@ -75,9 +72,7 @@ final class LocaleTest extends UnitTestCase
         self::assertEquals('zh-Hans', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function localeWithLanguageAndScriptCodeAndCountryCodeSanitizesIncomingValuesProperly(): void
     {
         $subject = new Locale('zh_HANS_CN');
@@ -87,9 +82,7 @@ final class LocaleTest extends UnitTestCase
         self::assertEquals('zh-Hans-CN', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function variousCombinationsOfLanguageAndCountryCodeReturnsSanitizedValues(): void
     {
         $subject = new Locale('fr_CA');
@@ -104,9 +97,7 @@ final class LocaleTest extends UnitTestCase
         self::assertEquals('de-AT', (string)$subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dependenciesAreSetAndRetrievedCorrectly(): void
     {
         $subject = new Locale('fr_CA', ['fr', 'en']);
diff --git a/typo3/sysext/core/Tests/Unit/Localization/LocalesTest.php b/typo3/sysext/core/Tests/Unit/Localization/LocalesTest.php
index 69fd2cb2686dcbe59dbcb7dfa651a224a183bda5..39b37dddf2533e012202cb909ff2269b45174e2a 100644
--- a/typo3/sysext/core/Tests/Unit/Localization/LocalesTest.php
+++ b/typo3/sysext/core/Tests/Unit/Localization/LocalesTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Localization;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Localization\Locales;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -42,9 +44,7 @@ final class LocalesTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidLanguageKeyAlsoDetectsRegionSpecificKeys(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['user'] = [
@@ -66,9 +66,7 @@ final class LocalesTest extends UnitTestCase
         self::assertTrue($locales->isValidLanguageKey('default'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLocaleDependenciesResolvesAutomaticAndDefinedDependencies(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['user'] = [
@@ -121,10 +119,8 @@ final class LocalesTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider browserLanguageDetectionWorksDataProvider
-     */
+    #[DataProvider('browserLanguageDetectionWorksDataProvider')]
+    #[Test]
     public function browserLanguageDetectionWorks(string $acceptLanguageHeader, string $expected): void
     {
         $detectedLanguage = (new Locales())->getPreferredClientLanguage(
@@ -133,9 +129,7 @@ final class LocalesTest extends UnitTestCase
         self::assertSame($expected, $detectedLanguage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSystemLocaleFromSiteLanguageWithoutLocaleDoesNotSetLocale(): void
     {
         $site = $this->createSiteWithDefaultLanguage('');
@@ -146,9 +140,7 @@ final class LocalesTest extends UnitTestCase
         self::assertEquals($this->originalLocale, $currentLocale);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSystemLocaleFromSiteLanguageWithProperLocaleSetsLocale(): void
     {
         $locale = 'en_US';
diff --git a/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php b/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php
index 23ecfe0c3d94fd4fee4533e6171bf0074a5b8991..c892a563b2a2997194e6e0490848b74ef782bd01 100644
--- a/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Localization;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Localization\Exception\FileNotFoundException;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LocalizationFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getParsedDataCallsLocalizationOverrideIfFileNotFoundExceptionIsThrown(): void
     {
         $languageStoreMock = $this->createMock(LanguageStore::class);
@@ -54,9 +53,7 @@ final class LocalizationFactoryTest extends UnitTestCase
             ->getParsedData(__DIR__ . '/Fixtures/locallang.invalid', 'default');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ensureLocalizationIsProperlyCached(): void
     {
         $packageManagerMock = $this->createMock(PackageManager::class);
diff --git a/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php b/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php
index 14fc689e655d98abe4940099c6a5b5701299c22f..1385ae7395c3984f8445382fc3fa6b48c18c8c6f 100644
--- a/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Localization\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Localization\Parser\XliffParser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class XliffParserTest extends UnitTestCase
 {
-    /**
-     * @test
-     * @dataProvider canParseXliffDataProvider
-     */
+    #[DataProvider('canParseXliffDataProvider')]
+    #[Test]
     public function canParseXliff(string $languageKey, array $expectedLabels, bool $requireApprovedLocalizations): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['lang']['requireApprovedLocalizations'] = $requireApprovedLocalizations;
diff --git a/typo3/sysext/core/Tests/Unit/Locking/FileLockStrategyTest.php b/typo3/sysext/core/Tests/Unit/Locking/FileLockStrategyTest.php
index 02c7f6ef5a7af5eb16b3c4968436f9ffbec7a461..b1f5d1bb1a9b5e2dd3f4fecb67a7f663d7bcdf16 100644
--- a/typo3/sysext/core/Tests/Unit/Locking/FileLockStrategyTest.php
+++ b/typo3/sysext/core/Tests/Unit/Locking/FileLockStrategyTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Locking;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Locking\FileLockStrategy;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class FileLockStrategyTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorCreatesLockDirectoryIfNotExisting(): void
     {
         GeneralUtility::rmdir(Environment::getVarPath() . '/' . FileLockStrategy::FILE_LOCK_FOLDER, true);
@@ -37,26 +36,20 @@ final class FileLockStrategyTest extends UnitTestCase
         self::assertDirectoryExists(Environment::getVarPath() . '/' . FileLockStrategy::FILE_LOCK_FOLDER);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsFilePathToExpectedValue(): void
     {
         $lock = $this->getAccessibleMock(FileLockStrategy::class, null, ['999999999']);
         self::assertSame(Environment::getVarPath() . '/' . FileLockStrategy::FILE_LOCK_FOLDER . 'flock_' . md5('999999999'), $lock->_get('filePath'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPriorityReturnsDefaultPriority(): void
     {
         self::assertEquals(FileLockStrategy::DEFAULT_PRIORITY, FileLockStrategy::getPriority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPriority(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking']['strategies'][FileLockStrategy::class]['priority'] = 10;
diff --git a/typo3/sysext/core/Tests/Unit/Locking/LockFactoryTest.php b/typo3/sysext/core/Tests/Unit/Locking/LockFactoryTest.php
index a2bb9df22d4464085fe8fccc2629db9237406696..ae7f2126591cdeefc750c9a541750d575d488e49 100644
--- a/typo3/sysext/core/Tests/Unit/Locking/LockFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Locking/LockFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Locking;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Locking\Exception\LockCreateException;
 use TYPO3\CMS\Core\Locking\FileLockStrategy;
@@ -61,18 +62,14 @@ final class LockFactoryTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addLockingStrategyAddsTheClassNameToTheInternalArray(): void
     {
         $this->mockFactory->addLockingStrategy(DummyLock::class);
         self::assertArrayHasKey(DummyLock::class, $this->mockFactory->_get('lockingStrategy'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addLockingStrategyThrowsExceptionIfInterfaceIsNotImplemented(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -81,9 +78,7 @@ final class LockFactoryTest extends UnitTestCase
         $this->mockFactory->addLockingStrategy(\stdClass::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLockerReturnsExpectedClass(): void
     {
         $this->mockFactory->_set('lockingStrategy', [FileLockStrategy::class => true, DummyLock::class => true]);
@@ -94,9 +89,7 @@ final class LockFactoryTest extends UnitTestCase
         self::assertInstanceOf(FileLockStrategy::class, $locker);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLockerReturnsClassWithHighestPriority(): void
     {
         $this->mockFactory->_set('lockingStrategy', [SemaphoreLockStrategy::class => true, DummyLock::class => true]);
@@ -104,9 +97,7 @@ final class LockFactoryTest extends UnitTestCase
         self::assertInstanceOf(DummyLock::class, $locker);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPriorityGetLockerReturnsClassWithHighestPriority(): void
     {
         $lowestValue = min([
@@ -123,9 +114,7 @@ final class LockFactoryTest extends UnitTestCase
         unset($GLOBALS['TYPO3_CONF_VARS']['SYS']['locking']['strategies'][SemaphoreLockStrategy::class]['priority']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLockerThrowsExceptionIfNoMatchFound(): void
     {
         $this->expectException(LockCreateException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Locking/SemaphoreLockStrategyTest.php b/typo3/sysext/core/Tests/Unit/Locking/SemaphoreLockStrategyTest.php
index f7f798da5b2a2c78402c567fc50a71c2c854323f..3d079f9ea18a96c32842f077bdcb868fa960cf3f 100644
--- a/typo3/sysext/core/Tests/Unit/Locking/SemaphoreLockStrategyTest.php
+++ b/typo3/sysext/core/Tests/Unit/Locking/SemaphoreLockStrategyTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Locking;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Locking\SemaphoreLockStrategy;
 use TYPO3\CMS\Core\Locking\SimpleLockStrategy;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class SemaphoreLockStrategyTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function acquireGetsSemaphore(): void
     {
         $lock = new SemaphoreLockStrategy('99999');
@@ -37,17 +36,13 @@ final class SemaphoreLockStrategyTest extends UnitTestCase
         $lock->destroy();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPriorityReturnsDefaultPriority(): void
     {
         self::assertEquals(SimpleLockStrategy::DEFAULT_PRIORITY, SimpleLockStrategy::getPriority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPriority(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking']['strategies'][SemaphoreLockStrategy::class]['priority'] = 10;
diff --git a/typo3/sysext/core/Tests/Unit/Locking/SimpleLockStrategyTest.php b/typo3/sysext/core/Tests/Unit/Locking/SimpleLockStrategyTest.php
index 72a6a5cfabece2eef01d9bf0e66f0663a8d3d45e..c63eb0fd8f4e4e5a6ef6e954bf50e2f1a330478b 100644
--- a/typo3/sysext/core/Tests/Unit/Locking/SimpleLockStrategyTest.php
+++ b/typo3/sysext/core/Tests/Unit/Locking/SimpleLockStrategyTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Locking;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Locking\SemaphoreLockStrategy;
 use TYPO3\CMS\Core\Locking\SimpleLockStrategy;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SimpleLockStrategyTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorCreatesLockDirectoryIfNotExisting(): void
     {
         GeneralUtility::rmdir(Environment::getVarPath() . '/' . SimpleLockStrategy::FILE_LOCK_FOLDER, true);
@@ -35,18 +35,14 @@ final class SimpleLockStrategyTest extends UnitTestCase
         self::assertDirectoryExists(Environment::getVarPath() . '/' . SimpleLockStrategy::FILE_LOCK_FOLDER);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsResourceToPathWithIdIfUsingSimpleLocking(): void
     {
         $lock = $this->getAccessibleMock(SimpleLockStrategy::class, null, ['999999999']);
         self::assertSame(Environment::getVarPath() . '/' . SimpleLockStrategy::FILE_LOCK_FOLDER . 'simple_' . md5('999999999'), $lock->_get('filePath'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function acquireFixesPermissionsOnLockFile(): void
     {
         if (Environment::isWindows()) {
@@ -67,9 +63,7 @@ final class SimpleLockStrategyTest extends UnitTestCase
         self::assertEquals('0777', $resultFilePermissions);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function releaseRemovesLockfileInTypo3TempLocks(): void
     {
         $lock = $this->getAccessibleMock(SimpleLockStrategy::class, null, ['999999999']);
@@ -91,10 +85,8 @@ final class SimpleLockStrategyTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider releaseDoesNotRemoveFilesNotWithinTypo3TempLocksDirectoryDataProvider
-     */
+    #[DataProvider('releaseDoesNotRemoveFilesNotWithinTypo3TempLocksDirectoryDataProvider')]
+    #[Test]
     public function releaseDoesNotRemoveFilesNotWithinTypo3TempLocksDirectory(string $file): void
     {
         // Create test file
@@ -112,17 +104,13 @@ final class SimpleLockStrategyTest extends UnitTestCase
         self::assertTrue($fileExists);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPriorityReturnsDefaultPriority(): void
     {
         self::assertEquals(SemaphoreLockStrategy::DEFAULT_PRIORITY, SemaphoreLockStrategy::getPriority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPriority(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['locking']['strategies'][SimpleLockStrategy::class]['priority'] = 10;
diff --git a/typo3/sysext/core/Tests/Unit/Log/LogLevelTest.php b/typo3/sysext/core/Tests/Unit/Log/LogLevelTest.php
index 37ce53de281a6e9c63dbeabdc3f572bef1f170ee..53ac79e8683fa0f84b6bd8440ae0962b9d15f8ec 100644
--- a/typo3/sysext/core/Tests/Unit/Log/LogLevelTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/LogLevelTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\InvalidArgumentException;
 use TYPO3\CMS\Core\Log\LogLevel;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LogLevelTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidLevelValidatesValidLevels(): void
     {
         $validLevels = [0, 1, 2, 3, 4, 5, 6, 7];
@@ -34,9 +34,7 @@ final class LogLevelTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidLevelDoesNotValidateInvalidLevels(): void
     {
         $invalidLevels = [-1, 8];
@@ -56,10 +54,8 @@ final class LogLevelTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isValidLevelThrowsExceptionOnInvalidLevelIfAskedToDoSoDataProvider
-     */
+    #[DataProvider('isValidLevelThrowsExceptionOnInvalidLevelIfAskedToDoSoDataProvider')]
+    #[Test]
     public function isValidLevelThrowsExceptionOnInvalidLevelIfAskedToDoSo($inputValue): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -68,9 +64,7 @@ final class LogLevelTest extends UnitTestCase
         LogLevel::validateLevel($inputValue);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function normalizeLevelConvertsValidLevelFromStringToInteger(): void
     {
         self::assertEquals(7, LogLevel::normalizeLevel('debug'));
@@ -110,10 +104,8 @@ final class LogLevelTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider atLeastReturnsCorrectListOfLevelsDataProvider
-     */
+    #[DataProvider('atLeastReturnsCorrectListOfLevelsDataProvider')]
+    #[Test]
     public function atLeastReturnsCorrectListOfLevels(string $level, array $expected): void
     {
         self::assertSame($expected, LogLevel::atLeast($level));
diff --git a/typo3/sysext/core/Tests/Unit/Log/LogManagerTest.php b/typo3/sysext/core/Tests/Unit/Log/LogManagerTest.php
index 057dc15edce740931ca2b334a789733c810cb2fe..652a442e2daa445915d9cab1d1a78573da346904 100644
--- a/typo3/sysext/core/Tests/Unit/Log/LogManagerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/LogManagerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\Logger;
 use TYPO3\CMS\Core\Log\LogManager;
@@ -27,33 +28,25 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LogManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function logManagerReturnsLoggerWhenRequestedWithGetLogger(): void
     {
         self::assertInstanceOf(Logger::class, (new LogManager())->getLogger('test'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logManagerTurnsUnderScoreStyleLoggerNamesIntoDotStyleLoggerNames(): void
     {
         self::assertSame('test.a.b', (new LogManager())->getLogger('test_a_b')->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logManagerTurnsNamespaceStyleLoggerNamesIntoDotStyleLoggerNames(): void
     {
         self::assertSame('test.a.b', (new LogManager())->getLogger('test\\a\\b')->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function managerReturnsSameLoggerOnRepeatedRequest(): void
     {
         $loggerName = StringUtility::getUniqueId('test.core.log');
@@ -64,9 +57,7 @@ final class LogManagerTest extends UnitTestCase
         self::assertSame($logger1, $logger2);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configuresLoggerWithConfiguredWriter(): void
     {
         $component = 'test';
@@ -82,9 +73,7 @@ final class LogManagerTest extends UnitTestCase
         self::assertInstanceOf($writer, $writers[$level][0]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configuresLoggerWithConfiguredProcessor(): void
     {
         $component = 'test';
diff --git a/typo3/sysext/core/Tests/Unit/Log/LogRecordTest.php b/typo3/sysext/core/Tests/Unit/Log/LogRecordTest.php
index 852f1c6007c3c6fce3fc252435e0372ddd7cecb1..db758e8ebbbc76c85664928822704b89ad1d18bc 100644
--- a/typo3/sysext/core/Tests/Unit/Log/LogRecordTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/LogRecordTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\InvalidArgumentException;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\LogRecord;
@@ -40,9 +41,7 @@ final class LogRecordTest extends UnitTestCase
         return $record;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsCorrectComponent(): void
     {
         $component = 'test.core.log';
@@ -50,9 +49,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($component, $record->getComponent());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsCorrectLogLevel(): void
     {
         $logLevel = LogLevel::CRITICAL;
@@ -60,9 +57,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($logLevel, $record->getLevel());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsCorrectMessage(): void
     {
         $logMessage = 'test message';
@@ -70,9 +65,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($logMessage, $record->getMessage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsCorrectData(): void
     {
         $dataArray = [
@@ -82,9 +75,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($dataArray, $record->getData());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setComponentSetsComponent(): void
     {
         $record = $this->getRecord();
@@ -92,9 +83,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($component, $record->setComponent($component)->getComponent());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLevelSetsLevel(): void
     {
         $record = $this->getRecord();
@@ -102,9 +91,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($level, $record->setLevel($level)->getLevel());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLevelValidatesLevel(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -114,9 +101,7 @@ final class LogRecordTest extends UnitTestCase
         $record->setLevel('foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setMessageSetsMessage(): void
     {
         $record = $this->getRecord();
@@ -124,9 +109,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($message, $record->setMessage($message)->getMessage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setCreatedSetsCreated(): void
     {
         $record = $this->getRecord();
@@ -134,9 +117,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($created, $record->setCreated($created)->getCreated());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRequestIdSetsRequestId(): void
     {
         $record = $this->getRecord();
@@ -144,9 +125,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($requestId, $record->setRequestId($requestId)->getRequestId());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toArrayReturnsCorrectValues(): void
     {
         $component = 'test.core.log';
@@ -161,9 +140,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertEquals($data, $recordArray['data']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toStringIncludesDataAsJson(): void
     {
         $dataArray = ['foo' => 'bar'];
@@ -171,9 +148,7 @@ final class LogRecordTest extends UnitTestCase
         self::assertStringContainsString(json_encode($dataArray), (string)$record);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toStringIncludesExceptionDataAsJson(): void
     {
         $dataArray = ['exception' => new \Exception('foo', 1476049451)];
diff --git a/typo3/sysext/core/Tests/Unit/Log/LoggerTest.php b/typo3/sysext/core/Tests/Unit/Log/LoggerTest.php
index 26396d010a8a1aec1b80c02ee4063a021d52171b..6ffff0e681ef5d4d14b5b5e867ef98ff2fd3dde7 100644
--- a/typo3/sysext/core/Tests/Unit/Log/LoggerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/LoggerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\Logger;
 use TYPO3\CMS\Core\Log\LogRecord;
@@ -27,18 +29,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LoggerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getNameGetsLoggerName(): void
     {
         $logger = new Logger('test.core.log');
         self::assertSame('test.core.log', $logger->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loggerDoesNotLogRecordsLessCriticalThanLogLevel(): void
     {
         $logger = new Logger('test.core.log');
@@ -49,9 +47,7 @@ final class LoggerTest extends UnitTestCase
         self::assertEmpty($writer->getRecords());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loggerCallsProcessor(): void
     {
         $component = 'test.core.log';
@@ -68,9 +64,7 @@ final class LoggerTest extends UnitTestCase
         $logger->warning($message);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loggerLogsRecord(): void
     {
         $logger = new Logger('test.core.log');
@@ -82,9 +76,7 @@ final class LoggerTest extends UnitTestCase
         $logger->warning('test');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loggerLogsRecordsAtLeastAsCriticalAsLogLevel(): void
     {
         $logger = new Logger('test.core.log');
@@ -109,10 +101,8 @@ final class LoggerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider loggerLogsRecordsThroughShorthandMethodDataProvider
-     */
+    #[DataProvider('loggerLogsRecordsThroughShorthandMethodDataProvider')]
+    #[Test]
     public function loggerLogsRecordsThroughShorthandMethod(string $shorthandMethod): void
     {
         $logger = new Logger('test.core.log');
@@ -122,9 +112,7 @@ final class LoggerTest extends UnitTestCase
         self::assertNotEmpty($writer->getRecords());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loggerLogsRecordsMoreCriticalThanLogLevel(): void
     {
         $logger = new Logger('test.core.log');
@@ -135,9 +123,7 @@ final class LoggerTest extends UnitTestCase
         self::assertNotEmpty($writer->getRecords());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addWriterAddsWriterToTheSpecifiedLevel(): void
     {
         $logger = new Logger('test.core.log');
@@ -147,9 +133,7 @@ final class LoggerTest extends UnitTestCase
         self::assertContains($writer, $writers[LogLevel::NOTICE]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addWriterAddsWriterAlsoToHigherLevelsThanSpecified(): void
     {
         $logger = new Logger('test.core.log');
diff --git a/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractMemoryProcessorTest.php b/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractMemoryProcessorTest.php
index 5f5f61e6e0d7e3ed3bf42bd3e009275bb76c8faf..315c74846f0b23af1869de1d16f419f019e2706f 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractMemoryProcessorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractMemoryProcessorTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Processor;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Log\Processor\Fixtures\TestingMemoryProcessor;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractMemoryProcessorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setRealMemoryUsageSetsRealMemoryUsage(): void
     {
         $processor = new TestingMemoryProcessor();
@@ -32,9 +31,7 @@ final class AbstractMemoryProcessorTest extends UnitTestCase
         self::assertFalse($processor->getRealMemoryUsage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setFormatSizeSetsFormatSize(): void
     {
         $processor = new TestingMemoryProcessor();
diff --git a/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractProcessorTest.php b/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractProcessorTest.php
index 2ed4ea9e55885d61dbc2368d3cd82f3b972f55a1..21950d6e497c394884163587c63eca33f2e9c36b 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractProcessorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Processor/AbstractProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Processor;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\Exception\InvalidLogProcessorConfigurationException;
 use TYPO3\CMS\Core\Log\Logger;
@@ -29,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractProcessorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function processorRefusesInvalidConfigurationOptions(): void
     {
         $this->expectException(InvalidLogProcessorConfigurationException::class);
@@ -43,9 +42,7 @@ final class AbstractProcessorTest extends UnitTestCase
         GeneralUtility::makeInstance(ProcessorFixture::class, $invalidConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loggerExecutesProcessors(): void
     {
         $logger = new Logger('test.core.log');
diff --git a/typo3/sysext/core/Tests/Unit/Log/Processor/IntrospectionProcessorTest.php b/typo3/sysext/core/Tests/Unit/Log/Processor/IntrospectionProcessorTest.php
index 519e63559dec3a8a5b952f1544ecf80b1c155bb9..dbd357d4d297d7ae51122ad3560d0c4ec88cf1a1 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Processor/IntrospectionProcessorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Processor/IntrospectionProcessorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Processor;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\LogRecord;
@@ -64,9 +66,7 @@ final class IntrospectionProcessorTest extends UnitTestCase
         $this->processor = $this->getAccessibleMock(IntrospectionProcessor::class, ['getDebugBacktrace']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function introspectionProcessorAddsLastBacktraceItemToLogRecord(): void
     {
         $this->processor->method('getDebugBacktrace')->willReturn($this->dummyBacktrace);
@@ -79,9 +79,7 @@ final class IntrospectionProcessorTest extends UnitTestCase
         self::assertEquals($this->dummyBacktrace[0]['function'], $logRecord['data']['function']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function introspectionProcessorShiftsLogRelatedFunctionsFromBacktrace(): void
     {
         $dummyBacktrace = $this->dummyBacktrace;
@@ -123,10 +121,8 @@ final class IntrospectionProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider introspectionProcessorShiftsGivenNumberOfEntriesFromBacktraceDataProvider
-     */
+    #[DataProvider('introspectionProcessorShiftsGivenNumberOfEntriesFromBacktraceDataProvider')]
+    #[Test]
     public function introspectionProcessorShiftsGivenNumberOfEntriesFromBacktrace($number): void
     {
         $this->processor->method('getDebugBacktrace')->willReturn($this->dummyBacktrace);
@@ -141,9 +137,7 @@ final class IntrospectionProcessorTest extends UnitTestCase
         self::assertEquals($this->dummyBacktrace[$number]['function'], $logRecord['data']['function']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function introspectionProcessorLeavesOneEntryIfGivenNumberOfEntriesFromBacktraceIsGreaterOrEqualNumberOfBacktraceLevels(): void
     {
         $this->processor->method('getDebugBacktrace')->willReturn($this->dummyBacktrace);
@@ -158,9 +152,7 @@ final class IntrospectionProcessorTest extends UnitTestCase
         self::assertEquals($this->dummyBacktrace[3]['function'], $logRecord['data']['function']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function appendFullBacktraceAddsTheFullBacktraceAsStringToTheLog(): void
     {
         $this->processor->method('getDebugBacktrace')->willReturn($this->dummyBacktrace);
diff --git a/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryPeakUsageProcessorTest.php b/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryPeakUsageProcessorTest.php
index d7aaa0e3e4251acb111b9fb9e4fba4a5e2aef7df..19293c1223b5d0a84e7fa3c5cde8f9d1df5f0c52 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryPeakUsageProcessorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryPeakUsageProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Processor;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\LogRecord;
 use TYPO3\CMS\Core\Log\Processor\MemoryPeakUsageProcessor;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MemoryPeakUsageProcessorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function memoryPeakUsageProcessorAddsMemoryPeakUsageDataToLogRecord(): void
     {
         $logRecord = new LogRecord('test.core.log', LogLevel::DEBUG, 'test');
diff --git a/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryUsageProcessorTest.php b/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryUsageProcessorTest.php
index e92d2e07c4f1dd42f5fd8699170114c91888714a..75e0b7e1275ff6e97e34e9b1c8d71a74c2c8c1ba 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryUsageProcessorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Processor/MemoryUsageProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Processor;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\LogRecord;
 use TYPO3\CMS\Core\Log\Processor\MemoryUsageProcessor;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MemoryUsageProcessorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function memoryUsageProcessorAddsMemoryUsageDataToLogRecord(): void
     {
         $logRecord = new LogRecord('test.core.log', LogLevel::DEBUG, 'test');
diff --git a/typo3/sysext/core/Tests/Unit/Log/Processor/WebProcessorTest.php b/typo3/sysext/core/Tests/Unit/Log/Processor/WebProcessorTest.php
index 03aa0782911603611a738369f2790e1a1810862b..b26930009eb3eff84901f61b63e2697284e1c93d 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Processor/WebProcessorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Processor/WebProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Processor;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Log\LogRecord;
 use TYPO3\CMS\Core\Log\Processor\WebProcessor;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class WebProcessorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function webProcessorAddsWebDataToLogRecord(): void
     {
         $_SERVER['REQUEST_URI'] = '';
diff --git a/typo3/sysext/core/Tests/Unit/Log/Writer/AbstractWriterTest.php b/typo3/sysext/core/Tests/Unit/Log/Writer/AbstractWriterTest.php
index 59068c5ef9d9fd1de4eb3216e54964b4709edb0e..0dc198c1fea9ced1e144baf58659b79ddfe41e06 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Writer/AbstractWriterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Writer/AbstractWriterTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Writer;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Log\Exception\InvalidLogWriterConfigurationException;
 use TYPO3\CMS\Core\Tests\Unit\Log\Fixtures\WriterFixture;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractWriterTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionWithInvalidConfigurationOption(): void
     {
         $this->expectException(InvalidLogWriterConfigurationException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Log/Writer/DatabaseWriterTest.php b/typo3/sysext/core/Tests/Unit/Log/Writer/DatabaseWriterTest.php
index 5a1f3d40c05670bcb47e282b7e7dee0d5fde2e36..3d5c869d5092f4d50bf88a559fbe55ab01a140b3 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Writer/DatabaseWriterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Writer/DatabaseWriterTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Writer;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Log\Writer\DatabaseWriter;
 use TYPO3\CMS\Core\Utility\StringUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DatabaseWriterTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getTableReturnsPreviouslySetTable(): void
     {
         $logTable = StringUtility::getUniqueId('logtable_');
diff --git a/typo3/sysext/core/Tests/Unit/Log/Writer/FileWriterTest.php b/typo3/sysext/core/Tests/Unit/Log/Writer/FileWriterTest.php
index bee01e3d8d5f7cdc8b13058b64aa9b65758a022b..a8293cb7192e82ff300fb4549301b81fe70fadcb 100644
--- a/typo3/sysext/core/Tests/Unit/Log/Writer/FileWriterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Log/Writer/FileWriterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Log\Writer;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Log\Logger;
@@ -69,9 +71,7 @@ final class FileWriterTest extends UnitTestCase
         return $this->testRoot . $this->logFileDirectory . '/' . $prependName . $this->logFileName;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLogFileSetsLogFile(): void
     {
         $writer = GeneralUtility::makeInstance(FileWriter::class);
@@ -79,9 +79,7 @@ final class FileWriterTest extends UnitTestCase
         self::assertEquals($this->getDefaultFileName(), $writer->getLogFile());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLogFileAcceptsAbsolutePath(): void
     {
         $writer = GeneralUtility::makeInstance(FileWriter::class);
@@ -90,18 +88,14 @@ final class FileWriterTest extends UnitTestCase
         self::assertEquals($tempFile, $writer->getLogFile());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createsLogFileDirectory(): void
     {
         $this->createWriter();
         self::assertDirectoryExists($this->testRoot . $this->logFileDirectory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createsLogFile(): void
     {
         $this->createWriter();
@@ -118,10 +112,8 @@ final class FileWriterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider logsToFileDataProvider
-     */
+    #[DataProvider('logsToFileDataProvider')]
+    #[Test]
     public function logsToFile(LogRecord $record, string $expectedResult): void
     {
         $this->createWriter()->writeLog($record);
@@ -129,10 +121,8 @@ final class FileWriterTest extends UnitTestCase
         self::assertEquals($expectedResult, $logFileContents);
     }
 
-    /**
-     * @test
-     * @dataProvider logsToFileDataProvider
-     */
+    #[DataProvider('logsToFileDataProvider')]
+    #[Test]
     public function differentWritersLogToDifferentFiles(LogRecord $record, string $expectedResult): void
     {
         $firstWriter = $this->createWriter();
@@ -148,9 +138,7 @@ final class FileWriterTest extends UnitTestCase
         self::assertEquals($expectedResult, $secondLogFileContents);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logsToFileWithUnescapedCharacters(): void
     {
         $recordWithData = GeneralUtility::makeInstance(
@@ -168,9 +156,7 @@ final class FileWriterTest extends UnitTestCase
         self::assertStringContainsString($expectedResult, $logFileContents);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function aSecondLogWriterToTheSameFileDoesNotOpenTheFileTwice(): void
     {
         $firstWriter = $this->getMockBuilder(FileWriter::class)
@@ -187,9 +173,7 @@ final class FileWriterTest extends UnitTestCase
         $secondWriter->setLogFile($this->getDefaultFileName($logFilePrefix));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fileHandleIsNotClosedIfSecondFileWriterIsStillUsingSameFile(): void
     {
         $firstWriter = $this->getMockBuilder(FileWriter::class)
diff --git a/typo3/sysext/core/Tests/Unit/Mail/Event/AfterMailerSentMessageEventTest.php b/typo3/sysext/core/Tests/Unit/Mail/Event/AfterMailerSentMessageEventTest.php
index 946e62860b2a962e027a24e68d24af996434ab26..baa516149da0f041592eccaaf79981514a150d9e 100644
--- a/typo3/sysext/core/Tests/Unit/Mail/Event/AfterMailerSentMessageEventTest.php
+++ b/typo3/sysext/core/Tests/Unit/Mail/Event/AfterMailerSentMessageEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Mail\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Mailer\Transport\SendmailTransport;
 use TYPO3\CMS\Core\Mail\Event\AfterMailerSentMessageEvent;
 use TYPO3\CMS\Core\Mail\Mailer;
@@ -37,9 +38,7 @@ final class AfterMailerSentMessageEventTest extends UnitTestCase
         GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $mailer = (new Mailer());
diff --git a/typo3/sysext/core/Tests/Unit/Mail/Event/BeforeMailerSentMessageEventTest.php b/typo3/sysext/core/Tests/Unit/Mail/Event/BeforeMailerSentMessageEventTest.php
index d5cef191f338c494429e9f5d59f3b8eb40281b59..ef5df1e5e5a08c481397c1f16f48ad3afee2d722 100644
--- a/typo3/sysext/core/Tests/Unit/Mail/Event/BeforeMailerSentMessageEventTest.php
+++ b/typo3/sysext/core/Tests/Unit/Mail/Event/BeforeMailerSentMessageEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Mail\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Mailer\Envelope;
 use Symfony\Component\Mailer\Transport\SendmailTransport;
 use Symfony\Component\Mime\Address;
@@ -40,9 +41,7 @@ final class BeforeMailerSentMessageEventTest extends UnitTestCase
         GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $mailer = (new Mailer());
@@ -55,9 +54,7 @@ final class BeforeMailerSentMessageEventTest extends UnitTestCase
         self::assertEquals($rawMessage, $event->getMessage());
         self::assertEquals($envelope, $event->getEnvelope());
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function modifyingInitializedObjects(): void
     {
         $mailer = (new Mailer());
diff --git a/typo3/sysext/core/Tests/Unit/Mail/FileSpoolTest.php b/typo3/sysext/core/Tests/Unit/Mail/FileSpoolTest.php
index dc535cbabd5c1e823a220a094f3f5aacdbc1c830..8488508e0b59e85571ab3dbe75c72ace5dd9efd1 100644
--- a/typo3/sysext/core/Tests/Unit/Mail/FileSpoolTest.php
+++ b/typo3/sysext/core/Tests/Unit/Mail/FileSpoolTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Mail;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Mailer\Envelope;
 use Symfony\Component\Mailer\Transport\NullTransport;
 use Symfony\Component\Mime\Address;
@@ -39,10 +41,8 @@ final class FileSpoolTest extends UnitTestCase
         $this->subject->setTimeLimit(1);
     }
 
-    /**
-     * @test
-     * @dataProvider messageCountProvider
-     */
+    #[DataProvider('messageCountProvider')]
+    #[Test]
     public function spoolsMessagesCorrectly(int $count): void
     {
         for ($i = 1; $i <= $count; $i++) {
diff --git a/typo3/sysext/core/Tests/Unit/Mail/MailMessageTest.php b/typo3/sysext/core/Tests/Unit/Mail/MailMessageTest.php
index de1f3963d0faad14057dd7c278e74c8556ff6628..2accad81f5446dc74d8314eb297fcc68e9fcbac0 100644
--- a/typo3/sysext/core/Tests/Unit/Mail/MailMessageTest.php
+++ b/typo3/sysext/core/Tests/Unit/Mail/MailMessageTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Mail;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Mime\Address;
 use TYPO3\CMS\Core\Mail\MailMessage;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -33,17 +35,13 @@ final class MailMessageTest extends UnitTestCase
         $this->subject = new MailMessage();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isSentReturnsFalseIfMailWasNotSent(): void
     {
         self::assertFalse($this->subject->isSent());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSubjectWorksAsExpected(): void
     {
         $this->subject->setSubject('Test');
@@ -52,9 +50,7 @@ final class MailMessageTest extends UnitTestCase
         self::assertSame('Test2', $this->subject->getSubject());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDateWorksAsExpected(): void
     {
         $time = time();
@@ -65,9 +61,7 @@ final class MailMessageTest extends UnitTestCase
         self::assertSame($time, (int)$this->subject->getDate()->format('U'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setReturnPathWorksAsExpected(): void
     {
         $this->subject->setReturnPath('noreply@typo3.com');
@@ -94,10 +88,8 @@ final class MailMessageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider setSenderAddressDataProvider
-     */
+    #[DataProvider('setSenderAddressDataProvider')]
+    #[Test]
     public function setSenderWorksAsExpected(string $address, ?string $name, array $expectedAddresses): void
     {
         $this->subject->setSender($address, $name);
@@ -161,10 +153,8 @@ final class MailMessageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider globalSetAddressDataProvider
-     */
+    #[DataProvider('globalSetAddressDataProvider')]
+    #[Test]
     public function setFromWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         // We first add one address, because set should override / remove existing addresses
@@ -173,10 +163,8 @@ final class MailMessageTest extends UnitTestCase
         $this->assertCorrectAddresses($this->subject->getFrom(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalSetAddressDataProvider
-     */
+    #[DataProvider('globalSetAddressDataProvider')]
+    #[Test]
     public function setReplyToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         // We first add one address, because set should override / remove existing addresses
@@ -185,10 +173,8 @@ final class MailMessageTest extends UnitTestCase
         $this->assertCorrectAddresses($this->subject->getReplyTo(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalSetAddressDataProvider
-     */
+    #[DataProvider('globalSetAddressDataProvider')]
+    #[Test]
     public function setToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         // We first add one address, because set should override / remove existing addresses
@@ -197,10 +183,8 @@ final class MailMessageTest extends UnitTestCase
         $this->assertCorrectAddresses($this->subject->getTo(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalSetAddressDataProvider
-     */
+    #[DataProvider('globalSetAddressDataProvider')]
+    #[Test]
     public function setCcToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         // We first add one address, because set should override / remove existing addresses
@@ -209,10 +193,8 @@ final class MailMessageTest extends UnitTestCase
         $this->assertCorrectAddresses($this->subject->getCc(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalSetAddressDataProvider
-     */
+    #[DataProvider('globalSetAddressDataProvider')]
+    #[Test]
     public function setBccToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         // We first add one address, because set should override / remove existing addresses
@@ -242,59 +224,47 @@ final class MailMessageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider globalAddAddressDataProvider
-     */
+    #[DataProvider('globalAddAddressDataProvider')]
+    #[Test]
     public function addFromToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         $this->subject->addFrom($address, $name);
         $this->assertCorrectAddresses($this->subject->getFrom(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalAddAddressDataProvider
-     */
+    #[DataProvider('globalAddAddressDataProvider')]
+    #[Test]
     public function addReplyToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         $this->subject->addReplyTo($address, $name);
         $this->assertCorrectAddresses($this->subject->getReplyTo(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalAddAddressDataProvider
-     */
+    #[DataProvider('globalAddAddressDataProvider')]
+    #[Test]
     public function addToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         $this->subject->addTo($address, $name);
         $this->assertCorrectAddresses($this->subject->getTo(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalAddAddressDataProvider
-     */
+    #[DataProvider('globalAddAddressDataProvider')]
+    #[Test]
     public function addCcToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         $this->subject->addCc($address, $name);
         $this->assertCorrectAddresses($this->subject->getCc(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     * @dataProvider globalAddAddressDataProvider
-     */
+    #[DataProvider('globalAddAddressDataProvider')]
+    #[Test]
     public function addBccToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
     {
         $this->subject->addBcc($address, $name);
         $this->assertCorrectAddresses($this->subject->getBcc(), $expectedAddresses);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setReadReceiptToToWorksAsExpected(): void
     {
         $this->subject->setReadReceiptTo('foo@example.com');
@@ -312,10 +282,8 @@ final class MailMessageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider exceptionIsThrownForInvalidArgumentCombinationsDataProvider
-     */
+    #[DataProvider('exceptionIsThrownForInvalidArgumentCombinationsDataProvider')]
+    #[Test]
     public function exceptionIsThrownForInvalidArgumentCombinations(string $method): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Mail/MailerTest.php b/typo3/sysext/core/Tests/Unit/Mail/MailerTest.php
index ef82148c1c762f2371840eebc36f9c7a4298b82d..18bc4caf9d8a76f0fecdee65f8a7d44cae327150 100644
--- a/typo3/sysext/core/Tests/Unit/Mail/MailerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Mail/MailerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Mail;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Symfony\Component\Mailer\Transport\NullTransport;
@@ -61,9 +63,7 @@ final class MailerTest extends UnitTestCase
         };
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function injectedSettingsAreNotReplacedByGlobalSettings(): void
     {
         $settings = ['transport' => 'mbox', 'transport_mbox_file' => '/path/to/file'];
@@ -77,9 +77,7 @@ final class MailerTest extends UnitTestCase
         $this->subject->__construct();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function globalSettingsAreUsedIfNoSettingsAreInjected(): void
     {
         $settings = ($GLOBALS['TYPO3_CONF_VARS']['MAIL'] = ['transport' => 'sendmail', 'transport_sendmail_command' => 'sendmail -bs']);
@@ -101,10 +99,8 @@ final class MailerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider wrongConfigurationProvider
-     */
+    #[DataProvider('wrongConfigurationProvider')]
+    #[Test]
     public function wrongConfigurationThrowsException(array $settings): void
     {
         $this->expectException(Exception::class);
@@ -116,9 +112,7 @@ final class MailerTest extends UnitTestCase
         $this->subject->__construct();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function providingCorrectClassnameDoesNotThrowException(): void
     {
         $transportFactory = new TransportFactory($this->eventDispatcher, $this->logManager);
@@ -127,9 +121,7 @@ final class MailerTest extends UnitTestCase
         $this->subject->__construct();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function noPortSettingSetsPortTo25(): void
     {
         $transportFactory = new TransportFactory($this->eventDispatcher, $this->logManager);
@@ -140,9 +132,7 @@ final class MailerTest extends UnitTestCase
         self::assertEquals(25, $port);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emptyPortSettingSetsPortTo25(): void
     {
         $transportFactory = new TransportFactory($this->eventDispatcher, $this->logManager);
@@ -153,9 +143,7 @@ final class MailerTest extends UnitTestCase
         self::assertEquals(25, $port);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function givenPortSettingIsRespected(): void
     {
         $transportFactory = new TransportFactory($this->eventDispatcher, $this->logManager);
@@ -180,10 +168,8 @@ final class MailerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getRealTransportReturnsNoSpoolTransportProvider
-     */
+    #[DataProvider('getRealTransportReturnsNoSpoolTransportProvider')]
+    #[Test]
     public function getRealTransportReturnsNoSpoolTransport($settings): void
     {
         $transportFactory = new TransportFactory($this->eventDispatcher, $this->logManager);
diff --git a/typo3/sysext/core/Tests/Unit/Mail/TransportFactoryTest.php b/typo3/sysext/core/Tests/Unit/Mail/TransportFactoryTest.php
index 6fed6dbc4f9ddfff4cf9cdde76cbb2e29e89657a..ffca2de0e1de600eac71ea59e7fe1f1270ebec19 100644
--- a/typo3/sysext/core/Tests/Unit/Mail/TransportFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Mail/TransportFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Mail;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
 use Symfony\Component\Mailer\Transport\NullTransport;
@@ -54,9 +55,7 @@ final class TransportFactoryTest extends UnitTestCase
         return $transportFactory;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReturnsSpoolTransportUsingFileSpool(): void
     {
         $mailSettings = [
@@ -88,9 +87,7 @@ final class TransportFactoryTest extends UnitTestCase
         self::assertStringContainsString($mailSettings['transport_spool_filepath'], $path);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReturnsSpoolTransportUsingMemorySpool(): void
     {
         $mailSettings = [
@@ -119,9 +116,7 @@ final class TransportFactoryTest extends UnitTestCase
         self::assertInstanceOf(MemorySpool::class, $transport);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReturnsSpoolTransportUsingCustomSpool(): void
     {
         $mailSettings = [
@@ -149,9 +144,7 @@ final class TransportFactoryTest extends UnitTestCase
         self::assertSame($mailSettings, $transport->getSettings());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsRuntimeExceptionForInvalidCustomSpool(): void
     {
         $this->expectExceptionCode(1466799482);
@@ -177,9 +170,7 @@ final class TransportFactoryTest extends UnitTestCase
         $this->getSubject($eventDispatcher)->get($mailSettings);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionForMissingDsnConfig(): void
     {
         $this->expectExceptionCode(1615021869);
@@ -192,9 +183,7 @@ final class TransportFactoryTest extends UnitTestCase
         $this->getSubject($eventDispatcher)->get($mailSettings);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dsnTransportCallsDispatchOfDispatcher(): void
     {
         $mailSettings = [
@@ -217,9 +206,7 @@ final class TransportFactoryTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReturnsMailerTransportInterface(): void
     {
         $mailSettings = [
@@ -244,9 +231,7 @@ final class TransportFactoryTest extends UnitTestCase
         self::assertInstanceOf(TransportInterface::class, $transport);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function smtpTransportCallsDispatchOfDispatcher(): void
     {
         $mailSettings = [
@@ -280,9 +265,7 @@ final class TransportFactoryTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sendmailTransportCallsDispatchOfDispatcher(): void
     {
         $mailSettings = [
@@ -316,9 +299,7 @@ final class TransportFactoryTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullTransportCallsDispatchOfDispatcher(): void
     {
         $mailSettings = [
@@ -348,9 +329,7 @@ final class TransportFactoryTest extends UnitTestCase
         $transport->send($message);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function smtpTransportIsCorrectlyConfigured(): void
     {
         $mailSettings = [
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageRendererResolverTest.php b/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageRendererResolverTest.php
index 1be0ea44e036290fd1e01af7e3cbe27d2f4e4f00..6ac1ac90c8c4382610b4aa98307c8d728d27eb9c 100644
--- a/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageRendererResolverTest.php
+++ b/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageRendererResolverTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Messaging;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Messaging\FlashMessageRendererResolver;
 use TYPO3\CMS\Core\Messaging\Renderer\FlashMessageRendererInterface;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FlashMessageRendererResolverTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function flashMessageRendererResolverResolveRendererWithoutContext(): void
     {
         $rendererClass = GeneralUtility::makeInstance(FlashMessageRendererResolver::class)->resolve();
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageServiceTest.php b/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageServiceTest.php
index 4e70a8374dcf77099b8cc2ec395efaed739fd1a9..a0285093558367b183f9177d3303ed620fe7ca08 100644
--- a/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Messaging;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Messaging\FlashMessageService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +31,7 @@ final class FlashMessageServiceTest extends UnitTestCase
         $this->flashMessageService = new FlashMessageService();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMessageQueueByIdentifierRegistersNewFlashmessageQueuesOnlyOnce(): void
     {
         self::assertSame(
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageTest.php b/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageTest.php
index b1c57db6b81ee5d97911f51985d95202a4610ddf..f89812698603821f3e241613c52a894a9b25fc3b 100644
--- a/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageTest.php
+++ b/typo3/sysext/core/Tests/Unit/Messaging/FlashMessageTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Messaging;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FlashMessageTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function jsonSerializeReturnsArrayWithDetailData(): void
     {
         $message = new FlashMessage('aMessage', 'aTitle', ContextualFeedbackSeverity::INFO);
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/BootstrapRendererTest.php b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/BootstrapRendererTest.php
index e4f7bd5d1825865441aef7a3f3876c14888ae108..196be30fe07cc55b472690b7f2572f778f91818b 100644
--- a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/BootstrapRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/BootstrapRendererTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Messaging\Renderer;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
@@ -45,9 +46,7 @@ final class BootstrapRendererTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCreatesCorrectOutputForFlashMessage(): void
     {
         $rendererClass = GeneralUtility::makeInstance(BootstrapRenderer::class);
@@ -65,9 +64,7 @@ final class BootstrapRendererTest extends UnitTestCase
         self::assertStringContainsString('<p class="alert-message">messageBody</p>', $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCreatesCorrectOutputForFlashMessageWithoutTitle(): void
     {
         $rendererClass = GeneralUtility::makeInstance(BootstrapRenderer::class);
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/ListRendererTest.php b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/ListRendererTest.php
index d8f8693232895bade240d3673c119fe5489991a7..ca87563bf1d879ef076498af4037e287874601b9 100644
--- a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/ListRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/ListRendererTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Messaging\Renderer;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Messaging\Renderer\ListRenderer;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ListRendererTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCreatesCorrectOutputForFlashMessage(): void
     {
         $rendererClass = GeneralUtility::makeInstance(ListRenderer::class);
@@ -40,9 +39,7 @@ final class ListRendererTest extends UnitTestCase
         self::assertSame('<ul class="typo3-messages"><li class="alert alert-notice"><h4 class="alert-title">messageTitle</h4><p class="alert-message">messageBody</p></li></ul>', $rendererClass->render([$flashMessage]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCreatesCorrectOutputForFlashMessageWithoutTitle(): void
     {
         $rendererClass = GeneralUtility::makeInstance(ListRenderer::class);
diff --git a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/PlaintextRendererTest.php b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/PlaintextRendererTest.php
index 1e299eef9a6cc4e6048a4d00f267f6b5647f1dcf..b1a5fc4aaf2716e471ac77f063673250de1518f5 100644
--- a/typo3/sysext/core/Tests/Unit/Messaging/Renderer/PlaintextRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Messaging/Renderer/PlaintextRendererTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Messaging\Renderer;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Messaging\Renderer\PlaintextRenderer;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PlaintextRendererTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCreatesCorrectOutputForFlashMessage(): void
     {
         $rendererClass = GeneralUtility::makeInstance(PlaintextRenderer::class);
@@ -40,9 +39,7 @@ final class PlaintextRendererTest extends UnitTestCase
         self::assertSame('[NOTICE] messageTitle: messageBody', $rendererClass->render([$flashMessage]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCreatesCorrectOutputForFlashMessageWithoutTitle(): void
     {
         $rendererClass = GeneralUtility::makeInstance(PlaintextRenderer::class);
diff --git a/typo3/sysext/core/Tests/Unit/MetaTag/GenericMetaTagManagerTest.php b/typo3/sysext/core/Tests/Unit/MetaTag/GenericMetaTagManagerTest.php
index a6bf266762dd75248b89ae91f410740b0b2641aa..0516b4cfe6eefdd195c15c566bf00931587a7ceb 100644
--- a/typo3/sysext/core/Tests/Unit/MetaTag/GenericMetaTagManagerTest.php
+++ b/typo3/sysext/core/Tests/Unit/MetaTag/GenericMetaTagManagerTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\MetaTag;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\MetaTag\GenericMetaTagManager;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class GenericMetaTagManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfGetAllHandledPropertiesReturnsNonEmptyArray(): void
     {
         $manager = new GenericMetaTagManager();
@@ -33,9 +33,7 @@ final class GenericMetaTagManagerTest extends UnitTestCase
         self::assertEmpty($handledProperties);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfMethodCanHandlePropertyAlwaysReturnsTrue(): void
     {
         $manager = new GenericMetaTagManager();
@@ -44,11 +42,8 @@ final class GenericMetaTagManagerTest extends UnitTestCase
         self::assertTrue($manager->canHandleProperty('og:title'));
     }
 
-    /**
-     * @dataProvider propertiesProvider
-     *
-     * @test
-     */
+    #[DataProvider('propertiesProvider')]
+    #[Test]
     public function checkIfPropertyIsStoredAfterAddingProperty($property, $expected, $expectedRenderedTag): void
     {
         $manager = new GenericMetaTagManager();
@@ -64,9 +59,7 @@ final class GenericMetaTagManagerTest extends UnitTestCase
         self::assertEquals($expectedRenderedTag, $manager->renderProperty($property['property']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRenderAllPropertiesRendersCorrectMetaTags(): void
     {
         $properties = [
@@ -128,9 +121,7 @@ final class GenericMetaTagManagerTest extends UnitTestCase
         self::assertEquals($expected, $manager->renderAllProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfRemovePropertyReallyRemovesProperty(): void
     {
         $manager = new GenericMetaTagManager();
diff --git a/typo3/sysext/core/Tests/Unit/MetaTag/MetaTagManagerRegistryTest.php b/typo3/sysext/core/Tests/Unit/MetaTag/MetaTagManagerRegistryTest.php
index cd28dba7ddbea0bf0b9a87cb55300febf05dd634..708f0375c5eb55891ea468bd4faa508a6810f018 100644
--- a/typo3/sysext/core/Tests/Unit/MetaTag/MetaTagManagerRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/MetaTag/MetaTagManagerRegistryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\MetaTag;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\MetaTag\GenericMetaTagManager;
 use TYPO3\CMS\Core\MetaTag\Html5MetaTagManager;
 use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry;
@@ -28,9 +30,7 @@ final class MetaTagManagerRegistryTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRegisterNonExistingManagerDoesntThrowErrorWhenFetchingManagers(): void
     {
         $metaTagManagerRegistry = new MetaTagManagerRegistry();
@@ -39,10 +39,8 @@ final class MetaTagManagerRegistryTest extends UnitTestCase
         $metaTagManagerRegistry->getAllManagers();
     }
 
-    /**
-     * @dataProvider registerMetaTagManagersProvider
-     * @test
-     */
+    #[DataProvider('registerMetaTagManagersProvider')]
+    #[Test]
     public function checkRegisterExistingManagerDoRegister(array $managersToRegister, array $expected): void
     {
         $metaTagManagerRegistry = new MetaTagManagerRegistry();
@@ -66,9 +64,7 @@ final class MetaTagManagerRegistryTest extends UnitTestCase
         self::assertEquals($expected, $managers);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkConditionRaceResultsIntoException(): void
     {
         $input = [
diff --git a/typo3/sysext/core/Tests/Unit/Middleware/VerifyHostHeaderTest.php b/typo3/sysext/core/Tests/Unit/Middleware/VerifyHostHeaderTest.php
index 2d835a886de3bb2ea93d83cba193f559642ed425..b16d612bd3bfcf088d3bf74ef4a71fd8e02bec81 100644
--- a/typo3/sysext/core/Tests/Unit/Middleware/VerifyHostHeaderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Middleware/VerifyHostHeaderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Middleware;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Server\RequestHandlerInterface;
 use TYPO3\CMS\Core\Http\Response;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class VerifyHostHeaderTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function isAllowedHostHeaderValueReturnsFalseIfTrustedHostsIsNotConfigured(): void
     {
         $subject = new VerifyHostHeader('');
@@ -63,9 +63,9 @@ final class VerifyHostHeaderTest extends UnitTestCase
     /**
      * @param string $httpHost HTTP_HOST string
      * @param string $hostNamePattern trusted hosts pattern
-     * @test
-     * @dataProvider hostnamesMatchingTrustedHostsConfigurationDataProvider
      */
+    #[DataProvider('hostnamesMatchingTrustedHostsConfigurationDataProvider')]
+    #[Test]
     public function isAllowedHostHeaderValueReturnsTrueIfHostValueMatches(string $httpHost, string $hostNamePattern): void
     {
         $serverParams = $_SERVER;
@@ -77,9 +77,9 @@ final class VerifyHostHeaderTest extends UnitTestCase
     /**
      * @param string $httpHost HTTP_HOST string
      * @param string $hostNamePattern trusted hosts pattern
-     * @test
-     * @dataProvider hostnamesNotMatchingTrustedHostsConfigurationDataProvider
      */
+    #[DataProvider('hostnamesNotMatchingTrustedHostsConfigurationDataProvider')]
+    #[Test]
     public function isAllowedHostHeaderValueReturnsFalseIfHostValueMatches(string $httpHost, string $hostNamePattern): void
     {
         $serverParams = $_SERVER;
@@ -167,10 +167,8 @@ final class VerifyHostHeaderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider serverNamePatternDataProvider
-     */
+    #[DataProvider('serverNamePatternDataProvider')]
+    #[Test]
     public function isAllowedHostHeaderValueWorksCorrectlyWithWithServerNamePattern(
         string $httpHost,
         string $serverName,
@@ -188,10 +186,8 @@ final class VerifyHostHeaderTest extends UnitTestCase
         self::assertSame($isAllowed, $subject->isAllowedHostHeaderValue($httpHost, $serverParams));
     }
 
-    /**
-     * @test
-     * @dataProvider serverNamePatternDataProvider
-     */
+    #[DataProvider('serverNamePatternDataProvider')]
+    #[Test]
     public function isAllowedHostHeaderValueWorksCorrectlyWithWithServerNamePatternAndSslProxy(
         string $httpHost,
         string $serverName,
@@ -210,10 +206,8 @@ final class VerifyHostHeaderTest extends UnitTestCase
         self::assertSame($isAllowed, $subject->isAllowedHostHeaderValue($httpHost, $serverParams));
     }
 
-    /**
-     * @test
-     * @dataProvider hostnamesNotMatchingTrustedHostsConfigurationDataProvider
-     */
+    #[DataProvider('hostnamesNotMatchingTrustedHostsConfigurationDataProvider')]
+    #[Test]
     public function processThrowsExceptionForNotAllowedHostnameValues(string $httpHost, string $hostNamePattern): void
     {
         $serverParams = $_SERVER;
@@ -228,10 +222,8 @@ final class VerifyHostHeaderTest extends UnitTestCase
         $subject->process($request, $requestHandlerMock);
     }
 
-    /**
-     * @test
-     * @dataProvider hostnamesNotMatchingTrustedHostsConfigurationDataProvider
-     */
+    #[DataProvider('hostnamesNotMatchingTrustedHostsConfigurationDataProvider')]
+    #[Test]
     public function processAllowsAllHostnameValuesIfHostPatternIsSetToAllowAll(string $httpHost): void
     {
         $serverParams = $_SERVER;
diff --git a/typo3/sysext/core/Tests/Unit/Migrations/TcaMigrationTest.php b/typo3/sysext/core/Tests/Unit/Migrations/TcaMigrationTest.php
index 54b8f3c92aed8a7bbbde31d7b36ddc38ea231c74..afae6f624d967d64ac12fe4ec717ed491ec69ded 100644
--- a/typo3/sysext/core/Tests/Unit/Migrations/TcaMigrationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Migrations/TcaMigrationTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Migrations;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Migrations\TcaMigration;
 use TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaMigrationTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function missingTypeThrowsException(): void
     {
         $input = [
@@ -53,9 +53,7 @@ final class TcaMigrationTest extends UnitTestCase
         $subject->migrate($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function migrateReturnsGivenArrayUnchangedIfNoMigrationNeeded(): void
     {
         $input = $expected = [
@@ -83,9 +81,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function migrateAddsMissingColumnsConfig(): void
     {
         $input = [
@@ -138,9 +134,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ctrlSelIconFieldPathIsRemoved(): void
     {
         $input = [
@@ -176,9 +170,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ctrlSetToDefaultOnCopyIsRemoved(): void
     {
         $input = [
@@ -410,19 +402,15 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider ctrlIntegrityColumnsAreAvailableDataProvider
-     */
+    #[DataProvider('ctrlIntegrityColumnsAreAvailableDataProvider')]
+    #[Test]
     public function ctrlIntegrityColumnsAreAvailable(array $tca, array $expectation): void
     {
         $subject = new TcaMigration();
         self::assertSame($expectation, $subject->migrate($tca));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeEnableMultiSelectFilterTextfieldConfigurationIsRemoved(): void
     {
         $input = [
@@ -473,9 +461,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeExcludeFieldForTransOrigPointerFieldIsRemoved(): void
     {
         $input = [
@@ -555,9 +541,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeShowRecordFieldListFieldIsRemoved(): void
     {
         $input = [
@@ -588,9 +572,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ctrlShadowColumnsForMovePlaceholdersIsRemoved(): void
     {
         $input = [
@@ -623,9 +605,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ctrlShadowColumnsForMoveAndPlaceholdersIsRemoved(): void
     {
         $input = [
@@ -659,9 +639,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function languageFieldsAreMigratedToTcaTypeLanguage(): void
     {
         $input = [
@@ -820,9 +798,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function showRemovedLocalizationRecordsRemoved(): void
     {
         $input = [
@@ -903,9 +879,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fileFolderConfigurationIsMigrated(): void
     {
         $input = [
@@ -1054,9 +1028,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function levelLinksPositionIsMigrated(): void
     {
         $input = [
@@ -1167,9 +1139,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertEquals($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rootUidIsMigratedToStartingPositions(): void
     {
         $input = [
@@ -1321,10 +1291,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider internalTypeFolderMigratedToTypeDataProvider
-     * @test
-     */
+    #[DataProvider('internalTypeFolderMigratedToTypeDataProvider')]
+    #[Test]
     public function internalTypeFolderMigratedToType(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -1441,10 +1409,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider requiredFlagIsMigratedDataProvider
-     * @test
-     */
+    #[DataProvider('requiredFlagIsMigratedDataProvider')]
+    #[Test]
     public function requiredFlagIsMigrated(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -1562,11 +1528,11 @@ final class TcaMigrationTest extends UnitTestCase
     }
 
     /**
-     * @dataProvider evalNullMigratedToNullableOptionDataProvider
-     * @test
      * @param array<string, mixed> $input
      * @param array<string, mixed> $expected
      */
+    #[DataProvider('evalNullMigratedToNullableOptionDataProvider')]
+    #[Test]
     public function evalNullMigratedToNullableOption(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -1666,10 +1632,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider evalEmailMigratedToTypeDataProvider
-     * @test
-     */
+    #[DataProvider('evalEmailMigratedToTypeDataProvider')]
+    #[Test]
     public function evalEmailMigratedToType(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -1736,10 +1700,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider typeNoneColsMigratedToSizeDataProvider
-     * @test
-     */
+    #[DataProvider('typeNoneColsMigratedToSizeDataProvider')]
+    #[Test]
     public function typeNoneColsMigratedToSize(array $tca, array $expected): void
     {
         $subject = new TcaMigration();
@@ -1976,10 +1938,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider renderTypeInputLinkMigratedToTypeLinkDataProvider
-     * @test
-     */
+    #[DataProvider('renderTypeInputLinkMigratedToTypeLinkDataProvider')]
+    #[Test]
     public function renderTypeInputLinkMigratedToTypeLink(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -2097,10 +2057,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider evalPasswordSaltedPasswordMigratedToTypePasswordDataProvider
-     * @test
-     */
+    #[DataProvider('evalPasswordSaltedPasswordMigratedToTypePasswordDataProvider')]
+    #[Test]
     public function evalPasswordSaltedPasswordMigratedToTypePassword(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -2383,19 +2341,15 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider renderTypeInputDateTimeMigratedToTypeDatetimeDataProvider
-     * @test
-     */
+    #[DataProvider('renderTypeInputDateTimeMigratedToTypeDatetimeDataProvider')]
+    #[Test]
     public function renderTypeInputDateTimeMigratedToTypeDatetime(array $input, array $expected): void
     {
         $subject = new TcaMigration();
         self::assertSame($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authModeEnforceIsRemoved(): void
     {
         $input = [
@@ -2444,9 +2398,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertSame($expected, (new TcaMigration())->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function authModeValuesAreEnforced(): void
     {
         $input = [
@@ -2793,10 +2745,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider selectIndividualAllowDenyMigratedToNewPositionDataProvider
-     * @test
-     */
+    #[DataProvider('selectIndividualAllowDenyMigratedToNewPositionDataProvider')]
+    #[Test]
     public function selectIndividualAllowDenyMigratedToNewPosition(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -2876,10 +2826,8 @@ final class TcaMigrationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider renderTypeColorpickerToTypeColorDataProvider
-     * @test
-     */
+    #[DataProvider('renderTypeColorpickerToTypeColorDataProvider')]
+    #[Test]
     public function renderTypeColorpickerToTypeColor(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -3047,11 +2995,11 @@ final class TcaMigrationTest extends UnitTestCase
     }
 
     /**
-     * @dataProvider typeTextWithEvalIntOrDouble2MigratedToTypeNumberDataProvider
-     * @test
      * @param array<string, mixed> $input
      * @param array<string, mixed> $expected
      */
+    #[DataProvider('typeTextWithEvalIntOrDouble2MigratedToTypeNumberDataProvider')]
+    #[Test]
     public function typeTextWithEvalIntOrDouble2MigratedToTypeNumber(array $input, array $expected): void
     {
         $subject = new TcaMigration();
@@ -3098,20 +3046,18 @@ final class TcaMigrationTest extends UnitTestCase
     }
 
     /**
-     * @dataProvider propertyAlwaysDescriptionIsRemovedDataProvider
-     * @test
      * @param array<string, mixed> $input
      * @param array<string, mixed> $expected
      */
+    #[DataProvider('propertyAlwaysDescriptionIsRemovedDataProvider')]
+    #[Test]
     public function propertyAlwaysDescriptionIsRemoved(array $input, array $expected): void
     {
         $subject = new TcaMigration();
         self::assertSame($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ctrlCruserIdIsRemoved(): void
     {
         $input = [
@@ -3413,12 +3359,12 @@ final class TcaMigrationTest extends UnitTestCase
     }
 
     /**
-     * @dataProvider falHandlingInTypeInlineIsMigratedToTypeFileDataProvider
-     * @test
      * @param array<string, mixed> $input
      * @param array<string, mixed> $expected
      * @param string $expectedMessagePart
      */
+    #[DataProvider('falHandlingInTypeInlineIsMigratedToTypeFileDataProvider')]
+    #[Test]
     public function falHandlingInTypeInlineIsMigratedToTypeFile(array $input, array $expected, $expectedMessagePart = ''): void
     {
         $subject = new TcaMigration();
@@ -3435,9 +3381,7 @@ final class TcaMigrationTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function falRelatedElementBrowserOptionsAreRemovedFromTypeGroup(): void
     {
         $input = [
@@ -3470,9 +3414,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertSame($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function falRelatedOptionsAreRemovedFromTypeInline(): void
     {
         $input = [
@@ -3508,9 +3450,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertSame($expected, $subject->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function passContentIsRemovedFromTypeNone(): void
     {
         $input = [
@@ -3551,9 +3491,7 @@ final class TcaMigrationTest extends UnitTestCase
         self::assertSame($expected, (new TcaMigration())->migrate($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function itemsAreMigratedToAssociatedArray(): void
     {
         $input = [
diff --git a/typo3/sysext/core/Tests/Unit/Package/AbstractServiceProviderTest.php b/typo3/sysext/core/Tests/Unit/Package/AbstractServiceProviderTest.php
index 2d2e53cdaeef491208341fadfbee43c805318c94..273ab4059456934c8ffdbe2d951bae9377bbb48f 100644
--- a/typo3/sysext/core/Tests/Unit/Package/AbstractServiceProviderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Package/AbstractServiceProviderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Package;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
@@ -31,9 +32,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractServiceProviderTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function configureMiddlewaresReturnsMergedMiddlewares(): void
     {
         $containerMock = $this->createMock(ContainerInterface::class);
@@ -55,9 +54,7 @@ final class AbstractServiceProviderTest extends UnitTestCase
         self::assertEquals($expected, $middlewares);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configureMiddlewaresReturnsMergedMiddlewaresWithPseudoServiceProvider(): void
     {
         $containerMock = $this->createMock(ContainerInterface::class);
@@ -84,9 +81,7 @@ final class AbstractServiceProviderTest extends UnitTestCase
         self::assertEquals($expected, $middlewares);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configureMiddlewaresReturnsMergedMiddlewaresWithOverrides(): void
     {
         $containerMock = $this->createMock(ContainerInterface::class);
@@ -114,9 +109,7 @@ final class AbstractServiceProviderTest extends UnitTestCase
         self::assertEquals($expected, $middlewares);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configureMiddlewaresReturnsMergedMiddlewaresWithReplacements(): void
     {
         $containerMock = $this->createMock(ContainerInterface::class);
@@ -143,9 +136,7 @@ final class AbstractServiceProviderTest extends UnitTestCase
         self::assertEquals($expected, $middlewares);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function newReturnsClassInstance(): void
     {
         $newClosure = $this->getClosureForNew();
@@ -153,9 +144,7 @@ final class AbstractServiceProviderTest extends UnitTestCase
         self::assertInstanceOf(\stdClass::class, $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function newInjectsLogger(): void
     {
         $containerMock = $this->createMock(ContainerInterface::class);
diff --git a/typo3/sysext/core/Tests/Unit/Package/MetaDataTest.php b/typo3/sysext/core/Tests/Unit/Package/MetaDataTest.php
index 54e06e7ac7711814c267a586e6f15ad1eeb609a5..a93da444f1068d12bd3ae888b5c97090286f424b 100644
--- a/typo3/sysext/core/Tests/Unit/Package/MetaDataTest.php
+++ b/typo3/sysext/core/Tests/Unit/Package/MetaDataTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Package;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Package\MetaData;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -49,10 +51,8 @@ final class MetaDataTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider typeIsCorrectlyResolvedDataProvider
-     */
+    #[DataProvider('typeIsCorrectlyResolvedDataProvider')]
+    #[Test]
     public function typeIsCorrectlyResolved(?string $type, bool $isExtension, bool $isFramework): void
     {
         $metaData = new MetaData('foo');
diff --git a/typo3/sysext/core/Tests/Unit/Package/PackageManagerTest.php b/typo3/sysext/core/Tests/Unit/Package/PackageManagerTest.php
index 7b7f4885ed265646d4024408358aa8a12da358f0..47c2af3a894d8fda90703b386d8e3dcaf88f9e2b 100644
--- a/typo3/sysext/core/Tests/Unit/Package/PackageManagerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Package/PackageManagerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Package;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Cache\Backend\SimpleFileBackend;
 use TYPO3\CMS\Core\Cache\Frontend\PhpFrontend;
@@ -107,9 +109,9 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws UnknownPackageException
      */
+    #[Test]
     public function getPackageReturnsTheSpecifiedPackage(): void
     {
         $this->createPackage('TYPO3.MyPackage');
@@ -119,9 +121,9 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws UnknownPackageException
      */
+    #[Test]
     public function getPackageThrowsExceptionOnUnknownPackage(): void
     {
         $this->expectException(UnknownPackageException::class);
@@ -130,9 +132,7 @@ final class PackageManagerTest extends UnitTestCase
         $this->packageManager->getPackage('PrettyUnlikelyThatThisPackageExists');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function scanAvailablePackagesTraversesThePackagesDirectoryAndRegistersPackagesItFinds(): void
     {
         $expectedPackageKeys = [
@@ -161,9 +161,7 @@ final class PackageManagerTest extends UnitTestCase
         self::assertEquals(sort($expectedPackageKeys), sort($actualPackageKeys));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function scanAvailablePackagesKeepsExistingPackageConfiguration(): void
     {
         $expectedPackageKeys = [
@@ -206,9 +204,7 @@ final class PackageManagerTest extends UnitTestCase
         self::assertEquals('Application/' . $packageKey . '/', $packageStates['packages'][$packageKey]['packagePath']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractPackageKeyFromPackagePathFindsPackageKey(): void
     {
         $package = $this->createPackage('typo3/my-package');
@@ -219,9 +215,9 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws UnknownPackagePathException
      */
+    #[Test]
     public function extractPackageKeyFromPackagePathThrowsExceptionOnNonPackagePaths(): void
     {
         $this->expectException(UnknownPackageException::class);
@@ -231,9 +227,9 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws UnknownPackageException
      */
+    #[Test]
     public function extractPackageKeyFromPackagePathThrowsExceptionOnInvalidPackagePaths(): void
     {
         $this->expectException(UnknownPackagePathException::class);
@@ -242,9 +238,7 @@ final class PackageManagerTest extends UnitTestCase
         $this->packageManager->extractPackageKeyFromPackagePath('EXT:typo3/my-package/path/to/file');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function packageStatesConfigurationContainsRelativePaths(): void
     {
         $packageKeys = [
@@ -294,10 +288,8 @@ final class PackageManagerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider packageKeysAndPaths
-     */
+    #[DataProvider('packageKeysAndPaths')]
+    #[Test]
     public function createPackageCreatesPackageFolderAndReturnsPackage($packageKey, $expectedPackagePath): void
     {
         $actualPackage = $this->createPackage($packageKey);
@@ -310,11 +302,11 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws ProtectedPackageKeyException
      * @throws UnknownPackageException
      * @throws PackageStatesFileNotWritableException
      */
+    #[Test]
     public function activatePackageAndDeactivatePackageActivateAndDeactivateTheGivenPackage(): void
     {
         $packageKey = 'Acme.YetAnotherTestPackage';
@@ -331,11 +323,11 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws PackageStatesFileNotWritableException
      * @throws ProtectedPackageKeyException
      * @throws UnknownPackageException
      */
+    #[Test]
     public function deactivatePackageThrowsAnExceptionIfPackageIsProtected(): void
     {
         $this->expectException(ProtectedPackageKeyException::class);
@@ -348,11 +340,11 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws ProtectedPackageKeyException
      * @throws UnknownPackageException
      * @throws Exception
      */
+    #[Test]
     public function deletePackageThrowsErrorIfPackageIsNotAvailable(): void
     {
         $this->expectException(UnknownPackageException::class);
@@ -363,12 +355,12 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws InvalidPackageStateException
      * @throws ProtectedPackageKeyException
      * @throws UnknownPackageException
      * @throws Exception
      */
+    #[Test]
     public function deletePackageThrowsAnExceptionIfPackageIsProtected(): void
     {
         $this->expectException(ProtectedPackageKeyException::class);
@@ -380,12 +372,12 @@ final class PackageManagerTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @throws InvalidPackageStateException
      * @throws ProtectedPackageKeyException
      * @throws UnknownPackageException
      * @throws Exception
      */
+    #[Test]
     public function deletePackageRemovesPackageFromAvailableAndActivePackagesAndDeletesThePackageDirectory(): void
     {
         $this->createPackage('Acme.YetAnotherTestPackage');
@@ -582,10 +574,8 @@ final class PackageManagerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildDependencyGraphBuildsCorrectGraphDataProvider
-     */
+    #[DataProvider('buildDependencyGraphBuildsCorrectGraphDataProvider')]
+    #[Test]
     public function buildDependencyGraphBuildsCorrectGraph(array $unsortedPackageStatesConfiguration, array $frameworkPackageKeys, array $expectedGraph): void
     {
         $packageManager = $this->getAccessibleMock(PackageManager::class, ['findFrameworkPackages'], [new DependencyOrderingService()]);
@@ -706,10 +696,8 @@ final class PackageManagerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider packageSortingDataProvider
-     */
+    #[DataProvider('packageSortingDataProvider')]
+    #[Test]
     public function sortPackageStatesConfigurationByDependencyMakesSureThatDependantPackagesAreStandingBeforeAPackageInTheInternalPackagesAndPackagesConfigurationArrays(
         array $unsortedPackageStatesConfiguration,
         array $frameworkPackageKeys,
@@ -723,9 +711,7 @@ final class PackageManagerTest extends UnitTestCase
         self::assertEquals($expectedSortedPackageKeys, $sortedPackageKeys, 'The package states configurations have not been ordered according to their dependencies!');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sortPackageStatesConfigurationByDependencyThrowsExceptionWhenCycleDetected(): void
     {
         $unsortedPackageStatesConfiguration = [
diff --git a/typo3/sysext/core/Tests/Unit/Package/PackageTest.php b/typo3/sysext/core/Tests/Unit/Package/PackageTest.php
index d3ca8884f271a7e85bbe91512f1f10eba773ad92..821e4237a23bca2d9d0e5ee00f95880838a3c1a0 100644
--- a/typo3/sysext/core/Tests/Unit/Package/PackageTest.php
+++ b/typo3/sysext/core/Tests/Unit/Package/PackageTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Package;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Package\Exception\InvalidPackageKeyException;
 use TYPO3\CMS\Core\Package\Exception\InvalidPackagePathException;
@@ -40,9 +42,7 @@ final class PackageTest extends UnitTestCase
         $this->testFilesToDelete[] = $this->testRoot;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsPackageDoesNotExistException(): void
     {
         $this->expectException(InvalidPackagePathException::class);
@@ -64,10 +64,8 @@ final class PackageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validPackageKeys
-     */
+    #[DataProvider('validPackageKeys')]
+    #[Test]
     public function constructAcceptsValidPackageKeys($packageKey): void
     {
         $packagePath = $this->testRoot . str_replace('\\', '/', $packageKey) . '/';
@@ -90,10 +88,8 @@ final class PackageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidPackageKeys
-     */
+    #[DataProvider('invalidPackageKeys')]
+    #[Test]
     public function constructRejectsInvalidPackageKeys($packageKey): void
     {
         $this->expectException(InvalidPackageKeyException::class);
@@ -106,9 +102,7 @@ final class PackageTest extends UnitTestCase
         new Package($packageManagerMock, $packageKey, $packagePath);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function aPackageCanBeFlaggedAsProtected(): void
     {
         $packagePath = $this->testRoot . 'Application/Vendor/Dummy/';
diff --git a/typo3/sysext/core/Tests/Unit/Page/AssetCollectorTest.php b/typo3/sysext/core/Tests/Unit/Page/AssetCollectorTest.php
index c413b217576d9b51e556208eada6dd1165162df0..3a6938469bb655fac68a48b2d861196fa2894e32 100644
--- a/typo3/sysext/core/Tests/Unit/Page/AssetCollectorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Page/AssetCollectorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\DataProviderExternal;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Page\AssetCollector;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -32,10 +34,8 @@ final class AssetCollectorTest extends UnitTestCase
         $this->assetCollector = GeneralUtility::makeInstance(AssetCollector::class);
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::filesDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'filesDataProvider')]
+    #[Test]
     public function styleSheets(array $files, array $expectedResult): void
     {
         foreach ($files as $file) {
@@ -63,10 +63,8 @@ final class AssetCollectorTest extends UnitTestCase
         self::assertSame([], $this->assetCollector->getMedia());
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::filesDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'filesDataProvider')]
+    #[Test]
     public function javaScript(array $files, array $expectedResult): void
     {
         foreach ($files as $file) {
@@ -94,10 +92,8 @@ final class AssetCollectorTest extends UnitTestCase
         self::assertSame([], $this->assetCollector->getMedia());
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::inlineDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'inlineDataProvider')]
+    #[Test]
     public function inlineJavaScript(array $sources, array $expectedResult): void
     {
         foreach ($sources as $source) {
@@ -125,10 +121,8 @@ final class AssetCollectorTest extends UnitTestCase
         self::assertSame([], $this->assetCollector->getMedia());
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::inlineDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'inlineDataProvider')]
+    #[Test]
     public function inlineStyles(array $sources, array $expectedResult): void
     {
         foreach ($sources as $source) {
@@ -156,10 +150,8 @@ final class AssetCollectorTest extends UnitTestCase
         self::assertSame([], $this->assetCollector->getMedia());
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::mediaDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'mediaDataProvider')]
+    #[Test]
     public function media(array $images, array $expectedResult): void
     {
         foreach ($images as $image) {
diff --git a/typo3/sysext/core/Tests/Unit/Page/AssetRendererTest.php b/typo3/sysext/core/Tests/Unit/Page/AssetRendererTest.php
index 0661badab37804a9136e54a8dc230efac4d9de25..b108d7153f390c66531fd48a52bd708c2709abd9 100644
--- a/typo3/sysext/core/Tests/Unit/Page/AssetRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Page/AssetRendererTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\DataProviderExternal;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Page\AssetCollector;
 use TYPO3\CMS\Core\Page\AssetRenderer;
@@ -40,10 +42,8 @@ final class AssetRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::filesDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'filesDataProvider')]
+    #[Test]
     public function styleSheets(array $files, array $expectedResult, array $expectedMarkup): void
     {
         $assetCollector = GeneralUtility::makeInstance(AssetCollector::class);
@@ -55,10 +55,8 @@ final class AssetRendererTest extends UnitTestCase
         self::assertSame($expectedMarkup['css_prio'], $this->assetRenderer->renderStyleSheets(true));
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::filesDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'filesDataProvider')]
+    #[Test]
     public function javaScript(array $files, array $expectedResult, array $expectedMarkup): void
     {
         $assetCollector = GeneralUtility::makeInstance(AssetCollector::class);
@@ -70,10 +68,8 @@ final class AssetRendererTest extends UnitTestCase
         self::assertSame($expectedMarkup['js_prio'], $this->assetRenderer->renderJavaScript(true));
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::inlineDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'inlineDataProvider')]
+    #[Test]
     public function inlineJavaScript(array $sources, array $expectedResult, array $expectedMarkup): void
     {
         $assetCollector = GeneralUtility::makeInstance(AssetCollector::class);
@@ -85,10 +81,8 @@ final class AssetRendererTest extends UnitTestCase
         self::assertSame($expectedMarkup['js_prio'], $this->assetRenderer->renderInlineJavaScript(true));
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::inlineDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'inlineDataProvider')]
+    #[Test]
     public function inlineStyleSheets(array $sources, array $expectedResult, array $expectedMarkup): void
     {
         $assetCollector = GeneralUtility::makeInstance(AssetCollector::class);
@@ -100,10 +94,8 @@ final class AssetRendererTest extends UnitTestCase
         self::assertSame($expectedMarkup['css_prio'], $this->assetRenderer->renderInlineStyleSheets(true));
     }
 
-    /**
-     * @test
-     * @dataProvider \TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::renderMethodsAndEventsDataProvider
-     */
+    #[DataProviderExternal(\TYPO3\CMS\Core\Tests\Unit\Page\AssetDataProvider::class, 'renderMethodsAndEventsDataProvider')]
+    #[Test]
     public function beforeRenderingEvent(
         string $renderMethodName,
         bool $isInline,
diff --git a/typo3/sysext/core/Tests/Unit/Page/ImportMapTest.php b/typo3/sysext/core/Tests/Unit/Page/ImportMapTest.php
index 211d58cce5afea52b83b226b665504d5da0f95a6..c80ca41f3507bb724f4e72b15a6b780fca21f0ff 100644
--- a/typo3/sysext/core/Tests/Unit/Page/ImportMapTest.php
+++ b/typo3/sysext/core/Tests/Unit/Page/ImportMapTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Package\MetaData;
 use TYPO3\CMS\Core\Package\PackageInterface;
@@ -62,9 +63,7 @@ final class ImportMapTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emptyOutputIfNoModuleIsLoaded(): void
     {
         $this->packages = ['core'];
@@ -75,9 +74,7 @@ final class ImportMapTest extends UnitTestCase
         self::assertSame('', $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emptyOutputIfNoModuleIsDefined(): void
     {
         $this->packages = ['package1'];
@@ -90,9 +87,7 @@ final class ImportMapTest extends UnitTestCase
         self::assertNull($url);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveImport(): void
     {
         $this->packages = ['core'];
@@ -103,9 +98,7 @@ final class ImportMapTest extends UnitTestCase
         self::assertStringStartsWith('Fixtures/ImportMap/core/Resources/Public/JavaScript/Contrib/lit/index.js?bust=', $url);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveAndImplicitlyIncludeModuleConfiguration(): void
     {
         $this->packages = ['core'];
@@ -120,9 +113,7 @@ final class ImportMapTest extends UnitTestCase
         ExtensionManagementUtility::setPackageManager($this->createMock(PackageManager::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderIncludedImportConfiguration(): void
     {
         $this->packages = ['core'];
@@ -135,9 +126,7 @@ final class ImportMapTest extends UnitTestCase
         self::assertStringContainsString('"@typo3/core/Module1.js":"/Fixtures/ImportMap/core/Resources/Public/JavaScript/Module1.js?bust=', $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function composesTwoImportMaps(): void
     {
         $this->packages = ['core', 'package2'];
@@ -151,9 +140,7 @@ final class ImportMapTest extends UnitTestCase
         ExtensionManagementUtility::setPackageManager($this->createMock(PackageManager::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function handlesImportMapOverwrites(): void
     {
         $this->packages = ['package2', 'package3'];
@@ -171,9 +158,7 @@ final class ImportMapTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dependenciesAreLoaded(): void
     {
         $this->packages = ['core', 'package2'];
@@ -184,9 +169,7 @@ final class ImportMapTest extends UnitTestCase
         self::assertStringContainsString('@typo3/core/', $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unusedConfigurationsAreOmitted(): void
     {
         $this->packages = ['core', 'package2', 'package4'];
@@ -202,9 +185,7 @@ final class ImportMapTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function includeAllImportsIsRespected(): void
     {
         $this->packages = ['core', 'package2', 'package4'];
diff --git a/typo3/sysext/core/Tests/Unit/Page/JavaScriptModuleInstructionTest.php b/typo3/sysext/core/Tests/Unit/Page/JavaScriptModuleInstructionTest.php
index 5d81399ee2ac2f7a7d1f489ed764957ff498ac2f..6a3dab05b8a05625b328dac12de677f52c370971 100644
--- a/typo3/sysext/core/Tests/Unit/Page/JavaScriptModuleInstructionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Page/JavaScriptModuleInstructionTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -33,10 +35,8 @@ final class JavaScriptModuleInstructionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider flagsAreAssignedDataProvider
-     */
+    #[DataProvider('flagsAreAssignedDataProvider')]
+    #[Test]
     public function flagsAreAssigned(int $expectation, int $flags, int ...$additionalFlags): void
     {
         $subject = new JavaScriptModuleInstruction('Test', $flags);
diff --git a/typo3/sysext/core/Tests/Unit/Page/PageRendererTest.php b/typo3/sysext/core/Tests/Unit/Page/PageRendererTest.php
index e41ad703b56a49c7f3f5dd63b665f1d856a27a87..adc012106f110c14fcd7af6d32c8c1c259422ed6 100644
--- a/typo3/sysext/core/Tests/Unit/Page/PageRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Page/PageRendererTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Page\ImportMap;
 use TYPO3\CMS\Core\Page\ImportMapFactory;
 use TYPO3\CMS\Core\Page\PageRenderer;
@@ -43,9 +45,7 @@ final class PageRendererTest extends UnitTestCase
         GeneralUtility::setSingletonInstance(ImportMapFactory::class, $importMapFactoryMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderMethodCallsResetInAnyCase(): void
     {
         $pageRenderer = $this->getMockBuilder(PageRenderer::class)
@@ -57,9 +57,7 @@ final class PageRendererTest extends UnitTestCase
         $pageRenderer->render();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addBodyContentAddsContent(): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, null, [], '', false);
@@ -73,9 +71,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertEquals($expectedReturnValue, $out);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInlineLanguageLabelFileSetsInlineLanguageLabelFiles(): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, null, [], '', false);
@@ -95,9 +91,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertSame($expectedInlineLanguageLabelFile, array_pop($actualResult));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInlineLanguageLabelFileSetsTwoDifferentInlineLanguageLabelFiles(): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, null, [], '', false);
@@ -126,9 +120,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertSame($expectedInlineLanguageLabelFile1, array_pop($actualResult));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInlineLanguageLabelFileDoesNotSetSameLanguageFileTwice(): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, null, [], '', false);
@@ -141,9 +133,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertCount(1, $subject->getInlineLanguageLabelFiles());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function includeLanguageFileForInlineDoesNotAddToInlineLanguageLabelsIfFileCouldNotBeRead(): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, ['readLLfile'], [], '', false);
@@ -200,10 +190,8 @@ final class PageRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider includeLanguageFileForInlineAddsProcessesLabelsToInlineLanguageLabelsProvider
-     * @test
-     */
+    #[DataProvider('includeLanguageFileForInlineAddsProcessesLabelsToInlineLanguageLabelsProvider')]
+    #[Test]
     public function includeLanguageFileForInlineAddsProcessesLabelsToInlineLanguageLabels(array $llFileContent, string $selectionPrefix, string $stripFromSelectionName, array $expectation): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, ['readLLfile'], [], '', false);
@@ -215,9 +203,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertEquals($expectation, $subject->_get('inlineLanguageLabels'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAddedMetaTag(): void
     {
         $subject = $this->getMockBuilder(PageRenderer::class)
@@ -234,9 +220,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideMetaTag(): void
     {
         $subject = $this->getMockBuilder(PageRenderer::class)
@@ -254,9 +238,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unsetAddedMetaTag(): void
     {
         $subject = $this->getMockBuilder(PageRenderer::class)
@@ -270,9 +252,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseLanguageLabelsForJavaScriptReturnsEmptyStringIfEmpty(): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, null, [], '', false);
@@ -282,9 +262,7 @@ final class PageRendererTest extends UnitTestCase
         self::assertEmpty($actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseLanguageLabelsForJavaScriptReturnsFlatArray(): void
     {
         $subject = $this->getAccessibleMock(PageRenderer::class, null, [], '', false);
diff --git a/typo3/sysext/core/Tests/Unit/Pagination/ArrayPaginatorTest.php b/typo3/sysext/core/Tests/Unit/Pagination/ArrayPaginatorTest.php
index 284a818ceb1b10958b5fcee9175a1975ea2df98e..afdf402b085b1bb3b96bd7c29be3beefc9b05589 100644
--- a/typo3/sysext/core/Tests/Unit/Pagination/ArrayPaginatorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Pagination/ArrayPaginatorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Pagination;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Pagination\ArrayPaginator;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -32,17 +33,14 @@ final class ArrayPaginatorTest extends UnitTestCase
 
     /**
      * A short integration test to check that the fixtures are as expected
-     *
-     * @test
      */
+    #[Test]
     public function integration(): void
     {
         self::assertCount(14, $this->fixture);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPaginatorWithDefaultConfiguration(): void
     {
         $paginator = new ArrayPaginator($this->fixture);
@@ -53,9 +51,7 @@ final class ArrayPaginatorTest extends UnitTestCase
         self::assertCount(10, $paginator->getPaginatedItems());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function paginatorRespectsItemsPerPageConfiguration(): void
     {
         $paginator = new ArrayPaginator(
@@ -70,9 +66,7 @@ final class ArrayPaginatorTest extends UnitTestCase
         self::assertCount(3, $paginator->getPaginatedItems());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function paginatorRespectsItemsPerPageConfigurationAndCurrentPage(): void
     {
         $paginator = new ArrayPaginator(
@@ -87,9 +81,7 @@ final class ArrayPaginatorTest extends UnitTestCase
         self::assertCount(3, $paginator->getPaginatedItems());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function paginatorProperlyCalculatesLastPage(): void
     {
         $paginator = new ArrayPaginator(
@@ -104,9 +96,7 @@ final class ArrayPaginatorTest extends UnitTestCase
         self::assertCount(2, $paginator->getPaginatedItems());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withCurrentPageNumberThrowsInvalidArgumentExceptionIfCurrentPageIsLowerThanOne(): void
     {
         $this->expectExceptionCode(1573047338);
@@ -119,9 +109,7 @@ final class ArrayPaginatorTest extends UnitTestCase
         $paginator->withCurrentPageNumber(0);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function paginatorSetsCurrentPageToLastPageIfCurrentPageExceedsMaximum(): void
     {
         $paginator = new ArrayPaginator(
@@ -135,9 +123,7 @@ final class ArrayPaginatorTest extends UnitTestCase
         self::assertCount(4, $paginator->getPaginatedItems());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function paginatorProperlyCalculatesOnlyOnePage(): void
     {
         $paginator = new ArrayPaginator(
diff --git a/typo3/sysext/core/Tests/Unit/Pagination/SimplePaginationTest.php b/typo3/sysext/core/Tests/Unit/Pagination/SimplePaginationTest.php
index 6fb605f87303efe6c79a4c72c656ae9a7967727b..cc353bc97acc6790534c065d48184a9dda044706 100644
--- a/typo3/sysext/core/Tests/Unit/Pagination/SimplePaginationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Pagination/SimplePaginationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Pagination;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Pagination\ArrayPaginator;
 use TYPO3\CMS\Core\Pagination\SimplePagination;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -36,9 +37,7 @@ final class SimplePaginationTest extends UnitTestCase
         $this->paginator = new ArrayPaginator(range(1, 14, 1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkSimplePaginationWithAPaginatorWithDefaultSettings(): void
     {
         $pagination = new SimplePagination($this->paginator);
@@ -52,9 +51,7 @@ final class SimplePaginationTest extends UnitTestCase
         self::assertSame([1, 2], $pagination->getAllPageNumbers());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkSimplePaginationWithAnIncreasedCurrentPageNumber(): void
     {
         $paginator = $this->paginator
@@ -72,9 +69,7 @@ final class SimplePaginationTest extends UnitTestCase
         self::assertSame([1, 2], $pagination->getAllPageNumbers());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkSimplePaginationWithAnIncreasedCurrentPageNumberAndItemsPerPage(): void
     {
         $paginator = $this->paginator
@@ -92,9 +87,7 @@ final class SimplePaginationTest extends UnitTestCase
         self::assertSame([1, 2, 3, 4, 5], $pagination->getAllPageNumbers());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPaginationWithAPaginatorThatOnlyHasOnePage(): void
     {
         $paginator = $this->paginator
@@ -111,9 +104,7 @@ final class SimplePaginationTest extends UnitTestCase
         self::assertSame([1], $pagination->getAllPageNumbers());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPaginatorWithOutOfBoundsCurrentPage(): void
     {
         $paginator = $this->paginator
diff --git a/typo3/sysext/core/Tests/Unit/Pagination/SlidingWindowPaginationTest.php b/typo3/sysext/core/Tests/Unit/Pagination/SlidingWindowPaginationTest.php
index db6d893dad2bc7477f55216714b22e9dcd366164..e9383ca793d882fb3af675c9b64e44f0ea2b34ba 100644
--- a/typo3/sysext/core/Tests/Unit/Pagination/SlidingWindowPaginationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Pagination/SlidingWindowPaginationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Pagination;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Pagination\ArrayPaginator;
 use TYPO3\CMS\Core\Pagination\SlidingWindowPagination;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -25,9 +26,7 @@ final class SlidingWindowPaginationTest extends UnitTestCase
 {
     protected $paginator = [];
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkSlidingWindowPaginationWithAPaginatorWithDefaultSettings(): void
     {
         $pagination = new SlidingWindowPagination($this->paginator, 5);
@@ -46,9 +45,7 @@ final class SlidingWindowPaginationTest extends UnitTestCase
         self::assertSame(5, $pagination->getMaximumNumberOfLinks());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkSlidingWindowPaginationWithAnIncreasedCurrentPageNumber(): void
     {
         $paginator = $this->paginator->withCurrentPageNumber(2);
@@ -68,9 +65,7 @@ final class SlidingWindowPaginationTest extends UnitTestCase
         self::assertSame(5, $pagination->getMaximumNumberOfLinks());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkSlidingWindowPaginationWithAnIncreasedCurrentPageNumberAndItemsPerPage(): void
     {
         $paginator = $this->paginator
@@ -92,9 +87,7 @@ final class SlidingWindowPaginationTest extends UnitTestCase
         self::assertSame(5, $pagination->getMaximumNumberOfLinks());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPaginationWithAPaginatorThatOnlyHasOnePage(): void
     {
         $paginator = $this->paginator->withItemsPerPage(50);
@@ -114,9 +107,7 @@ final class SlidingWindowPaginationTest extends UnitTestCase
         self::assertSame(5, $pagination->getMaximumNumberOfLinks());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPaginatorWithOutOfBoundsCurrentPage(): void
     {
         $paginator = $this->paginator
diff --git a/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/CorePasswordValidatorTest.php b/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/CorePasswordValidatorTest.php
index 0bd38bc171149791dc07e19f703c14d056f2ff4e..cbdd54c927ec901b36fbafe5909690806260c85c 100644
--- a/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/CorePasswordValidatorTest.php
+++ b/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/CorePasswordValidatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\PasswordPolicy\Validator;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\PasswordPolicy\Validator\CorePasswordValidator;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -91,10 +93,8 @@ final class CorePasswordValidatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validatorReturnsExpectedResultsDataProvider
-     */
+    #[DataProvider('validatorReturnsExpectedResultsDataProvider')]
+    #[Test]
     public function validatorReturnsExpectedResults($options, $password, $expected)
     {
         $validator = new CorePasswordValidator($options);
diff --git a/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/Dto/ContextDataTest.php b/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/Dto/ContextDataTest.php
index 44173273a264b80a54cc042f160121dc60dca661..5633fe5bb8ae3380b591ac466989733c8c74162c 100644
--- a/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/Dto/ContextDataTest.php
+++ b/typo3/sysext/core/Tests/Unit/PasswordPolicy/Validator/Dto/ContextDataTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\PasswordPolicy\Validator\Dto;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\PasswordPolicy\Validator\Dto\ContextData;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ContextDataTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function contextDataContainsExpectedDefaults(): void
     {
         $subject = new ContextData();
@@ -37,9 +36,7 @@ final class ContextDataTest extends UnitTestCase
         self::assertEquals('', $subject->getNewUserFullName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function contextDataPropertiesSetInConstructor(): void
     {
         $subject = new ContextData(
@@ -59,9 +56,7 @@ final class ContextDataTest extends UnitTestCase
         self::assertEquals('fullname', $subject->getNewUserFullName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDataReturnsExpectedDataForContextDataSetInConstructor(): void
     {
         $subject = new ContextData(newUserFullName: 'Firstname Lastname');
@@ -69,9 +64,7 @@ final class ContextDataTest extends UnitTestCase
         self::assertEquals('Firstname Lastname', $subject->getData('newUserFullName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDataSetsData(): void
     {
         $subject = new ContextData();
diff --git a/typo3/sysext/core/Tests/Unit/Preparations/TcaPreparationTest.php b/typo3/sysext/core/Tests/Unit/Preparations/TcaPreparationTest.php
index b53733bfeec449b4bcfb27d34bc677740475bdd2..c1f2d4f1bb5ca5e56813d14ba5103e29f96b3afd 100644
--- a/typo3/sysext/core/Tests/Unit/Preparations/TcaPreparationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Preparations/TcaPreparationTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Preparations;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Preparations\TcaPreparation;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TcaPreparationTest extends UnitTestCase
 {
-    /**
-     * @test
-     * @dataProvider configureCategoryRelationsDataProvider
-     */
+    #[DataProvider('configureCategoryRelationsDataProvider')]
+    #[Test]
     public function configureCategoryRelations(array $input, array $expected): void
     {
         self::assertEquals($expected, (new TcaPreparation())->prepare($input));
@@ -240,10 +240,8 @@ final class TcaPreparationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider configureCategoryRelationsThrowsExceptionOnInvalidMaxitemsDataProvider
-     */
+    #[DataProvider('configureCategoryRelationsThrowsExceptionOnInvalidMaxitemsDataProvider')]
+    #[Test]
     public function configureCategoryRelationsThrowsExceptionOnInvalidMaxitems(array $input, int $exceptionCode): void
     {
         $this->expectExceptionCode($exceptionCode);
@@ -318,9 +316,7 @@ final class TcaPreparationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configureCategoryRelationsThrowsExceptionOnInvalidRelationship(): void
     {
         $this->expectExceptionCode(1627898896);
@@ -339,9 +335,7 @@ final class TcaPreparationTest extends UnitTestCase
         ]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareFileExtensionsReplacesPlaceholders(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] = 'jpg,png';
@@ -352,9 +346,7 @@ final class TcaPreparationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareFileExtensionsRemovesDuplicates(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] = 'jpg,png';
diff --git a/typo3/sysext/core/Tests/Unit/RegistryTest.php b/typo3/sysext/core/Tests/Unit/RegistryTest.php
index b29214edd91bda44cac58692bd5feaf14862919d..baa4d48fc7a151b0cd7c71023fe40f9d3c5e9063 100644
--- a/typo3/sysext/core/Tests/Unit/RegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/RegistryTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Registry;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RegistryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionForInvalidNamespacesUsingNoNamespace(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -32,9 +31,7 @@ final class RegistryTest extends UnitTestCase
         (new Registry())->get('', 'someKey');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getThrowsExceptionForInvalidNamespacesUsingTooShortNamespace(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -42,9 +39,7 @@ final class RegistryTest extends UnitTestCase
         (new Registry())->get('t', 'someKey');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setThrowsAnExceptionOnEmptyNamespace(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -52,9 +47,7 @@ final class RegistryTest extends UnitTestCase
         (new Registry())->set('', 'someKey', 'someValue');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setThrowsAnExceptionOnWrongNamespace(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -62,9 +55,7 @@ final class RegistryTest extends UnitTestCase
         (new Registry())->set('t', 'someKey', 'someValue');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeThrowsAnExceptionOnWrongNamespace(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -72,9 +63,7 @@ final class RegistryTest extends UnitTestCase
         (new Registry())->remove('t', 'someKey');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeAllByNamespaceThrowsAnExceptionOnWrongNamespace(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/AbstractFileTest.php b/typo3/sysext/core/Tests/Unit/Resource/AbstractFileTest.php
index c2e499cf1423bcadb554d95e661efa33915f4d3f..5d4fb359f2a123c581267e2e0d8ace1bb6cd882d 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/AbstractFileTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/AbstractFileTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\FolderInterface;
 use TYPO3\CMS\Core\Resource\ResourceStorage;
@@ -28,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class AbstractFileTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getParentFolderGetsParentFolderFromStorage(): void
     {
         $parentIdentifier = '/parent/';
@@ -59,9 +58,8 @@ final class AbstractFileTest extends UnitTestCase
      * type in a field "mimetype", while the file object and the database table use mime_type.
      * The test is placed in the test case for AbstractFile because the broken functionality resides there, though
      * it is only triggered when constructing a File instance with an index record.
-     *
-     * @test
      */
+    #[Test]
     public function storageIsNotAskedForMimeTypeForPersistedRecord(): void
     {
         $mockedStorage = $this->getMockBuilder(ResourceStorage::class)->disableOriginalConstructor()->getMock();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Collection/FileCollectionRegistryTest.php b/typo3/sysext/core/Tests/Unit/Resource/Collection/FileCollectionRegistryTest.php
index 46deb0860e9830bfbd272a96bcebe9ec28475fec..3efeb7f0ddbee74515c652c4cee3b7bf64154d9d 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Collection/FileCollectionRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Collection/FileCollectionRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Collection;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\Collection\FileCollectionRegistry;
 use TYPO3\CMS\Core\Tests\Unit\Resource\Collection\Fixtures\OtherTestingFileCollection;
 use TYPO3\CMS\Core\Tests\Unit\Resource\Collection\Fixtures\TestingFileCollection;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FileCollectionRegistryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredFileCollectionClassesCanBeRetrieved(): void
     {
         $className = TestingFileCollection::class;
@@ -37,9 +36,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         self::assertEquals($className, $returnedClassName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerFileCollectionClassThrowsExceptionIfClassDoesNotExist(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -48,9 +45,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         $subject->registerFileCollectionClass(StringUtility::getUniqueId('class_'), substr(StringUtility::getUniqueId('type_'), 0, 30));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerFileCollectionClassThrowsExceptionIfTypeIsTooLong(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -61,9 +56,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         $subject->registerFileCollectionClass($className, $type);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerFileCollectionClassThrowsExceptionIfTypeIsAlreadyRegistered(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -75,9 +68,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         $subject->registerFileCollectionClass($className2, 'foobar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerFileCollectionClassOverridesExistingRegisteredFileCollectionClass(): void
     {
         $className = TestingFileCollection::class;
@@ -87,9 +78,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         $subject->registerFileCollectionClass($className2, 'foobar', true);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFileCollectionClassThrowsExceptionIfClassIsNotRegistered(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -98,9 +87,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         $subject->getFileCollectionClass(StringUtility::getUniqueId());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFileCollectionClassAcceptsClassNameIfClassIsRegistered(): void
     {
         $className = TestingFileCollection::class;
@@ -109,9 +96,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         self::assertEquals($className, $subject->getFileCollectionClass('foobar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fileCollectionRegistryIsInitializedWithPreconfiguredFileCollections(): void
     {
         $className = TestingFileCollection::class;
@@ -123,9 +108,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         self::assertEquals($className, $subject->getFileCollectionClass($type));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fileCollectionExistsReturnsTrueForAllExistingFileCollections(): void
     {
         $className = TestingFileCollection::class;
@@ -138,9 +121,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         self::assertFalse($subject->fileCollectionTypeExists('bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fileCollectionExistsReturnsFalseIfFileCollectionDoesNotExist(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['fal']['registeredFileCollections'] = [];
@@ -148,9 +129,7 @@ final class FileCollectionRegistryTest extends UnitTestCase
         self::assertFalse($subject->fileCollectionTypeExists(StringUtility::getUniqueId('name_')));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addNewTypeToTCA(): void
     {
         // Create a TCA fixture for sys_file_collection
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractDriverTest.php b/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractDriverTest.php
index f4125bb462188666f5f838bce6795d475f07a77d..a7cd77159c8cd1062f496b90408a886192ff98fe 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractDriverTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractDriverTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Driver;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Resource\Driver\Fixtures\TestingDriver;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractDriverTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function isCaseSensitiveFileSystemReturnsTrueIfNothingIsConfigured(): void
     {
         $subject = new TestingDriver();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractHierarchicalFilesystemDriverTest.php b/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractHierarchicalFilesystemDriverTest.php
index 9efb766bedbcaa30dfc7295ade7261e0d381d6ae..54e252f53a131731ff63951f7d96f1dcc165626b 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractHierarchicalFilesystemDriverTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Driver/AbstractHierarchicalFilesystemDriverTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Driver;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Resource\Driver\Fixtures\TestingHierarchicalFilesystemDriver;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -60,10 +62,8 @@ final class AbstractHierarchicalFilesystemDriverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canonicalizeAndCheckFileIdentifierCanonicalizesPathDataProvider
-     */
+    #[DataProvider('canonicalizeAndCheckFileIdentifierCanonicalizesPathDataProvider')]
+    #[Test]
     public function canonicalizeAndCheckFileIdentifierCanonicalizesPath(string $expectedPath, string $fileIdentifier): void
     {
         $subject = new TestingHierarchicalFilesystemDriver();
@@ -104,10 +104,8 @@ final class AbstractHierarchicalFilesystemDriverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canonicalizeAndCheckFolderIdentifierCanonicalizesFolderIdentifierDataProvider
-     */
+    #[DataProvider('canonicalizeAndCheckFolderIdentifierCanonicalizesFolderIdentifierDataProvider')]
+    #[Test]
     public function canonicalizeAndCheckFolderIdentifierCanonicalizesFolderIdentifier(string $expectedPath, string $identifier): void
     {
         $subject = new TestingHierarchicalFilesystemDriver();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Driver/DriverRegistryTest.php b/typo3/sysext/core/Tests/Unit/Resource/Driver/DriverRegistryTest.php
index 582b4c43fd650383f7d65444d704669c7b8af739..bb56b798ee9e8d48ffd546fd5976058f44f31d5a 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Driver/DriverRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Driver/DriverRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Driver;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\Driver\DriverInterface;
 use TYPO3\CMS\Core\Resource\Driver\DriverRegistry;
 use TYPO3\CMS\Core\Tests\Unit\Resource\Driver\Fixtures\TestingDriver;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DriverRegistryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredDriverClassesCanBeRetrieved(): void
     {
         $className = get_class($this->createMock(DriverInterface::class));
@@ -37,9 +36,7 @@ final class DriverRegistryTest extends UnitTestCase
         self::assertEquals($className, $returnedClassName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerDriverClassThrowsExceptionIfClassDoesNotExist(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -48,9 +45,7 @@ final class DriverRegistryTest extends UnitTestCase
         $subject->registerDriverClass(StringUtility::getUniqueId('class_'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerDriverClassThrowsExceptionIfShortnameIsAlreadyTakenByAnotherDriverClass(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -62,9 +57,7 @@ final class DriverRegistryTest extends UnitTestCase
         $subject->registerDriverClass($className2, 'foobar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDriverClassThrowsExceptionIfClassIsNotRegistered(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -73,9 +66,7 @@ final class DriverRegistryTest extends UnitTestCase
         $subject->getDriverClass(StringUtility::getUniqueId('class_'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDriverClassAcceptsClassNameIfClassIsRegistered(): void
     {
         $className = get_class($this->createMock(DriverInterface::class));
@@ -84,9 +75,7 @@ final class DriverRegistryTest extends UnitTestCase
         self::assertEquals($className, $subject->getDriverClass($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function driverRegistryIsInitializedWithPreconfiguredDrivers(): void
     {
         $className = get_class($this->createMock(DriverInterface::class));
@@ -100,9 +89,7 @@ final class DriverRegistryTest extends UnitTestCase
         self::assertEquals($className, $subject->getDriverClass($shortName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function driverExistsReturnsTrueForAllExistingDrivers(): void
     {
         $className = get_class($this->createMock(DriverInterface::class));
@@ -117,9 +104,7 @@ final class DriverRegistryTest extends UnitTestCase
         self::assertFalse($subject->driverExists(StringUtility::getUniqueId('class')));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function driverExistsReturnsFalseIfDriverDoesNotExist(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['fal']['registeredDrivers'] = [];
diff --git a/typo3/sysext/core/Tests/Unit/Resource/FileReferenceTest.php b/typo3/sysext/core/Tests/Unit/Resource/FileReferenceTest.php
index 4045c1f356ec8f431a7aa5d7ccf6248941d8051b..994437b07126504e67702a6454f225fd1ca2397b 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/FileReferenceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/FileReferenceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\FileReference;
@@ -65,10 +67,8 @@ final class FileReferenceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider propertiesDataProvider
-     */
+    #[DataProvider('propertiesDataProvider')]
+    #[Test]
     public function getPropertiesReturnsMergedPropertiesAndRespectsNullValues(array $fileReferenceProperties, array $originalFileProperties, array $expectedMergedProperties): void
     {
         $fixture = $this->prepareFixture($fileReferenceProperties, $originalFileProperties);
@@ -76,10 +76,8 @@ final class FileReferenceTest extends UnitTestCase
         self::assertSame($expectedMergedProperties, $actual);
     }
 
-    /**
-     * @test
-     * @dataProvider propertiesDataProvider
-     */
+    #[DataProvider('propertiesDataProvider')]
+    #[Test]
     public function hasPropertyReturnsTrueForAllMergedPropertyKeys(array $fileReferenceProperties, array $originalFileProperties, array $expectedMergedProperties): void
     {
         $fixture = $this->prepareFixture($fileReferenceProperties, $originalFileProperties);
@@ -88,10 +86,8 @@ final class FileReferenceTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     * @dataProvider propertiesDataProvider
-     */
+    #[DataProvider('propertiesDataProvider')]
+    #[Test]
     public function getPropertyReturnsAllMergedPropertyKeys(array $fileReferenceProperties, array $originalFileProperties, array $expectedMergedProperties): void
     {
         $fixture = $this->prepareFixture($fileReferenceProperties, $originalFileProperties);
@@ -100,10 +96,8 @@ final class FileReferenceTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     * @dataProvider propertiesDataProvider
-     */
+    #[DataProvider('propertiesDataProvider')]
+    #[Test]
     public function getPropertyThrowsExceptionForNotAvailableProperty(array $fileReferenceProperties, array $originalFileProperties): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -113,10 +107,8 @@ final class FileReferenceTest extends UnitTestCase
         $fixture->getProperty(StringUtility::getUniqueId('nothingHere'));
     }
 
-    /**
-     * @test
-     * @dataProvider propertiesDataProvider
-     */
+    #[DataProvider('propertiesDataProvider')]
+    #[Test]
     public function getPropertyDoesNotThrowExceptionForPropertyOnlyAvailableInOriginalFile(
         array $fileReferenceProperties,
         array $originalFileProperties
@@ -125,10 +117,8 @@ final class FileReferenceTest extends UnitTestCase
         self::assertSame($originalFileProperties['file_only_property'], $fixture->getProperty('file_only_property'));
     }
 
-    /**
-     * @test
-     * @dataProvider propertiesDataProvider
-     */
+    #[DataProvider('propertiesDataProvider')]
+    #[Test]
     public function getReferencePropertyThrowsExceptionForPropertyOnlyAvailableInOriginalFile(
         array $fileReferenceProperties,
         array $originalFileProperties
@@ -140,27 +130,21 @@ final class FileReferenceTest extends UnitTestCase
         $fixture->getReferenceProperty('file_only_property');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTitleReturnsEmptyStringWhenPropertyValueIsNull(): void
     {
         $fixture = $this->prepareFixture(['title' => null], []);
         self::assertSame('', $fixture->getTitle());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAlternativeReturnsEmptyStringWhenPropertyValueIsNull(): void
     {
         $fixture = $this->prepareFixture(['alternative' => null], []);
         self::assertSame('', $fixture->getAlternative());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDescriptionReturnsEmptyStringWhenPropertyValueIsNull(): void
     {
         $fixture = $this->prepareFixture(['description' => null], []);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/FileTest.php b/typo3/sysext/core/Tests/Unit/Resource/FileTest.php
index 400c58a74eb095ab04f6e822ae6ddc17396142c9..63ac0e335594c44773509e8e41552b3046b53723 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/FileTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/FileTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Folder;
 use TYPO3\CMS\Core\Resource\Index\MetaDataRepository;
@@ -56,9 +58,7 @@ final class FileTest extends UnitTestCase
         return $fixture;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function commonPropertiesAreAvailableWithOwnGetters(): void
     {
         $properties = [
@@ -74,18 +74,15 @@ final class FileTest extends UnitTestCase
 
     /**
      * Tests if a file is seen as indexed if the record has a uid
-     *
-     * @test
      */
+    #[Test]
     public function fileIndexStatusIsTrueIfUidIsSet(): void
     {
         $fixture = new File(['uid' => 1], $this->storageMock);
         self::assertTrue($fixture->isIndexed());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updatePropertiesUpdatesFileProperties(): void
     {
         $identifier = '/' . StringUtility::getUniqueId('identifier_');
@@ -94,9 +91,7 @@ final class FileTest extends UnitTestCase
         self::assertEquals($identifier, $fixture->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updatePropertiesLeavesPropertiesUntouchedIfNotSetInNewProperties(): void
     {
         $fixture = new File(['uid' => 1, 'foo' => 'asdf', 'identifier' => '/test'], $this->storageMock);
@@ -105,9 +100,7 @@ final class FileTest extends UnitTestCase
         self::assertEquals('/test', $fixture->getProperty('identifier'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updatePropertiesDiscardsUidIfAlreadySet(): void
     {
         $fixture = new File(['uid' => 1, 'identifier' => '/test'], $this->storageMock);
@@ -115,9 +108,7 @@ final class FileTest extends UnitTestCase
         self::assertEquals(1, $fixture->getUid());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updatePropertiesRecordsNamesOfChangedProperties(): void
     {
         $fixture = new File(['uid' => 1, 'foo' => 'asdf', 'baz' => 'fdsw', 'identifier' => '/test'], $this->storageMock);
@@ -125,9 +116,7 @@ final class FileTest extends UnitTestCase
         self::assertEquals(['foo', 'baz'], $fixture->getUpdatedProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updatePropertiesDoesNotRecordPropertyNameIfSameValueIsProvided(): void
     {
         $fixture = new File(['uid' => 1, 'foo' => 'asdf', 'identifier' => '/test'], $this->storageMock);
@@ -135,9 +124,7 @@ final class FileTest extends UnitTestCase
         self::assertEmpty($fixture->getUpdatedProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updatePropertiesMarksPropertyAsChangedOnlyOnce(): void
     {
         $fixture = new File(['uid' => 1, 'foo' => 'asdf', 'baz' => 'fdsw', 'identifier' => '/test'], $this->storageMock);
@@ -146,9 +133,7 @@ final class FileTest extends UnitTestCase
         self::assertEquals(['foo', 'baz'], $fixture->getUpdatedProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updatePropertiesReloadsStorageObjectIfStorageChanges(): void
     {
         $fileProperties = [
@@ -171,9 +156,7 @@ final class FileTest extends UnitTestCase
         self::assertSame($mockedNewStorage, $subject->getStorage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function copyToCallsCopyOperationOnTargetFolderStorage(): void
     {
         $targetStorage = $this->createMock(ResourceStorage::class);
@@ -184,9 +167,7 @@ final class FileTest extends UnitTestCase
         $fixture->copyTo($targetFolder);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function moveToCallsMoveOperationOnTargetFolderStorage(): void
     {
         $targetStorage = $this->createMock(ResourceStorage::class);
@@ -208,10 +189,8 @@ final class FileTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider filenameExtensionDataProvider
-     */
+    #[DataProvider('filenameExtensionDataProvider')]
+    #[Test]
     public function getNameWithoutExtensionReturnsCorrectName($originalFilename, $expectedBasename): void
     {
         $fixture = new File(
@@ -224,10 +203,8 @@ final class FileTest extends UnitTestCase
         self::assertSame($expectedBasename, $fixture->getNameWithoutExtension());
     }
 
-    /**
-     * @test
-     * @dataProvider filenameExtensionDataProvider
-     */
+    #[DataProvider('filenameExtensionDataProvider')]
+    #[Test]
     public function getExtensionReturnsCorrectExtension($originalFilename, $expectedBasename, $expectedExtension): void
     {
         $fixture = new File([
@@ -237,18 +214,14 @@ final class FileTest extends UnitTestCase
         self::assertSame($expectedExtension, $fixture->getExtension());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasPropertyReturnsTrueFilePropertyExists(): void
     {
         $fixture = new File(['testproperty' => 'testvalue'], $this->storageMock);
         self::assertTrue($fixture->hasProperty('testproperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasPropertyReturnsTrueIfMetadataPropertyExists(): void
     {
         $fixture = $this->getMockBuilder(File::class)
@@ -268,9 +241,7 @@ final class FileTest extends UnitTestCase
         self::assertSame('testvalue', $fixture->getProperty('testproperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertiesContainsUidOfSysFileMetadata(): void
     {
         $fileData = [
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Filter/FileNameFilterTest.php b/typo3/sysext/core/Tests/Unit/Resource/Filter/FileNameFilterTest.php
index aef49fcbacb546e23353e5b6ea954d4d2edbb7a2..c6ed59c99134abd15c6becb55d4c334754acdf69 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Filter/FileNameFilterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Filter/FileNameFilterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Filter;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\Driver\DriverInterface;
 use TYPO3\CMS\Core\Resource\Filter\FileNameFilter;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -53,10 +55,10 @@ final class FileNameFilterTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getItemsAndPathsWithoutHiddenFilesAndFolders_dataProvider
      * @param bool|int $expected
      */
+    #[DataProvider('getItemsAndPathsWithoutHiddenFilesAndFolders_dataProvider')]
+    #[Test]
     public function filterHiddenFilesAndFoldersFiltersHiddenFilesAndFolders(string $itemName, string $itemIdentifier, $expected): void
     {
         FileNameFilter::setShowHiddenFilesAndFolders(false);
@@ -74,10 +76,10 @@ final class FileNameFilterTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getItemsAndPathsWithHiddenFilesAndFolders_dataProvider
      * @param bool|int $expected
      */
+    #[DataProvider('getItemsAndPathsWithHiddenFilesAndFolders_dataProvider')]
+    #[Test]
     public function filterHiddenFilesAndFoldersAllowsHiddenFilesAndFolders(string $itemName, string $itemIdentifier, $expected): void
     {
         $driverMock = $this->createMock(DriverInterface::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/FolderTest.php b/typo3/sysext/core/Tests/Unit/Resource/FolderTest.php
index 36676b8c5262154ac45278ad788aa1e4872ae798..bc0f843824a172d9c144a361c640829d1ce34c11 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/FolderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/FolderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\Folder;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
 use TYPO3\CMS\Core\Resource\ResourceStorage;
@@ -36,9 +37,7 @@ final class FolderTest extends UnitTestCase
         return new Folder($mockedStorage, $path, $name);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorArgumentsAreAvailableAtRuntime(): void
     {
         $path = StringUtility::getUniqueId('path_');
@@ -50,9 +49,7 @@ final class FolderTest extends UnitTestCase
         self::assertSame($name, $fixture->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function propertiesCanBeUpdated(): void
     {
         $fixture = $this->createFolderFixture('/somePath', 'someName');
@@ -61,9 +58,7 @@ final class FolderTest extends UnitTestCase
         self::assertSame('/someOtherPath', $fixture->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function propertiesAreNotUpdatedIfNotSetInInput(): void
     {
         $fixture = $this->createFolderFixture('/somePath/someName/', 'someName');
@@ -71,9 +66,7 @@ final class FolderTest extends UnitTestCase
         self::assertSame('someName', $fixture->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesReturnsArrayWithFilenamesAsKeys(): void
     {
         $mockedStorage = $this->createMock(ResourceStorage::class);
@@ -94,9 +87,7 @@ final class FolderTest extends UnitTestCase
         self::assertSame(['somefile.png', 'somefile.jpg'], array_keys($fileList));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesHandsOverRecursiveFALSEifNotExplicitlySet(): void
     {
         $mockedStorage = $this->createMock(ResourceStorage::class);
@@ -110,9 +101,7 @@ final class FolderTest extends UnitTestCase
         $fixture->getFiles();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesHandsOverRecursiveTRUEifSet(): void
     {
         $mockedStorage = $this->createMock(ResourceStorage::class);
@@ -126,9 +115,7 @@ final class FolderTest extends UnitTestCase
         $fixture->getFiles(0, 0, Folder::FILTER_MODE_USE_OWN_AND_STORAGE_FILTERS, true);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSubfolderCallsFactoryWithCorrectArguments(): void
     {
         $mockedStorage = $this->createMock(ResourceStorage::class);
@@ -153,9 +140,7 @@ final class FolderTest extends UnitTestCase
         self::assertEquals($subfolderFixture, $folderFixture->getSubfolder('someSubfolder'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParentFolderGetsParentFolderFromStorage(): void
     {
         $parentIdentifier = '/parent/';
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Index/ExtractorRegistryTest.php b/typo3/sysext/core/Tests/Unit/Resource/Index/ExtractorRegistryTest.php
index 3d1ade1edd0835e39c7b94b9144b5924b20ebf2e..ab26b5d8d2148a7e8e9ee674a17051c0867ddcaf 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Index/ExtractorRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Index/ExtractorRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Index;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\Index\ExtractorInterface;
 use TYPO3\CMS\Core\Resource\Index\ExtractorRegistry;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ExtractorRegistryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredExtractorClassCanBeRetrieved(): void
     {
         $extractorClass = 'a9f4d5e4ebb4b03547a2a6094e1170ac';
@@ -43,9 +42,7 @@ final class ExtractorRegistryTest extends UnitTestCase
         self::assertContains($extractorObject, $extractorRegistry->getExtractors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerExtractorClassThrowsExceptionIfClassDoesNotExist(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -56,9 +53,7 @@ final class ExtractorRegistryTest extends UnitTestCase
         $extractorRegistry->registerExtractionService($className);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerExtractorClassThrowsExceptionIfClassDoesNotImplementRightInterface(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -69,9 +64,7 @@ final class ExtractorRegistryTest extends UnitTestCase
         $extractorRegistry->registerExtractionService($className);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerExtractorClassWithHighestPriorityIsFirstInResult(): void
     {
         $extractorClass1 = 'db76010e5c24658c35ea1605cce2391d';
@@ -110,9 +103,7 @@ final class ExtractorRegistryTest extends UnitTestCase
         self::assertInstanceOf($extractorClass1, $extractorInstances[2]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredExtractorClassWithSamePriorityAreAllReturned(): void
     {
         $extractorClass1 = 'b70551b2b2db62b6b15a9bbfcbd50614';
@@ -141,9 +132,7 @@ final class ExtractorRegistryTest extends UnitTestCase
         self::assertContains($extractorObject2, $extractorInstances);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredExtractorsCanBeFilteredByDriverTypeButNoTyeREstrictionIsTreatedAsCompatible(): void
     {
         $extractorClass1 = 'b70551b2b2db62b6b15a9bbfcbd50614';
@@ -174,9 +163,7 @@ final class ExtractorRegistryTest extends UnitTestCase
         self::assertContains($extractorObject2, $extractorInstances);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredExtractorsCanBeFilteredByDriverType(): void
     {
         $extractorClass1 = 'b70551b2b2db62b6b15a9bbfcbd50614';
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Index/IndexerTest.php b/typo3/sysext/core/Tests/Unit/Resource/Index/IndexerTest.php
index 3400eb8d8f70b785d8b74ac66d09070f0a00e7e7..af5a19c3895f9654e3e7a348d5976defe7438578 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Index/IndexerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Index/IndexerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Index;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Index\FileIndexRepository;
 use TYPO3\CMS\Core\Resource\Index\Indexer;
@@ -29,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class IndexerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function extractMetaDataCallsSubsequentMethodsWithCorrectArguments(): void
     {
         $mockStorage = $this->createMock(ResourceStorage::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/MetaDataAspectTest.php b/typo3/sysext/core/Tests/Unit/Resource/MetaDataAspectTest.php
index 573628cf3cb52f2997dcc7e096edf6b9b0a357a3..26083383f0778630054f436b5ee29a0fcd1a0541 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/MetaDataAspectTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/MetaDataAspectTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Database\Connection;
@@ -50,9 +52,7 @@ final class MetaDataAspectTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function knownMetaDataIsAdded(): void
     {
         $metaData = [
@@ -64,9 +64,7 @@ final class MetaDataAspectTest extends UnitTestCase
         self::assertSame($metaData, $file->getMetaData()->get());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function manuallyAddedMetaDataIsMerged(): void
     {
         $metaData = [
@@ -89,9 +87,7 @@ final class MetaDataAspectTest extends UnitTestCase
         self::assertSame($expected, $file->getMetaData()->get());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function metaDataGetsRemoved(): void
     {
         $metaData = ['foo' => 'bar'];
@@ -109,9 +105,7 @@ final class MetaDataAspectTest extends UnitTestCase
         self::assertEmpty($metaDataAspectMock->get());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function positiveUidOfFileIsExpectedToLoadMetaData(): void
     {
         $this->expectException(InvalidUidException::class);
@@ -121,9 +115,7 @@ final class MetaDataAspectTest extends UnitTestCase
         $file->getMetaData()->get();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function newMetaDataIsCreated(): void
     {
         $GLOBALS['EXEC_TIME'] = 1534530781;
@@ -166,9 +158,7 @@ final class MetaDataAspectTest extends UnitTestCase
         self::assertSame($expected, $file->getMetaData()->get());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existingMetaDataGetsUpdated(): void
     {
         $metaData = ['uid' => 12, 'foo' => 'bar'];
@@ -244,10 +234,8 @@ final class MetaDataAspectTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider propertyDataProvider
-     */
+    #[DataProvider('propertyDataProvider')]
+    #[Test]
     public function propertyIsFetchedProperly(array $metaData, array $has, array $get): void
     {
         $file = new File([], $this->storageMock, $metaData);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Event/AfterVideoPreviewFetchedEventTest.php b/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Event/AfterVideoPreviewFetchedEventTest.php
index 750cf83f8b4bb9c71734cbfb6a5a9b34f179ef06..4749bfe9fd951e895c9577b689dede756a205d2e 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Event/AfterVideoPreviewFetchedEventTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Event/AfterVideoPreviewFetchedEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\OnlineMedia\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\OnlineMedia\Event\AfterVideoPreviewFetchedEvent;
 use TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\YouTubeHelper;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AfterVideoPreviewFetchedEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $onlineMediaId = '2004';
diff --git a/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Helpers/VimeoHelperTest.php b/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Helpers/VimeoHelperTest.php
index 649b479cd430e4f87b3e4152d28e33222286cb18..97f218db4e2fa3d6787fb89f4589d6db3fc3f991 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Helpers/VimeoHelperTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/OnlineMedia/Helpers/VimeoHelperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\OnlineMedia\Helpers;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Folder;
 use TYPO3\CMS\Core\Resource\OnlineMedia\Helpers\VimeoHelper;
@@ -39,10 +41,8 @@ final class VimeoHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider transformUrlDataProvider
-     */
+    #[DataProvider('transformUrlDataProvider')]
+    #[Test]
     public function transformUrlToFileReturnsExpectedResult(?string $url, ?string $videoId, bool $expectsMock): void
     {
         $mockedFolder = $this->createMock(Folder::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/ProcessedFileTest.php b/typo3/sysext/core/Tests/Unit/Resource/ProcessedFileTest.php
index c012b21b724aa136382cb6a7ad5a10d7f06500c0..7685e1f42caec7b839cb53d7f8270a25652a9f46 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/ProcessedFileTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/ProcessedFileTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\Exception;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\File;
@@ -84,18 +85,14 @@ final class ProcessedFileTest extends UnitTestCase
         return new ProcessedFile($originalFile, 'dummy', [], $dbRow ?: $this->databaseRow);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function propertiesOfProcessedFileAreSetFromDatabaseRow(): void
     {
         $processedFileObject = $this->getProcessedFileFixture();
         self::assertSame($this->databaseRow, $processedFileObject->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deletingProcessedFileRemovesFile(): void
     {
         $this->storageMock->expects(self::once())->method('deleteFile');
@@ -105,9 +102,7 @@ final class ProcessedFileTest extends UnitTestCase
         $processedFile->delete(true);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deletingProcessedFileThatUsesOriginalFileDoesNotRemoveFile(): void
     {
         $this->storageMock->expects(self::never())->method('deleteFile');
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Processing/LocalPreviewHelperTest.php b/typo3/sysext/core/Tests/Unit/Resource/Processing/LocalPreviewHelperTest.php
index bb2a230c1d219bab8db883dfb4144c070d437e27..6370c775abaaca1ef02eee5d3fc2f38442c7263a 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Processing/LocalPreviewHelperTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Processing/LocalPreviewHelperTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Processing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Processing\LocalPreviewHelper;
 use TYPO3\CMS\Core\Resource\Processing\TaskInterface;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class LocalPreviewHelperTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function processProvidesDefaultSizeIfNotConfigured(): void
     {
         $file = $this->createMock(File::class);
@@ -55,9 +54,7 @@ final class LocalPreviewHelperTest extends UnitTestCase
         $localPreviewHelper->process($task);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processDoesNotScaleUpImages(): void
     {
         $file = $this->createMock(File::class);
@@ -78,9 +75,7 @@ final class LocalPreviewHelperTest extends UnitTestCase
         self::assertNull($localPreviewHelper->process($task));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processGeneratesPreviewEvenIfSourceFileHasNoSize(): void
     {
         $file = $this->createMock(File::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Processing/ProcessorRegistryTest.php b/typo3/sysext/core/Tests/Unit/Resource/Processing/ProcessorRegistryTest.php
index 34e789d0c44a3fe25288fa49745ba7654205461a..b841c109facbb62efa626d605e92bea42e002dad 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Processing/ProcessorRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Processing/ProcessorRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Processing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\Processing\AbstractTask;
 use TYPO3\CMS\Core\Resource\Processing\LocalImageProcessor;
 use TYPO3\CMS\Core\Resource\Processing\ProcessorRegistry;
@@ -26,9 +27,7 @@ final class ProcessorRegistryTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessorWhenOnlyOneIsRegistered(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['fal']['processors'] = [
@@ -46,9 +45,7 @@ final class ProcessorRegistryTest extends UnitTestCase
         self::assertInstanceOf(LocalImageProcessor::class, $processor);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessorWhenNoneIsRegistered(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['fal']['processors'] = [];
@@ -59,9 +56,7 @@ final class ProcessorRegistryTest extends UnitTestCase
         $subject->getProcessorByTask($taskMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessorWhenSameProcessorIsRegisteredTwice(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['fal']['processors'] = [
diff --git a/typo3/sysext/core/Tests/Unit/Resource/RelativeCssPathFixerTest.php b/typo3/sysext/core/Tests/Unit/Resource/RelativeCssPathFixerTest.php
index 501c71710238d1668c6cb13bbd3ce802c4fd0d72..8423c3bbcc209de1a804e2f1da458349a4a01678 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/RelativeCssPathFixerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/RelativeCssPathFixerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\RelativeCssPathFixer;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -69,10 +71,8 @@ final class RelativeCssPathFixerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider fixRelativeUrlPathsDataProvider
-     */
+    #[DataProvider('fixRelativeUrlPathsDataProvider')]
+    #[Test]
     public function fixRelativeUrlPaths(string $css, string $newDir, string $expected): void
     {
         $subject = new RelativeCssPathFixer();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Rendering/AudioTagRendererTest.php b/typo3/sysext/core/Tests/Unit/Resource/Rendering/AudioTagRendererTest.php
index b66a9d428a9756a64d116a2eff63caf71ddf0d33..7d2457284ffd03f11f3ef3cfa03cbe127771fd2b 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Rendering/AudioTagRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Rendering/AudioTagRendererTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Rendering;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Rendering\AudioTagRenderer;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -26,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class AudioTagRendererTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getPriorityReturnsCorrectValue(): void
     {
         $audioTagRenderer = new AudioTagRenderer();
@@ -36,9 +36,7 @@ final class AudioTagRendererTest extends UnitTestCase
         self::assertSame(1, $audioTagRenderer->getPriority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsTrueOnCorrectFile(): void
     {
         $audioTagRenderer = new AudioTagRenderer();
@@ -55,9 +53,7 @@ final class AudioTagRendererTest extends UnitTestCase
         self::assertTrue($audioTagRenderer->canRender($fileResourceMock3));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsFalseOnCorrectFile(): void
     {
         $audioTagRenderer = new AudioTagRenderer();
@@ -118,10 +114,8 @@ final class AudioTagRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider renderArgumentsDataProvider
-     */
+    #[DataProvider('renderArgumentsDataProvider')]
+    #[Test]
     public function renderOutputIsCorrect(string $url, array $arguments, string $expected): void
     {
         $audioTagRenderer = new AudioTagRenderer();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Rendering/RendererRegistryTest.php b/typo3/sysext/core/Tests/Unit/Resource/Rendering/RendererRegistryTest.php
index 434600f9d8b413a2c922c14dc0f9965a787ccb2a..95a4d581cba3a6f60b17bd86606751e6db4d6dbe 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Rendering/RendererRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Rendering/RendererRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Rendering;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Rendering\AudioTagRenderer;
@@ -46,9 +47,7 @@ final class RendererRegistryTest extends UnitTestCase
         return $rendererRegistry;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredFileRenderClassCanBeRetrieved(): void
     {
         $rendererClass = StringUtility::getUniqueId('myRenderer');
@@ -62,9 +61,7 @@ final class RendererRegistryTest extends UnitTestCase
         self::assertContains($rendererObject, $rendererRegistry->getRendererInstances());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerRendererClassThrowsExceptionIfClassDoesNotExist(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -74,9 +71,7 @@ final class RendererRegistryTest extends UnitTestCase
         $rendererRegistry->registerRendererClass(StringUtility::getUniqueId());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerRendererClassThrowsExceptionIfClassDoesNotImplementRightInterface(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -87,9 +82,7 @@ final class RendererRegistryTest extends UnitTestCase
         $rendererRegistry->registerRendererClass($className);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerRendererClassWithHighestPriorityIsFirstInResult(): void
     {
         $rendererClass1 = StringUtility::getUniqueId('myRenderer1');
@@ -127,9 +120,7 @@ final class RendererRegistryTest extends UnitTestCase
         self::assertInstanceOf($rendererClass1, $rendererInstances[2]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredFileRendererClassWithSamePriorityAreAllReturned(): void
     {
         $rendererClass1 = StringUtility::getUniqueId('myRenderer1');
@@ -158,9 +149,7 @@ final class RendererRegistryTest extends UnitTestCase
         self::assertContains($rendererObject2, $rendererInstances);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRendererReturnsCorrectInstance(): void
     {
         $rendererClass1 = StringUtility::getUniqueId('myVideoRenderer');
@@ -197,9 +186,7 @@ final class RendererRegistryTest extends UnitTestCase
         self::assertInstanceOf($rendererClass1, $renderer);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRendererReturnsCorrectInstance2(): void
     {
         $this->resetSingletonInstances = true;
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Rendering/VideoTagRendererTest.php b/typo3/sysext/core/Tests/Unit/Resource/Rendering/VideoTagRendererTest.php
index 67a63d13b14c4eb940db7d39b85762beb1bac746..e5ed01252e8c35291c938d456c0c769b7da2f7b4 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Rendering/VideoTagRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Rendering/VideoTagRendererTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Rendering;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Rendering\VideoTagRenderer;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -26,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class VideoTagRendererTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getPriorityReturnsCorrectValue(): void
     {
         $VideoTagRenderer = new VideoTagRenderer();
@@ -36,9 +36,7 @@ final class VideoTagRendererTest extends UnitTestCase
         self::assertSame(1, $VideoTagRenderer->getPriority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsTrueOnCorrectFile(): void
     {
         $VideoTagRenderer = new VideoTagRenderer();
@@ -58,9 +56,7 @@ final class VideoTagRendererTest extends UnitTestCase
         self::assertTrue($VideoTagRenderer->canRender($fileResourceMock4));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsFalseOnCorrectFile(): void
     {
         $VideoTagRenderer = new VideoTagRenderer();
@@ -153,10 +149,8 @@ final class VideoTagRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider renderArgumentsDataProvider
-     */
+    #[DataProvider('renderArgumentsDataProvider')]
+    #[Test]
     public function renderOutputIsCorrect(string $url, array $arguments, string $expected): void
     {
         $VideoTagRenderer = new VideoTagRenderer();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Rendering/VimeoRendererTest.php b/typo3/sysext/core/Tests/Unit/Resource/Rendering/VimeoRendererTest.php
index 709785eed6a7ebdae2db393644c24cfeed951603..c7a4bc2741c318271198324b91e2b10a5d269809 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Rendering/VimeoRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Rendering/VimeoRendererTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Rendering;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\FileReference;
@@ -43,17 +44,13 @@ final class VimeoRendererTest extends UnitTestCase
         $this->subject->method('getOnlineMediaHelper')->willReturn($vimeoHelper);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPriorityReturnsCorrectValue(): void
     {
         self::assertSame(1, $this->subject->getPriority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsTrueOnCorrectFile(): void
     {
         $fileResourceMock1 = $this->createMock(File::class);
@@ -67,9 +64,7 @@ final class VimeoRendererTest extends UnitTestCase
         self::assertTrue($this->subject->canRender($fileResourceMock2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsFalseOnCorrectFile(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -78,9 +73,7 @@ final class VimeoRendererTest extends UnitTestCase
         self::assertFalse($this->subject->canRender($fileResourceMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -91,9 +84,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithLoopIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -104,9 +95,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAutoplayIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -117,9 +106,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAutoplayFromReferenceIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -134,9 +121,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAutoplayAndWithoutControlsIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -147,9 +132,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAdditionalAttributes(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -160,9 +143,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithDataAttributesForCustomization(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -173,9 +154,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithCombinationOfDataAndAdditionalAttributes(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -186,9 +165,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithCustomAllowIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -199,9 +176,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithCustomAllowAndAutoplayIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -212,9 +187,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithPrivateVimeoCodeIsCorrect(): void
     {
         $vimeoHelper = $this->getAccessibleMock(VimeoHelper::class, ['getOnlineMediaId'], ['vimeo']);
@@ -232,9 +205,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputIsEscaped(): void
     {
         $vimeoHelper = $this->getAccessibleMock(VimeoHelper::class, ['getOnlineMediaId'], ['vimeo']);
@@ -252,9 +223,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithApiIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -265,9 +234,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithEnabledNoCookieIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -278,9 +245,7 @@ final class VimeoRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithDisabledNoCookieIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Rendering/YouTubeRendererTest.php b/typo3/sysext/core/Tests/Unit/Resource/Rendering/YouTubeRendererTest.php
index 453c3a429f1fed9d63396a72356b721d9d51f36b..15041ba470dab8a7ea964e334e338fd96975e121 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Rendering/YouTubeRendererTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Rendering/YouTubeRendererTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Rendering;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\FileReference;
@@ -44,17 +46,13 @@ final class YouTubeRendererTest extends UnitTestCase
         $this->subject->method('getOnlineMediaHelper')->willReturn($youTubeHelper);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPriorityReturnsCorrectValue(): void
     {
         self::assertSame(1, $this->subject->getPriority());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsTrueOnCorrectFile(): void
     {
         $fileResourceMock1 = $this->createMock(File::class);
@@ -68,9 +66,7 @@ final class YouTubeRendererTest extends UnitTestCase
         self::assertTrue($this->subject->canRender($fileResourceMock2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canRenderReturnsFalseOnCorrectFile(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -79,9 +75,7 @@ final class YouTubeRendererTest extends UnitTestCase
         self::assertFalse($this->subject->canRender($fileResourceMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithLoopIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -92,9 +86,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAutoplayIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -105,9 +97,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAutoplayFromFileReferenceIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -122,9 +112,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAutoplayAndWithoutControlsIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -205,10 +193,8 @@ final class YouTubeRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider renderOutputWithControlsDataProvider
-     */
+    #[DataProvider('renderOutputWithControlsDataProvider')]
+    #[Test]
     public function renderOutputWithDefaultControlsIsCorrect($expected, $options): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -219,9 +205,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithRelatedVideosTurnedOffIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -232,9 +216,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithAdditionalAttributes(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -245,9 +227,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithDataAttributesForCustomization(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -258,9 +238,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithCombinationOfDataAndAdditionalAttributes(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -271,9 +249,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithDisabledNoCookieIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -284,9 +260,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithModestbrandingIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -297,9 +271,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithCustomAllowIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -310,9 +282,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputWithCustomAllowAndAutoplayIsCorrect(): void
     {
         $fileResourceMock = $this->createMock(File::class);
@@ -323,9 +293,7 @@ final class YouTubeRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOutputIsEscaped(): void
     {
         $youtubeHelper = $this->getAccessibleMock(YouTubeHelper::class, ['getOnlineMediaId'], ['youtube']);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Repository/AbstractRepositoryTest.php b/typo3/sysext/core/Tests/Unit/Resource/Repository/AbstractRepositoryTest.php
index b134653779236d3b5a56cd9ba4ff9b2bf6270a96..628477b6333c8132e0cfb52df5f003f527136c55 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Repository/AbstractRepositoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Repository/AbstractRepositoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Repository;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\ConnectionPool;
@@ -45,9 +46,7 @@ final class AbstractRepositoryTest extends UnitTestCase
         return $queryBuilderMock;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findByUidFailsIfUidIsString(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest.php b/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest.php
index 88ab6b19ab73395f535f5f13099810d22e2dcb56..ce9b3ccb23313b51891b1fe788e6fdd890dbcf26 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/ResourceCompressorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\ResourceCompressor;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -62,10 +64,8 @@ final class ResourceCompressorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cssFixStatementsDataProvider
-     */
+    #[DataProvider('cssFixStatementsDataProvider')]
+    #[Test]
     public function cssFixStatementsMovesStatementsToTopIfNeeded(string $input, string $expected): void
     {
         $subject = $this->getAccessibleMock(ResourceCompressor::class, ['compressCssFile', 'compressJsFile', 'createMergedCssFile', 'createMergedJsFile', 'getFilenameFromMainDir', 'checkBaseDirectory']);
@@ -75,9 +75,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertEquals($expected, $resultWithReadableLinefeed);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compressedCssFileIsFlaggedToNotCompressAgain(): void
     {
         $fileName = 'fooFile.css';
@@ -101,9 +99,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertFalse($result[$compressedFileName]['compress']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function compressedJsFileIsFlaggedToNotCompressAgain(): void
     {
         $fileName = 'fooFile.js';
@@ -127,9 +123,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertFalse($result[$compressedFileName]['compress']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function concatenatedCssFileIsFlaggedToNotConcatenateAgain(): void
     {
         $fileName = 'fooFile.css';
@@ -153,9 +147,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertTrue($result[$concatenatedFileName]['excludeFromConcatenation']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function concatenatedCssFilesAreSeparatedByMediaType(): void
     {
         $allFileName = 'allFile.css';
@@ -197,9 +189,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertEquals('screen', $result['merged_' . $screenFileName1]['media']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function concatenatedCssFilesObeyForceOnTopOption(): void
     {
         $screen1FileName = 'screen1File.css';
@@ -233,9 +223,7 @@ final class ResourceCompressorTest extends UnitTestCase
         $subject->concatenateCssFiles($testFileFixture);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function concatenatedCssFilesObeyExcludeFromConcatenation(): void
     {
         $screen1FileName = 'screen1File.css';
@@ -274,9 +262,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertEquals('screen', $result['merged_screen']['media']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function concatenateJsFileIsFlaggedToNotConcatenateAgain(): void
     {
         $fileName = 'fooFile.js';
@@ -406,10 +392,8 @@ final class ResourceCompressorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider concatenateJsFileAsyncDataProvider
-     */
+    #[DataProvider('concatenateJsFileAsyncDataProvider')]
+    #[Test]
     public function concatenateJsFileAddsAsyncPropertyIfAllFilesAreAsync(array $input, bool $expected): void
     {
         $concatenatedFileName = 'merged_foo.js';
@@ -445,10 +429,8 @@ final class ResourceCompressorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider calcStatementsDataProvider
-     */
+    #[DataProvider('calcStatementsDataProvider')]
+    #[Test]
     public function calcFunctionMustRetainWhitespaces(string $input, string $expected): void
     {
         $subject = $this->getAccessibleMock(ResourceCompressor::class, ['compressCssFile', 'compressJsFile', 'createMergedCssFile', 'createMergedJsFile', 'getFilenameFromMainDir', 'checkBaseDirectory']);
@@ -457,9 +439,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertSame($expected, trim($result));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nomoduleJavascriptIsNotConcatenated(): void
     {
         $fileName = 'fooFile.js';
@@ -479,9 +459,7 @@ final class ResourceCompressorTest extends UnitTestCase
         self::assertTrue($result[$fileName]['nomodule']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deferJavascriptIsNotConcatenated(): void
     {
         $fileName = 'fooFile.js';
diff --git a/typo3/sysext/core/Tests/Unit/Resource/ResourceFactoryTest.php b/typo3/sysext/core/Tests/Unit/Resource/ResourceFactoryTest.php
index cc06b65b88c606f067033f60379e5afcacf08edb..696fa8171454e2e82c81f978b6fb4fcff28a4ecb 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/ResourceFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/ResourceFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Resource\Exception\ResourceDoesNotExistException;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -55,9 +56,7 @@ final class ResourceFactoryTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFolderCreatesObjectWithCorrectArguments(): void
     {
         $mockedMount = $this->createMock(ResourceStorage::class);
@@ -72,10 +71,7 @@ final class ResourceFactoryTest extends UnitTestCase
     /***********************************
      *  File Handling
      ***********************************/
-
-    /**
-     * @test
-     */
+    #[Test]
     public function retrieveFileOrFolderObjectCallsGetFolderObjectFromCombinedIdentifierWithRelativePath(): void
     {
         $subject = $this->getAccessibleMock(
@@ -92,9 +88,7 @@ final class ResourceFactoryTest extends UnitTestCase
         $subject->retrieveFileOrFolderObject('typo3');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function retrieveFileOrFolderObjectCallsGetFolderObjectFromCombinedIdentifierWithAbsolutePath(): void
     {
         $subject = $this->getAccessibleMock(
@@ -111,9 +105,7 @@ final class ResourceFactoryTest extends UnitTestCase
         $subject->retrieveFileOrFolderObject(Environment::getPublicPath() . '/typo3');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function retrieveFileOrFolderObjectReturnsFileIfPathIsGiven(): void
     {
         $this->subject = $this->getAccessibleMock(ResourceFactory::class, ['getFileObjectFromCombinedIdentifier'], [], '', false);
@@ -127,9 +119,7 @@ final class ResourceFactoryTest extends UnitTestCase
         $this->subject->retrieveFileOrFolderObject($filename);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function retrieveFileOrFolderObjectReturnsFileFromPublicFolderWhenProjectRootIsNotPublic(): void
     {
         Environment::initialize(
@@ -157,9 +147,7 @@ final class ResourceFactoryTest extends UnitTestCase
         $this->subject->retrieveFileOrFolderObject($filename);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function retrieveFileOrFolderObjectReturnsFileFromPublicExtensionResourceWhenExtensionIsNotPublic(): void
     {
         Environment::initialize(
@@ -181,9 +169,7 @@ final class ResourceFactoryTest extends UnitTestCase
         $this->subject->retrieveFileOrFolderObject('EXT:core/Resources/Public/Icons/Extension.svg');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function retrieveFileOrFolderObjectThrowsExceptionFromPrivateExtensionResourceWhenExtensionIsNotPublic(): void
     {
         Environment::initialize(
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Security/FileNameValidatorTest.php b/typo3/sysext/core/Tests/Unit/Resource/Security/FileNameValidatorTest.php
index 2a7b156ab34cf0231cec4533ba24692aeddcedb5..58e7a1573936db9800ec653dece9b4e2a876a2d7 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Security/FileNameValidatorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Security/FileNameValidatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Security;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
 use TYPO3\CMS\Core\Resource\Security\FileNameValidator;
 use TYPO3\CMS\Core\Utility\StringUtility;
@@ -35,10 +37,9 @@ final class FileNameValidatorTest extends TestCase
 
     /**
      * Tests whether validator detects files with nul character without file deny pattern.
-     *
-     * @test
-     * @dataProvider deniedFilesWithoutDenyPatternDataProvider
      */
+    #[DataProvider('deniedFilesWithoutDenyPatternDataProvider')]
+    #[Test]
     public function verifyNulCharacterFilesAgainstPatternWithoutFileDenyPattern(string $deniedFile): void
     {
         $subject = new FileNameValidator('');
@@ -113,10 +114,9 @@ final class FileNameValidatorTest extends TestCase
 
     /**
      * Tests whether the basic FILE_DENY_PATTERN detects denied files.
-     *
-     * @test
-     * @dataProvider deniedFilesWithDefaultDenyPatternDataProvider
      */
+    #[DataProvider('deniedFilesWithDefaultDenyPatternDataProvider')]
+    #[Test]
     public function isValidDetectsNotAllowedFiles(string $deniedFile): void
     {
         $subject = new FileNameValidator();
@@ -132,10 +132,8 @@ final class FileNameValidatorTest extends TestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider insecureFilesDataProvider
-     */
+    #[DataProvider('insecureFilesDataProvider')]
+    #[Test]
     public function isValidAcceptsNotAllowedFilesDueToInsecureSetting(string $fileName): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'] = '\\.phc$';
@@ -158,19 +156,16 @@ final class FileNameValidatorTest extends TestCase
 
     /**
      * Tests whether the basic file deny pattern accepts allowed files.
-     *
-     * @test
-     * @dataProvider allowedFilesDataProvider
      */
+    #[DataProvider('allowedFilesDataProvider')]
+    #[Test]
     public function isValidAcceptAllowedFiles(string $allowedFile): void
     {
         $subject = new FileNameValidator();
         self::assertTrue($subject->isValid($allowedFile));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isCustomDenyPatternConfigured(): void
     {
         $subject = new FileNameValidator('nothing-really');
@@ -185,9 +180,7 @@ final class FileNameValidatorTest extends TestCase
         self::assertFalse($subject->customFileDenyPatternConfigured());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function customFileDenyPatternFindsMissingImportantParts(): void
     {
         $subject = new FileNameValidator('\\.php$|.php8$');
@@ -213,10 +206,9 @@ final class FileNameValidatorTest extends TestCase
 
     /**
      * Tests whether an accordant PHP extension is denied.
-     *
-     * @test
-     * @dataProvider phpExtensionDataProvider
      */
+    #[DataProvider('phpExtensionDataProvider')]
+    #[Test]
     public function defaultFileDenyPatternMatchesPhpExtension(string $fileName): void
     {
         self::assertGreaterThan(0, preg_match('/' . FileNameValidator::DEFAULT_FILE_DENY_PATTERN . '/', $fileName), $fileName);
@@ -224,10 +216,9 @@ final class FileNameValidatorTest extends TestCase
 
     /**
      * Tests whether an accordant PHP extension is denied.
-     *
-     * @test
-     * @dataProvider phpExtensionDataProvider
      */
+    #[DataProvider('phpExtensionDataProvider')]
+    #[Test]
     public function invalidPhpExtensionIsDetected(string $fileName): void
     {
         $subject = new FileNameValidator();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Service/ConfigurationServiceTest.php b/typo3/sysext/core/Tests/Unit/Resource/Service/ConfigurationServiceTest.php
index 96d4a07f2c22709da1e03a6cbb69bbfcd68163de..92f92ea941ad188a00f1393bce12f03dbb13763f 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Service/ConfigurationServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Service/ConfigurationServiceTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\ProcessedFile;
 use TYPO3\CMS\Core\Resource\Service\ConfigurationService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConfigurationServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function serializeSubstitutesFileObject(): void
     {
         $fileMock = $this->createMock(ProcessedFile::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Service/ExtractorServiceTest.php b/typo3/sysext/core/Tests/Unit/Resource/Service/ExtractorServiceTest.php
index 95a25853861c49b74b4d0cde124ecf628c424cda..ebfadc1dd4c7d5fe3e7656bffa48f38c988c5ec1 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Service/ExtractorServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Service/ExtractorServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Index\ExtractorInterface;
 use TYPO3\CMS\Core\Resource\Index\ExtractorRegistry;
@@ -26,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ExtractorServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function isFileTypeSupportedByExtractorReturnsFalseForFileTypeTextAndExtractorLimitedToFileTypeImage(): void
     {
         $fileMock = $this->createMock(File::class);
@@ -48,9 +48,7 @@ final class ExtractorServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFileTypeSupportedByExtractorReturnsTrueForFileTypeImageAndExtractorLimitedToFileTypeImage(): void
     {
         $fileMock = $this->createMock(File::class);
@@ -70,9 +68,7 @@ final class ExtractorServiceTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFileTypeSupportedByExtractorReturnsTrueForFileTypeTextAndExtractorHasNoFileTypeLimitation(): void
     {
         $fileMock = $this->createMock(File::class);
@@ -92,9 +88,7 @@ final class ExtractorServiceTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractMetaDataComposesDataByAvailableExtractors(): void
     {
         $storageMock = $this->createMock(ResourceStorage::class);
@@ -207,10 +201,8 @@ final class ExtractorServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider extractMetaDataComposesDataByAvailableExtractorsWithDifferentPrioritiesDataProvider
-     */
+    #[DataProvider('extractMetaDataComposesDataByAvailableExtractorsWithDifferentPrioritiesDataProvider')]
+    #[Test]
     public function extractMetaDataComposesDataByAvailableExtractorsWithDifferentPriorities(
         int $extractorOneDataPriority,
         int $extractorOneExecutionPriority,
diff --git a/typo3/sysext/core/Tests/Unit/Resource/StorageRepositoryTest.php b/typo3/sysext/core/Tests/Unit/Resource/StorageRepositoryTest.php
index fe1173231d49ab58c8eb231f8c830fc37abdb8f1..c6ae2d299246762f89e6439717d9bd1147b6b071 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/StorageRepositoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/StorageRepositoryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Core\Resource\Driver\DriverInterface;
 use TYPO3\CMS\Core\Resource\Driver\DriverRegistry;
@@ -26,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class StorageRepositoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getDriverObjectAcceptsDriverClassName(): void
     {
         $mockedDriver = $this->createMock(DriverInterface::class);
@@ -94,10 +94,8 @@ final class StorageRepositoryTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider storageDetectionDataProvider
-     */
+    #[DataProvider('storageDetectionDataProvider')]
+    #[Test]
     public function findBestMatchingStorageByLocalPathReturnsDefaultStorageIfNoMatchIsFound(array $storageConfiguration, string $path, int $expectedStorageId): void
     {
         $subject = new StorageRepository(
diff --git a/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/PlainTextExtractorTest.php b/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/PlainTextExtractorTest.php
index 86faf6e4e3d841b1874f104ac544d6acd0932755..da956524eefb3e6a6d59943658554fc44f7f0140 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/PlainTextExtractorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/PlainTextExtractorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\TextExtraction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\TextExtraction\PlainTextExtractor;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class PlainTextExtractorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function canExtractTextReturnsTrueForPlainTextFiles(): void
     {
         $plainTextExtractor = new PlainTextExtractor();
@@ -39,9 +38,7 @@ final class PlainTextExtractorTest extends UnitTestCase
         self::assertTrue($plainTextExtractor->canExtractText($fileResourceMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canExtractTextReturnsFalseForNonPlainTextFiles(): void
     {
         $plainTextExtractor = new PlainTextExtractor();
diff --git a/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/TextExtractorRegistryTest.php b/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/TextExtractorRegistryTest.php
index ee9ddd705cf5d7b22b89cb73e85f656cd32e8043..e6e42a83eed7a5273bb3244e23fb50c290f38fe7 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/TextExtractorRegistryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/TextExtraction/TextExtractorRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\TextExtraction;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\TextExtraction\TextExtractorInterface;
 use TYPO3\CMS\Core\Resource\TextExtraction\TextExtractorRegistry;
@@ -46,9 +47,7 @@ final class TextExtractorRegistryTest extends UnitTestCase
         return $textExtractorRegistry;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registeredTextExtractorClassCanBeRetrieved(): void
     {
         $textExtractorClass = StringUtility::getUniqueId('myTextExtractor');
@@ -62,9 +61,7 @@ final class TextExtractorRegistryTest extends UnitTestCase
         self::assertContains($textExtractorInstance, $textExtractorRegistry->getTextExtractorInstances());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerTextExtractorThrowsExceptionIfClassDoesNotExist(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -74,9 +71,7 @@ final class TextExtractorRegistryTest extends UnitTestCase
         $textExtractorRegistry->registerTextExtractor(StringUtility::getUniqueId());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerTextExtractorThrowsExceptionIfClassDoesNotImplementRightInterface(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Resource/Utility/FileExtensionFilterTest.php b/typo3/sysext/core/Tests/Unit/Resource/Utility/FileExtensionFilterTest.php
index 39f51ba05f24a981335358e20de02fb60e5d1251..eb040356fc22d589cd673e9daeff7f5e89207713 100644
--- a/typo3/sysext/core/Tests/Unit/Resource/Utility/FileExtensionFilterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Resource/Utility/FileExtensionFilterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Resource\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\DataHandling\DataHandler;
 use TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -27,9 +29,7 @@ final class FileExtensionFilterTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function areInlineChildrenFilteredWithInvalidParameters(): void
     {
         $dataHandlerMock = $this->createMock(DataHandler::class);
@@ -61,10 +61,8 @@ final class FileExtensionFilterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider extensionFilterIgnoresCaseInAllowedExtensionCheckDataProvider
-     */
+    #[DataProvider('extensionFilterIgnoresCaseInAllowedExtensionCheckDataProvider')]
+    #[Test]
     public function extensionFilterIgnoresCaseInAllowedExtensionCheck(
         string $fileExtension,
         string $allowedExtensions,
diff --git a/typo3/sysext/core/Tests/Unit/Routing/Aspect/AspectFactoryTest.php b/typo3/sysext/core/Tests/Unit/Routing/Aspect/AspectFactoryTest.php
index f917f24728a609bfdb99f947116a514aff6dbdc4..240865fb34f156669dd3217ef7d16900107ded57 100644
--- a/typo3/sysext/core/Tests/Unit/Routing/Aspect/AspectFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Routing/Aspect/AspectFactoryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Routing\Aspect;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Routing\Aspect\AspectFactory;
 use TYPO3\CMS\Core\Routing\Aspect\AspectInterface;
@@ -36,9 +38,7 @@ final class AspectFactoryTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAspectsThrowsExceptionOnMissingType(): void
     {
         $contextMock = $this->createMock(Context::class);
@@ -52,9 +52,7 @@ final class AspectFactoryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAspectsThrowsExceptionOnUnregisteredType(): void
     {
         $contextMock = $this->createMock(Context::class);
@@ -130,10 +128,9 @@ final class AspectFactoryTest extends UnitTestCase
 
     /**
      * @param string[] $expectation
-     *
-     * @test
-     * @dataProvider aspectsDataProvider
      */
+    #[DataProvider('aspectsDataProvider')]
+    #[Test]
     public function aspectsAreCreatedAndSorted(array $settings, array $expectation): void
     {
         $contextMock = $this->createMock(Context::class);
diff --git a/typo3/sysext/core/Tests/Unit/Routing/Enhancer/VariableProcessorTest.php b/typo3/sysext/core/Tests/Unit/Routing/Enhancer/VariableProcessorTest.php
index 3c17b33eab85a203e93c6e78c224e19f0862e221..ed86ece4be6180ba8c7521d141e632379dd48a63 100644
--- a/typo3/sysext/core/Tests/Unit/Routing/Enhancer/VariableProcessorTest.php
+++ b/typo3/sysext/core/Tests/Unit/Routing/Enhancer/VariableProcessorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Routing\Enhancer;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Routing\Enhancer\VariableProcessor;
 use TYPO3\CMS\Core\Routing\Enhancer\VariableProcessorCache;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -122,10 +124,8 @@ final class VariableProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider routePathDataProvider
-     */
+    #[DataProvider('routePathDataProvider')]
+    #[Test]
     public function isRoutePathProcessed(?string $namespace, array $arguments, string $inflatedRoutePath, string $deflatedRoutePath): void
     {
         $subject = new VariableProcessor(new VariableProcessorCache());
@@ -161,10 +161,8 @@ final class VariableProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider parametersDataProvider
-     */
+    #[DataProvider('parametersDataProvider')]
+    #[Test]
     public function parametersAreProcessed(array $arguments, array $deflatedParameters): void
     {
         $subject = new VariableProcessor(new VariableProcessorCache());
@@ -237,10 +235,8 @@ final class VariableProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider namespaceParametersDataProvider
-     */
+    #[DataProvider('namespaceParametersDataProvider')]
+    #[Test]
     public function namespaceParametersAreProcessed(string $namespace, array $arguments, array $deflatedParameters): void
     {
         $subject = new VariableProcessor(new VariableProcessorCache());
@@ -325,10 +321,8 @@ final class VariableProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider keysDataProvider
-     */
+    #[DataProvider('keysDataProvider')]
+    #[Test]
     public function keysAreDeflated(?string $namespace, array $arguments, array $deflatedKeys): void
     {
         $subject = new VariableProcessor(new VariableProcessorCache());
@@ -343,10 +337,8 @@ final class VariableProcessorTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider specialKeysDataProvider
-     */
+    #[DataProvider('specialKeysDataProvider')]
+    #[Test]
     public function specialKeysAreNotInflatedWithoutBeingDeflated(?string $namespace, array $arguments, array $deflatedKeys): void
     {
         $this->expectException(\OutOfRangeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Routing/PageRouterTest.php b/typo3/sysext/core/Tests/Unit/Routing/PageRouterTest.php
index 85c63359d3a7c6670423f57ece929a5feec3b525..f3f4b9a5464c1ccdaf46b63836308576a33712d7 100644
--- a/typo3/sysext/core/Tests/Unit/Routing/PageRouterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Routing/PageRouterTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Routing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Routing\BackendEntryPointResolver;
 use TYPO3\CMS\Core\Routing\PageArguments;
@@ -40,9 +41,7 @@ final class PageRouterTest extends UnitTestCase
         parent::setUp(); // TODO: Change the autogenerated stub
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRequestThrowsExceptionIfNoPreviousResultGiven(): void
     {
         $this->expectException(RouteNotFoundException::class);
@@ -53,9 +52,7 @@ final class PageRouterTest extends UnitTestCase
         $subject->matchRequest($request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function properSiteConfigurationFindsRoute(): void
     {
         $incomingUrl = 'https://king.com/lotus-flower/en/mr-magpie/bloom';
@@ -86,8 +83,8 @@ final class PageRouterTest extends UnitTestCase
 
     /**
      * Let's see if the slug is "/blabla" and the base does not have a trailing slash ("/en")
-     * @test
      */
+    #[Test]
     public function properSiteConfigurationWithoutTrailingSlashFindsRoute(): void
     {
         $incomingUrl = 'https://king.com/lotus-flower/en/mr-magpie/bloom';
diff --git a/typo3/sysext/core/Tests/Unit/Routing/RouteSorterTest.php b/typo3/sysext/core/Tests/Unit/Routing/RouteSorterTest.php
index 2973573c4c0608f2f7bed066fea097ba1ebde97e..80f9bac8b0d75169981c4745105a92fcce89a7ed 100644
--- a/typo3/sysext/core/Tests/Unit/Routing/RouteSorterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Routing/RouteSorterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Routing;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Routing\Route;
 use TYPO3\CMS\Core\Routing\RouteSorter;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -238,10 +240,9 @@ final class RouteSorterTest extends UnitTestCase
      * @param Route[] $givenRoutes
      * @param array<string, string> $givenParameters
      * @param string[] $expectation
-     *
-     * @test
-     * @dataProvider routesAreSortedForGenerationDataProvider
      */
+    #[DataProvider('routesAreSortedForGenerationDataProvider')]
+    #[Test]
     public function routesAreSortedForGeneration(array $givenRoutes, array $givenParameters, array $expectation): void
     {
         $sorter = (new RouteSorter())
diff --git a/typo3/sysext/core/Tests/Unit/Routing/SiteMatcherTest.php b/typo3/sysext/core/Tests/Unit/Routing/SiteMatcherTest.php
index 8508473e7c6f30775c7101796de09d8066b13209..27bbe9c63a089d396db131194e0f1c9278f83c71 100644
--- a/typo3/sysext/core/Tests/Unit/Routing/SiteMatcherTest.php
+++ b/typo3/sysext/core/Tests/Unit/Routing/SiteMatcherTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Routing;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Configuration\Features;
 use TYPO3\CMS\Core\Configuration\SiteConfiguration;
@@ -31,9 +33,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SiteMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function fullUrlMatchesSpecificLanguageWithSubdomainsAndDomainSuffixes(): void
     {
         $site = new Site('main', 1, [
@@ -124,8 +124,8 @@ final class SiteMatcherTest extends UnitTestCase
 
     /**
      * Contains a FQDN as base for the site
-     * @test
      */
+    #[Test]
     public function fullUrlMatchesSpecificLanguageWithSubdomainsAndPathSuffixes(): void
     {
         $site = new Site('main', 1, [
@@ -215,10 +215,8 @@ final class SiteMatcherTest extends UnitTestCase
         yield ['https://example.org/daother', '1-main', 'en-US'];
     }
 
-    /**
-     * @test
-     * @dataProvider bestMatchingUrlIsUsedDataProvider
-     */
+    #[DataProvider('bestMatchingUrlIsUsedDataProvider')]
+    #[Test]
     public function bestMatchingUrlIsUsed(string $requestUri, string $expectedSite, string $expectedLocale): void
     {
         $mainSite = new Site('1-main', 31, [
diff --git a/typo3/sysext/core/Tests/Unit/Schema/Struct/SelectItemTest.php b/typo3/sysext/core/Tests/Unit/Schema/Struct/SelectItemTest.php
index e464f9fb6669841be6c55b708a5a6a69aa18a5e1..31a441744dc4e8df783f836f3faa75241b176226 100644
--- a/typo3/sysext/core/Tests/Unit/Schema/Struct/SelectItemTest.php
+++ b/typo3/sysext/core/Tests/Unit/Schema/Struct/SelectItemTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Schema\Struct;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Schema\Struct\SelectItem;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -61,10 +63,8 @@ final class SelectItemTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider selectionItemCanBeConstructedFromTcaItemDataProvider
-     */
+    #[DataProvider('selectionItemCanBeConstructedFromTcaItemDataProvider')]
+    #[Test]
     public function selectionItemCanBeConstructedFromTcaItem(array $item, string $type, array $expected): void
     {
         $selectionItem = SelectItem::fromTcaItemArray($item, $type);
@@ -72,9 +72,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertSame($expected, $selectionItem->toArray());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dividerValueCanBeIdentified(): void
     {
         $item = ['label' => 'foo', 'value' => '--div--'];
@@ -96,10 +94,8 @@ final class SelectItemTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider notSetValuesCanBeIdentifiedDataProvider
-     */
+    #[DataProvider('notSetValuesCanBeIdentifiedDataProvider')]
+    #[Test]
     public function notSetValuesCanBeIdentified(array $item, array $expected): void
     {
         $selectionItem = SelectItem::fromTcaItemArray($item);
@@ -109,9 +105,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertSame($expected['description'], $selectionItem->hasDescription());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canBeAccessedAsAnArray(): void
     {
         $selectionItem = new SelectItem(
@@ -130,9 +124,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertSame('my description', $selectionItem['description']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canBeAccessedAsAnArrayWithLegacyIndexedKeys(): void
     {
         $selectionItem = new SelectItem(
@@ -151,9 +143,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertSame('my description', $selectionItem[4]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canBeManipulatedLikeAnArray(): void
     {
         $selectionItem = new SelectItem(
@@ -175,9 +165,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertSame('my description', $selectionItem->getDescription());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canBeManipulatedLikeAnArrayWithLegacyIndexedKeys(): void
     {
         $selectionItem = new SelectItem(
@@ -199,9 +187,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertSame('my description', $selectionItem->getDescription());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function valuesCanBeUnsetWithUnsetFunction(): void
     {
         $selectionItem = new SelectItem(
@@ -222,9 +208,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertNull($selectionItem->getDescription());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function valuesCanBeUnsetWithUnsetFunctionWithLegacyIndexedKeys(): void
     {
         $selectionItem = new SelectItem(
@@ -245,9 +229,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertNull($selectionItem->getDescription());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayOffsetsCanBeTestedWithIssetFunction(): void
     {
         $selectionItem = new SelectItem(
@@ -263,9 +245,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertFalse(isset($selectionItem['description']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayOffsetsCanBeTestedWithIssetFunctionWithLegacyIndexedKeys(): void
     {
         $selectionItem = new SelectItem(
@@ -281,9 +261,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertFalse(isset($selectionItem[4]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canSetCustomValueInArrayLikeFashion(): void
     {
         $selectionItem = new SelectItem(
@@ -298,9 +276,7 @@ final class SelectItemTest extends UnitTestCase
         self::assertSame('customValue', $selectionItem['custom']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canUnsetCustomValueInArrayLikeFashion(): void
     {
         $selectionItem = new SelectItem(
diff --git a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ConsumableNonceTest.php b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ConsumableNonceTest.php
index f7452238823901e2aa69643638e848323fd9275f..e5ba5dc7ea505eeca8ad39d2691a1121a62219fc 100644
--- a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ConsumableNonceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ConsumableNonceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security\ContentSecurityPolicy;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Security\ContentSecurityPolicy\ConsumableNonce;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -29,10 +31,8 @@ final class ConsumableNonceTest extends UnitTestCase
         yield 'consumed twice' => [2];
     }
 
-    /**
-     * @test
-     * @dataProvider consumptionIsRecognizedDataProvider
-     */
+    #[DataProvider('consumptionIsRecognizedDataProvider')]
+    #[Test]
     public function consumptionIsRecognized(int $consumption): void
     {
         $subject = new ConsumableNonce();
@@ -42,9 +42,7 @@ final class ConsumableNonceTest extends UnitTestCase
         self::assertCount($consumption, $subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function usesExistingValue(): void
     {
         $value = str_repeat('a', 40);
diff --git a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/Reporting/ReportTest.php b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/Reporting/ReportTest.php
index 3d2bc27428cb05a4f34be45456629cf5cbfe9667..17696f605a6fb245747c178efa4c2df7e2493e42 100644
--- a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/Reporting/ReportTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/Reporting/ReportTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security\ContentSecurityPolicy\Reporting;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Uid\UuidV4;
 use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Reporting\Report;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ReportTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function effectiveDirectiveIsTakenFromViolatedDirective(): void
     {
         $report = Report::fromArray([
@@ -40,9 +39,7 @@ final class ReportTest extends UnitTestCase
         self::assertSame('script-src', $report->details['effective-directive']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toArrayUsesNativeDetailKeys(): void
     {
         $details = [
@@ -58,9 +55,7 @@ final class ReportTest extends UnitTestCase
         self::assertSame($details, json_decode($report->toArray()['details'], true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function jsonEncodeUsesCamelCasedDetailKeys(): void
     {
         $details = [
diff --git a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ScopeTest.php b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ScopeTest.php
index 5eab7f36399d1db3edb7cdda550a5ae63c650ca3..c24585c6116d1197801b6441c65c598affbc0e1a 100644
--- a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ScopeTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/ScopeTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security\ContentSecurityPolicy;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ApplicationType;
 use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Scope;
 use TYPO3\CMS\Core\Site\Entity\NullSite;
@@ -32,27 +34,21 @@ final class ScopeTest extends UnitTestCase
         Scope::reset();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function backendSingletonIsCreated(): void
     {
         $scope = Scope::backend();
         self::assertSame($scope, Scope::backend());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function frontendSingletonIsCreated(): void
     {
         $scope = Scope::frontend();
         self::assertSame($scope, Scope::frontend());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function frontendSiteIsCreated(): void
     {
         $site = new Site('my-site', 1, []);
@@ -66,27 +62,21 @@ final class ScopeTest extends UnitTestCase
         yield [new NullSite()];
     }
 
-    /**
-     * @test
-     * @dataProvider frontendSingletonIsUsedForInvalidSiteDataProvider
-     */
+    #[DataProvider('frontendSingletonIsUsedForInvalidSiteDataProvider')]
+    #[Test]
     public function frontendSingletonIsUsedForInvalidSite(?SiteInterface $site): void
     {
         self::assertSame(Scope::frontend(), Scope::frontendSite($site));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function frontendSiteIdentifierSingletonIsCreated(): void
     {
         $scope = Scope::frontendSiteIdentifier('my-site');
         self::assertSame($scope, Scope::frontendSiteIdentifier('my-site'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function scopeIsCreatedFromString(): void
     {
         self::assertSame(
diff --git a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/SourceCollectionTest.php b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/SourceCollectionTest.php
index 13df4aad1bbb709786588b90938f49bd304edb19..3d765dc5ae504f7b25b86f4e508e10ee598f4725 100644
--- a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/SourceCollectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/SourceCollectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security\ContentSecurityPolicy;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Security\ContentSecurityPolicy\SourceCollection;
 use TYPO3\CMS\Core\Security\ContentSecurityPolicy\SourceScheme;
 use TYPO3\CMS\Core\Security\ContentSecurityPolicy\UriValue;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SourceCollectionTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function canExtend(): void
     {
         $subject = new SourceCollection();
@@ -39,9 +38,7 @@ final class SourceCollectionTest extends UnitTestCase
         self::assertSame([$schemeItem, $firstUriItem], $subject->sources);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canReduce(): void
     {
         $subject = new SourceCollection();
diff --git a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/UriValueTest.php b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/UriValueTest.php
index a9382743fbd001428e93208cffb4689cbdafdfff..cf7a8b716635a00dfb04b6b7e97103b06a644f7b 100644
--- a/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/UriValueTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/ContentSecurityPolicy/UriValueTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security\ContentSecurityPolicy;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Security\ContentSecurityPolicy\UriValue;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -48,10 +50,8 @@ final class UriValueTest extends UnitTestCase
         yield ['*.typo3.org?key=value', '/%2A.typo3.org?key=value'];
     }
 
-    /**
-     * @test
-     * @dataProvider uriIsParsedAndSerializedDataProvider
-     */
+    #[DataProvider('uriIsParsedAndSerializedDataProvider')]
+    #[Test]
     public function uriIsParsedAndSerialized(string $value, string $expectation = null): void
     {
         $uri = new UriValue($value);
@@ -68,10 +68,8 @@ final class UriValueTest extends UnitTestCase
         yield ['*.example.com', '*.example.com', true];
     }
 
-    /**
-     * @test
-     * @dataProvider urisAreEqualDataProvider
-     */
+    #[DataProvider('urisAreEqualDataProvider')]
+    #[Test]
     public function urisAreEqual(string $a, string $b, bool $expectation): void
     {
         self::assertSame($expectation, (new UriValue($a))->equals(new UriValue($b)));
@@ -99,10 +97,8 @@ final class UriValueTest extends UnitTestCase
         yield ['*.example.com', '*', false];
     }
 
-    /**
-     * @test
-     * @dataProvider uriIsCoveredDataProvider
-     */
+    #[DataProvider('uriIsCoveredDataProvider')]
+    #[Test]
     public function uriIsCovered(string $a, string $b, bool $expectation): void
     {
         self::assertSame($expectation, (new UriValue($a))->covers(new UriValue($b)));
diff --git a/typo3/sysext/core/Tests/Unit/Security/NoncePoolTest.php b/typo3/sysext/core/Tests/Unit/Security/NoncePoolTest.php
index cb98690fdea4385b491bb4bdf2ff9320baee1a8e..c0741dd07133c0973dda130e0ae0baeb3347ab52 100644
--- a/typo3/sysext/core/Tests/Unit/Security/NoncePoolTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/NoncePoolTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Security\Nonce;
 use TYPO3\CMS\Core\Security\NoncePool;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class NoncePoolTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function instantiationReflectsState(): void
     {
         $items = self::createItems();
@@ -39,9 +39,7 @@ final class NoncePoolTest extends UnitTestCase
         self::assertSame([], $pool->getEmittableNonces());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function itemsAreMerged(): void
     {
         $itemsA = self::createItems();
@@ -61,9 +59,7 @@ final class NoncePoolTest extends UnitTestCase
         self::assertSame([], $poolA->getEmittableNonces());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function provideSigningSecretDoesNotUseReceivedNonce(): void
     {
         $items = self::createItems();
@@ -98,10 +94,8 @@ final class NoncePoolTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider itemsArePurgedDataProvider
-     */
+    #[DataProvider('itemsArePurgedDataProvider')]
+    #[Test]
     public function itemsArePurged(array $options, array $items, array $validItems, array $revocableNames): void
     {
         $pool = (new NoncePool($items, $options))->purge();
diff --git a/typo3/sysext/core/Tests/Unit/Security/NonceTest.php b/typo3/sysext/core/Tests/Unit/Security/NonceTest.php
index dffe56eb61221a337c54915352169e835b13f5df..523b31874f6d09a0c2039ec62f7c72d5e88e4b3a 100644
--- a/typo3/sysext/core/Tests/Unit/Security/NonceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/NonceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Security\Nonce;
 use TYPO3\CMS\Core\Security\NonceException;
 use TYPO3\CMS\Core\Utility\StringUtility;
@@ -32,10 +34,8 @@ final class NonceTest extends UnitTestCase
         yield [60, 60];
     }
 
-    /**
-     * @test
-     * @dataProvider nonceIsCreatedDataProvider
-     */
+    #[DataProvider('nonceIsCreatedDataProvider')]
+    #[Test]
     public function isCreated(int $length, int $expectedLength): void
     {
         $nonce = Nonce::create($length);
@@ -43,9 +43,7 @@ final class NonceTest extends UnitTestCase
         self::assertSame($nonce->b64, StringUtility::base64urlEncode($nonce->binary));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isCreatedWithProperties(): void
     {
         $binary = random_bytes(40);
@@ -55,9 +53,7 @@ final class NonceTest extends UnitTestCase
         self::assertEquals($time, $nonce->time);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isEncodedAndDecoded(): void
     {
         $nonce = Nonce::create();
@@ -65,9 +61,7 @@ final class NonceTest extends UnitTestCase
         self::assertEquals($recodedNonce, $nonce);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidJwtThrowsException(): void
     {
         $this->expectException(NonceException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Security/RequestTokenTest.php b/typo3/sysext/core/Tests/Unit/Security/RequestTokenTest.php
index 79aa82c36001eaa5ff6932b7624b0a134158aa92..f0c0e6c4f1b58947572efd313882f9b1badeee2e 100644
--- a/typo3/sysext/core/Tests/Unit/Security/RequestTokenTest.php
+++ b/typo3/sysext/core/Tests/Unit/Security/RequestTokenTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Security;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Security\Nonce;
 use TYPO3\CMS\Core\Security\NoncePool;
 use TYPO3\CMS\Core\Security\RequestToken;
@@ -27,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RequestTokenTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function isCreated(): void
     {
         $scope = $this->createRandomString();
@@ -40,9 +40,7 @@ final class RequestTokenTest extends UnitTestCase
         self::assertSame([], $token->params);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isCreatedWithProperties(): void
     {
         $scope = $this->createRandomString();
@@ -54,9 +52,7 @@ final class RequestTokenTest extends UnitTestCase
         self::assertSame($params, $token->params);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function paramsAreOverriddenInNewInstance(): void
     {
         $scope = $this->createRandomString();
@@ -67,9 +63,7 @@ final class RequestTokenTest extends UnitTestCase
         self::assertSame($params, $modifiedToken->params);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function paramsAreMergedInNewInstance(): void
     {
         $scope = $this->createRandomString();
@@ -89,10 +83,8 @@ final class RequestTokenTest extends UnitTestCase
         yield 'secret to be resolved' => [$nonce, new SigningSecretResolver(['nonce' => $pool])];
     }
 
-    /**
-     * @test
-     * @dataProvider isEncodedAndDecodedDataProvider
-     */
+    #[DataProvider('isEncodedAndDecodedDataProvider')]
+    #[Test]
     public function isEncodedAndDecoded(Nonce $nonce, SigningSecretInterface|SigningSecretResolver $secret): void
     {
         $scope = $this->createRandomString();
@@ -121,10 +113,8 @@ final class RequestTokenTest extends UnitTestCase
         yield 'use resolver (bogus)' => ['no.jwt.value', new SigningSecretResolver(['nonce' => $pool]), 1664202134];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidJwtThrowsExceptionDataProvider
-     */
+    #[DataProvider('invalidJwtThrowsExceptionDataProvider')]
+    #[Test]
     public function invalidJwtThrowsException(string $jwt, SigningSecretInterface|SigningSecretResolver $secret, int $exceptionCode): void
     {
         $this->expectException(RequestTokenException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlParserTest.php b/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlParserTest.php
index 460f8ce513b1c0fd2b20d491a8ab781360da5124..3d90e2b6e15a9740a5dd0a0a0ea35cb2cbfa514e 100644
--- a/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlParserTest.php
+++ b/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlParserTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Serializer;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Exception;
 use TYPO3\CMS\Core\Serializer\Typo3XmlParser;
 use TYPO3\CMS\Core\Serializer\Typo3XmlParserOptions;
@@ -44,10 +46,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeReturnsStringOrArrayDataProvider
-     */
+    #[DataProvider('decodeReturnsStringOrArrayDataProvider')]
+    #[Test]
     public function decodeReturnsStringOrArray(string $data, mixed $expected): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -73,10 +73,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeHandlesCommentsDataProvider
-     */
+    #[DataProvider('decodeHandlesCommentsDataProvider')]
+    #[Test]
     public function decodeHandlesComments(array $config, array $expected): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -87,9 +85,7 @@ final class Typo3XmlParserTest extends UnitTestCase
         self::assertEquals($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function decodeIgnoresNodeAttributes(): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -156,10 +152,10 @@ final class Typo3XmlParserTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider decodeHandlesWhitespacesDataProvider
      * @param string $input
      */
+    #[DataProvider('decodeHandlesWhitespacesDataProvider')]
+    #[Test]
     public function decodeHandlesWhitespaces(string $input): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -259,10 +255,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeHandlesTagNamespacesDataProvider
-     */
+    #[DataProvider('decodeHandlesTagNamespacesDataProvider')]
+    #[Test]
     public function decodeHandlesTagNamespaces(string $input, array $expected, array $options = []): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -314,10 +308,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeReturnsRootNodeNameDataProvider
-     */
+    #[DataProvider('decodeReturnsRootNodeNameDataProvider')]
+    #[Test]
     public function decodeReturnsRootNodeName(string $input, string $rootNodeName): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -335,10 +327,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider decodeReturnsRootNodeNameDataProvider
-     */
+    #[DataProvider('decodeReturnsRootNodeNameDataProvider')]
+    #[Test]
     public function decodeCanIncludeRootNode(string $input, string $rootNodeName, array $options = []): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -399,10 +389,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeHandlesBigXmlContentDataProvider
-     */
+    #[DataProvider('decodeHandlesBigXmlContentDataProvider')]
+    #[Test]
     public function decodeHandlesBigXmlContent(string $input, string $testValue): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -499,10 +487,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeHandlesAttributeTypesDataProvider
-     */
+    #[DataProvider('decodeHandlesAttributeTypesDataProvider')]
+    #[Test]
     public function decodeHandlesAttributeTypes(string $input, mixed $expected): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -510,9 +496,7 @@ final class Typo3XmlParserTest extends UnitTestCase
         self::assertSame($expected, $result['index']['vDEF']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function decodeHandlesBase64Attribute(): void
     {
         $xmlDecoder = new Typo3XmlParser();
@@ -556,10 +540,8 @@ final class Typo3XmlParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodeThrowsExceptionOnXmlParsingErrorDataProvider
-     */
+    #[DataProvider('decodeThrowsExceptionOnXmlParsingErrorDataProvider')]
+    #[Test]
     public function decodeThrowsExceptionOnXmlParsingError(
         string $data,
         array $config,
@@ -571,9 +553,7 @@ final class Typo3XmlParserTest extends UnitTestCase
         $xmlDecoder->decode($data, new Typo3XmlSerializerOptions($config));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeDecodePingPongSucceeds(): void
     {
         $input = [
@@ -640,9 +620,7 @@ final class Typo3XmlParserTest extends UnitTestCase
         self::assertEquals($input, $arrayEncodedDecoded);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeDecodePingPongFailsForEmptyArray(): void
     {
         self::markTestSkipped(
diff --git a/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlSerializerTest.php b/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlSerializerTest.php
index 7b47838f3b404fb533e2431e42a9cef33c1a3c74..35d5844becdcc1058f41ec32c88f5a6f437fde5b 100644
--- a/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlSerializerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Serializer/Typo3XmlSerializerTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Serializer;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Serializer\Typo3XmlParserOptions;
 use TYPO3\CMS\Core\Serializer\Typo3XmlSerializer;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class Typo3XmlSerializerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeReturnsRootNodeIfArrayIsEmpty(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -34,9 +34,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanPreventWrappingByRootNode(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -48,9 +46,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 ', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeSupportsInlineXml(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -61,9 +57,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
         self::assertEquals('<phparray><node>value</node></phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeSupportsPrettyPrintWithTabIndentation(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -76,9 +70,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeSupportsPrettyPrintWith4SpacesIndentation(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -91,9 +83,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeEnsuresAlphaNumericCharactersAndMinusAndUnderscoreInNodeName(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -103,9 +93,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanPrependNamespaceToNodeName(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -118,9 +106,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanPrependNToNodeNameIfNodeNameIsNumber(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -134,9 +120,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanReplaceNodeNameAndAddAsIndexIfNodeNameIsNumber(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -156,9 +140,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanReplaceNodeNameAndAddAsIndexIfNodeNameIsString(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -178,9 +160,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanReplaceNodeNameAndAddAsIndexIfParentMatchesName(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -212,9 +192,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanReplaceNodeNameAndAddAsIndexIfParentAndNodeMatchNames(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -248,9 +226,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanReplaceNodeNameAndAddAsIndexIfParentMatchesNameAndNodeNameIsNumber(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -282,9 +258,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanReplaceNodeNameAndAddAsIndexIfGrandParentAndParentAndNodeMatchNames(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -320,9 +294,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanWrapStringWithCDATAIfStringContainsSpecialCharacters(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -342,9 +314,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeAddsTypeAttributeToNodeIfValueIsNotString(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -374,10 +344,8 @@ final class Typo3XmlSerializerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider encodeCanDisableAddingTypeAttributeToNodeExceptIfValueIsArrayDataProvider
-     */
+    #[DataProvider('encodeCanDisableAddingTypeAttributeToNodeExceptIfValueIsArrayDataProvider')]
+    #[Test]
     public function encodeCanDisableAddingTypeAttributeToNodeExceptIfValueIsArray(mixed $disableTypeAttrib): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -405,9 +373,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanDisableAddingTypeAttributeToNode(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -435,9 +401,7 @@ final class Typo3XmlSerializerTest extends UnitTestCase
 </phparray>', $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeAddsBase64AttributeAndEncodesWithBase64IfValueIsBinaryData(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
@@ -452,9 +416,7 @@ $contentBase64Encoded</binary>
 </phparray>", $xml);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function encodeCanSetAlternativeOptionsPerNestingLevel(): void
     {
         $xmlEncoder = new Typo3XmlSerializer();
diff --git a/typo3/sysext/core/Tests/Unit/Service/DependencyOrderingServiceTest.php b/typo3/sysext/core/Tests/Unit/Service/DependencyOrderingServiceTest.php
index 29b43f32ff6c3da3769793fc80cab4fd35d31aab..3dbc68ba4bce22bcd5e0cba7f67722978ff13b90 100644
--- a/typo3/sysext/core/Tests/Unit/Service/DependencyOrderingServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Service/DependencyOrderingServiceTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DependencyOrderingServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     * @dataProvider orderByDependenciesBuildsCorrectOrderDataProvider
-     */
+    #[DataProvider('orderByDependenciesBuildsCorrectOrderDataProvider')]
+    #[Test]
     public function orderByDependenciesBuildsCorrectOrder(array $items, string $beforeKey, string $afterKey, array $expectedOrderedItems): void
     {
         $orderedItems = (new DependencyOrderingService())->orderByDependencies($items, $beforeKey, $afterKey);
@@ -151,10 +151,10 @@ final class DependencyOrderingServiceTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider prepareDependenciesBuildsFullIdentifierListDataProvider
      * @throws \InvalidArgumentException
      */
+    #[DataProvider('prepareDependenciesBuildsFullIdentifierListDataProvider')]
+    #[Test]
     public function prepareDependenciesBuildsFullIdentifierList(array $dependencies, array $expectedDependencies): void
     {
         $dependencyOrderingService = $this->getAccessibleMock(DependencyOrderingService::class, null);
@@ -203,10 +203,8 @@ final class DependencyOrderingServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildDependencyGraphBuildsValidGraphDataProvider
-     */
+    #[DataProvider('buildDependencyGraphBuildsValidGraphDataProvider')]
+    #[Test]
     public function buildDependencyGraphBuildsValidGraph(array $dependencies, array $expectedGraph): void
     {
         $graph = (new DependencyOrderingService())->buildDependencyGraph($dependencies);
@@ -570,10 +568,8 @@ final class DependencyOrderingServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider calculateOrderResolvesCorrectOrderDataProvider
-     */
+    #[DataProvider('calculateOrderResolvesCorrectOrderDataProvider')]
+    #[Test]
     public function calculateOrderResolvesCorrectOrder(array $graph, array $expectedList): void
     {
         $list = (new DependencyOrderingService())->calculateOrder($graph);
@@ -623,9 +619,7 @@ final class DependencyOrderingServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function calculateOrderDetectsCyclicGraph(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -679,10 +673,8 @@ final class DependencyOrderingServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider findPathInGraphReturnsCorrectPathDataProvider
-     */
+    #[DataProvider('findPathInGraphReturnsCorrectPathDataProvider')]
+    #[Test]
     public function findPathInGraphReturnsCorrectPath(array $graph, string $from, string $to, array $expected): void
     {
         $dependencyOrderingService = $this->getAccessibleMock(DependencyOrderingService::class, null);
diff --git a/typo3/sysext/core/Tests/Unit/Service/FlexFormServiceTest.php b/typo3/sysext/core/Tests/Unit/Service/FlexFormServiceTest.php
index ba3e0f5b8f79e92578739a48df5387b931de3e30..fd50d3df942052a3bdb3919116c3e372b6385fab 100644
--- a/typo3/sysext/core/Tests/Unit/Service/FlexFormServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Service/FlexFormServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Service\FlexFormService;
@@ -27,9 +28,7 @@ final class FlexFormServiceTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFlexFormContentToArrayResolvesComplexArrayStructure(): void
     {
         $input = '<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
diff --git a/typo3/sysext/core/Tests/Unit/Service/MarkerBasedTemplateServiceTest.php b/typo3/sysext/core/Tests/Unit/Service/MarkerBasedTemplateServiceTest.php
index 700300ea0a8eef976a53fdf8165c7a27bda21f63..2ae9ad023d7be52d514e7d5c0fa9e3954cadcf1d 100644
--- a/typo3/sysext/core/Tests/Unit/Service/MarkerBasedTemplateServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/Service/MarkerBasedTemplateServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Service\MarkerBasedTemplateService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -103,10 +105,8 @@ text
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getSubpartDataProvider
-     */
+    #[DataProvider('getSubpartDataProvider')]
+    #[Test]
     public function getSubpart(string $content, string $marker, string $expected): void
     {
         self::assertSame($expected, $this->templateService->getSubpart($content, $marker));
@@ -232,10 +232,10 @@ hello
     }
 
     /**
-     * @test
      * @param string|array $subpartContent
-     * @dataProvider substituteSubpartDataProvider
      */
+    #[DataProvider('substituteSubpartDataProvider')]
+    #[Test]
     public function substituteSubpart(
         string $content,
         string $marker,
@@ -326,14 +326,14 @@ hello
     }
 
     /**
-     * @test
-     * @dataProvider substituteMarkerArrayDataProvider
      * @param string $content The content stream, typically HTML template content.
      * @param array $markContentArray The array of key/value pairs being marker/content values used in the substitution. For each element in this array the function will substitute a marker in the content stream with the content.
      * @param string $wrap A wrap value - [part 1] | [part 2] - for the markers before substitution
      * @param bool $uppercase If set, all marker string substitution is done with upper-case markers.
      * @param bool $deleteUnused If set, all unused marker are deleted.
      */
+    #[DataProvider('substituteMarkerArrayDataProvider')]
+    #[Test]
     public function substituteMarkerArray(
         string $content,
         array $markContentArray,
@@ -370,12 +370,12 @@ hello
     }
 
     /**
-     * @dataProvider substituteMarkerDataProvider
      * @param string $content The content stream, typically HTML template content.
      * @param string $marker The marker string, typically on the form "###[the marker string]###
      * @param mixed $markContent The content to insert instead of the marker string found.
      * @param string $expected The expected result of the substitution
      */
+    #[DataProvider('substituteMarkerDataProvider')]
     public function substituteMarker(string $content, string $marker, $markContent, string $expected): void
     {
         self::assertSame($expected, $this->templateService->substituteMarker($content, $marker, $markContent));
@@ -404,10 +404,8 @@ world
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider substituteSubpartArrayDataProvider
-     */
+    #[DataProvider('substituteSubpartArrayDataProvider')]
+    #[Test]
     public function substituteSubpartArray(string $content, array $subpartsContent, string $expected): void
     {
         self::assertSame($expected, $this->templateService->substituteSubpartArray($content, $subpartsContent));
@@ -608,10 +606,8 @@ Value 2.2
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider substituteMarkerAndSubpartArrayRecursiveResolvesMarkersAndSubpartsArrayDataProvider
-     */
+    #[DataProvider('substituteMarkerAndSubpartArrayRecursiveResolvesMarkersAndSubpartsArrayDataProvider')]
+    #[Test]
     public function substituteMarkerAndSubpartArrayRecursiveResolvesMarkersAndSubpartsArray(
         string $template,
         array $markersAndSubparts,
@@ -728,10 +724,8 @@ Value 2.2
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider substituteMarkerArrayCachedReturnsExpectedContentDataProvider
-     */
+    #[DataProvider('substituteMarkerArrayCachedReturnsExpectedContentDataProvider')]
+    #[Test]
     public function substituteMarkerArrayCachedReturnsExpectedContent(
         string $content,
         array $markContentArray,
diff --git a/typo3/sysext/core/Tests/Unit/Session/Backend/DatabaseSessionBackendTest.php b/typo3/sysext/core/Tests/Unit/Session/Backend/DatabaseSessionBackendTest.php
index fe5504a3892cfc6aad3e275a443e2a2053d7ddb4..aaac317900914aeb41dde48acc4700dbd066aa2c 100644
--- a/typo3/sysext/core/Tests/Unit/Session/Backend/DatabaseSessionBackendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Session/Backend/DatabaseSessionBackendTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Session\Backend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Session\Backend\DatabaseSessionBackend;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DatabaseSessionBackendTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validateConfigurationThrowsExceptionIfTableNameIsMissingInConfiguration(): void
     {
         $subject = new DatabaseSessionBackend();
diff --git a/typo3/sysext/core/Tests/Unit/Session/Backend/RedisSessionBackendTest.php b/typo3/sysext/core/Tests/Unit/Session/Backend/RedisSessionBackendTest.php
index 3d677e176f809817dd080563a413ab6250ace14c..4b246f1d45392b29f94f4159dbd977bd8e6d3933 100644
--- a/typo3/sysext/core/Tests/Unit/Session/Backend/RedisSessionBackendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Session/Backend/RedisSessionBackendTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Session\Backend;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Session\Backend\RedisSessionBackend;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -31,9 +32,7 @@ final class RedisSessionBackendTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function databaseConfigurationMustBeInteger(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -48,9 +47,7 @@ final class RedisSessionBackendTest extends UnitTestCase
         $subject->validateConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function databaseConfigurationMustBeZeroOrGreater(): void
     {
         $subject = new RedisSessionBackend();
diff --git a/typo3/sysext/core/Tests/Unit/Session/SessionManagerTest.php b/typo3/sysext/core/Tests/Unit/Session/SessionManagerTest.php
index 46e569857aa74ddfecee8d8511f8304edd215278..461ffc11e71c2eae580b138a37b3c92775e45af1 100644
--- a/typo3/sysext/core/Tests/Unit/Session/SessionManagerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Session/SessionManagerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Session;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Session\Backend\DatabaseSessionBackend;
 use TYPO3\CMS\Core\Session\Backend\SessionBackendInterface;
 use TYPO3\CMS\Core\Session\SessionManager;
@@ -25,18 +26,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SessionManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getSessionBackendUsesDefaultBackendFromConfiguration(): void
     {
         $subject = new SessionManager();
         self::assertInstanceOf(DatabaseSessionBackend::class, $subject->getSessionBackend('BE'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSessionBackendReturnsExpectedSessionBackendBasedOnConfiguration(): void
     {
         $backendMock = $this->createMock(SessionBackendInterface::class);
@@ -52,9 +49,7 @@ final class SessionManagerTest extends UnitTestCase
         self::assertInstanceOf($backendClassName, $subject->getSessionBackend('myidentifier'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSessionBackendThrowsExceptionForMissingConfiguration(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -64,9 +59,7 @@ final class SessionManagerTest extends UnitTestCase
         $subject->getSessionBackend('myNewidentifier');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSessionBackendThrowsExceptionIfBackendDoesNotImplementInterface(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Session/UserSessionManagerTest.php b/typo3/sysext/core/Tests/Unit/Session/UserSessionManagerTest.php
index 8650c9a0743a55fa330f5ceff4f3294562a20f71..4a795b6f99fb0ecb7fa5b046b8d1065a4586eec0 100644
--- a/typo3/sysext/core/Tests/Unit/Session/UserSessionManagerTest.php
+++ b/typo3/sysext/core/Tests/Unit/Session/UserSessionManagerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Session;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Authentication\IpLocker;
@@ -53,10 +55,8 @@ final class UserSessionManagerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider willExpireDataProvider
-     */
+    #[DataProvider('willExpireDataProvider')]
+    #[Test]
     public function willExpireWillExpire(int $sessionLifetime, int $gracePeriod, bool $expectedResult): void
     {
         $sessionBackendMock = $this->createMock(SessionBackendInterface::class);
@@ -86,9 +86,7 @@ final class UserSessionManagerTest extends UnitTestCase
         self::assertFalse($subject->hasExpired($newSession));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFromRequestOrAnonymousCreatesProperSessionObjectForValidSessionJwt(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'secret-encryption-key-test';
@@ -138,9 +136,7 @@ final class UserSessionManagerTest extends UnitTestCase
         self::assertNull($persistedSession->get('propertyC'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFromRequestOrAnonymousCreatesProperSessionObjectForInvalidSession(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'secret-encryption-key-test';
@@ -174,9 +170,7 @@ final class UserSessionManagerTest extends UnitTestCase
         self::assertTrue($anonymousSessionFromInvalidBackendRequest->isAnonymous());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updateSessionWillSetLastUpdated(): void
     {
         $sessionBackendMock = $this->createMock(SessionBackendInterface::class);
@@ -198,9 +192,7 @@ final class UserSessionManagerTest extends UnitTestCase
         self::assertSame(7654321, $session->getLastUpdated());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixateAnonymousSessionWillUpdateSessionObject(): void
     {
         $sessionBackendMock = $this->createMock(SessionBackendInterface::class);
diff --git a/typo3/sysext/core/Tests/Unit/Session/UserSessionTest.php b/typo3/sysext/core/Tests/Unit/Session/UserSessionTest.php
index ca178ca835e2e2769add0fdcdf9e11523df4825e..f380648c59a790f21be4e62455cc6eb5ae0700d8 100644
--- a/typo3/sysext/core/Tests/Unit/Session/UserSessionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Session/UserSessionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Session;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\CookieScope;
 use TYPO3\CMS\Core\Security\JwtTrait;
 use TYPO3\CMS\Core\Session\UserSession;
@@ -26,9 +27,7 @@ final class UserSessionTest extends UnitTestCase
 {
     use JwtTrait;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFromRecordTest(): void
     {
         $record = [
@@ -66,9 +65,7 @@ final class UserSessionTest extends UnitTestCase
         self::assertSame($record['ses_id'], UserSession::resolveIdentifierFromJwt($session->getJwt($scope), $scope) ?? '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createNonFixated(): void
     {
         $session = UserSession::createNonFixated('fdcba54321');
diff --git a/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php b/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php
index fc45e9812029121b2cb11d9b7571020e420166c5..d5a97a2b9d11929b629cb35408a2effd8fc837c3 100644
--- a/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php
+++ b/typo3/sysext/core/Tests/Unit/Site/Entity/SiteLanguageTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Site\Entity;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\Uri;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
@@ -60,10 +62,10 @@ final class SiteLanguageTest extends UnitTestCase
     }
 
     /**
-     * @dataProvider languageFallbackIdConversionDataProvider
-     * @test
      * @param string|array|null $input
      */
+    #[DataProvider('languageFallbackIdConversionDataProvider')]
+    #[Test]
     public function languageFallbackIdConversion($input, array $expected): void
     {
         $configuration = [
@@ -75,9 +77,7 @@ final class SiteLanguageTest extends UnitTestCase
         self::assertSame($expected, $subject->getFallbackLanguageIds());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toArrayReturnsProperOverlaidData(): void
     {
         $configuration = [
@@ -152,10 +152,8 @@ final class SiteLanguageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider typo3LanguageAndLocaleDataProvider
-     * @test
-     */
+    #[DataProvider('typo3LanguageAndLocaleDataProvider')]
+    #[Test]
     public function typo3LanguageIsEitherSetOrProperlyDerivedFromLocale(string $locale, array $configuration, $expected): void
     {
         $language = new SiteLanguage(0, $locale, new Uri('/'), $configuration);
diff --git a/typo3/sysext/core/Tests/Unit/Site/Entity/SiteTest.php b/typo3/sysext/core/Tests/Unit/Site/Entity/SiteTest.php
index 0e0c9ccfbdaca215d1c5dafd59ec9ec60a8c5424..7285c9be5b2577ff35fbe9d654c293f0c1b0c404 100644
--- a/typo3/sysext/core/Tests/Unit/Site/Entity/SiteTest.php
+++ b/typo3/sysext/core/Tests/Unit/Site/Entity/SiteTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Site\Entity;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ResponseFactoryInterface;
 use Symfony\Component\DependencyInjection\Container;
 use TYPO3\CMS\Core\Cache\CacheManager;
@@ -64,10 +66,8 @@ final class SiteTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getBaseReturnsProperUriDataProvider
-     */
+    #[DataProvider('getBaseReturnsProperUriDataProvider')]
+    #[Test]
     public function getBaseReturnsProperUri($input, $expected): void
     {
         $subject = new Site('all-your-base-belongs-to-us', 13, [
@@ -122,10 +122,9 @@ final class SiteTest extends UnitTestCase
     /**
      * This test shows that the a base from a site language is properly "inheriting" the base
      * from a site if it isn't absolute.
-     *
-     * @test
-     * @dataProvider getBaseForSiteLanguageReturnsProperUriDataProvider
      */
+    #[DataProvider('getBaseForSiteLanguageReturnsProperUriDataProvider')]
+    #[Test]
     public function getBaseForSiteLanguageReturnsProperUri($siteBase, $languageBase, $expected): void
     {
         $subject = new Site('all-of-base', 13, [
@@ -141,9 +140,7 @@ final class SiteTest extends UnitTestCase
         self::assertEquals(new Uri($expected), $subject->getLanguageById(0)->getBase());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getErrorHandlerReturnsConfiguredErrorHandler(): void
     {
         $subject = new Site('aint-misbehaving', 13, [
@@ -205,9 +202,7 @@ final class SiteTest extends UnitTestCase
         self::assertInstanceOf(PageContentErrorHandler::class, $subject->getErrorHandler(125));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getErrorHandlerThrowsExceptionOnInvalidErrorHandler(): void
     {
         $this->expectException(InvalidPageErrorHandlerException::class);
@@ -226,9 +221,7 @@ final class SiteTest extends UnitTestCase
         $subject->getErrorHandler(404);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getErrorHandlerThrowsExceptionWhenNoErrorHandlerIsConfigured(): void
     {
         $this->expectException(PageErrorHandlerNotConfiguredException::class);
@@ -238,9 +231,7 @@ final class SiteTest extends UnitTestCase
         $subject->getErrorHandler(404);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getErrorHandlerThrowsExceptionWhenNoErrorHandlerForStatusCodeIsConfigured(): void
     {
         $this->expectException(PageErrorHandlerNotConfiguredException::class);
@@ -258,9 +249,7 @@ final class SiteTest extends UnitTestCase
         $subject->getErrorHandler(404);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getErrorHandlerUsesFallbackWhenNoErrorHandlerForStatusCodeIsConfigured(): void
     {
         $app = new class () extends Application {
diff --git a/typo3/sysext/core/Tests/Unit/Text/TextCropperTest.php b/typo3/sysext/core/Tests/Unit/Text/TextCropperTest.php
index 3faf22c8ba1ac7c5a7b64dad6ede1fa7dcf775b3..cee32b0804fca311236b7f1c859daa885fb36dcb 100644
--- a/typo3/sysext/core/Tests/Unit/Text/TextCropperTest.php
+++ b/typo3/sysext/core/Tests/Unit/Text/TextCropperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Text;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Text\TextCropper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,9 +32,7 @@ final class TextCropperTest extends UnitTestCase
         $this->subject = new TextCropper();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cropIsMultibyteSafe(): void
     {
         $actual = $this->subject->crop(
@@ -113,10 +113,8 @@ final class TextCropperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cropWorksDataProvicer
-     */
+    #[DataProvider('cropWorksDataProvicer')]
+    #[Test]
     public function cropWorks(string $expected, string $content, int $numberOfChars, string $replacementForEllipsis, bool $cropToSpace): void
     {
         $this->handleCharset($content, $expected);
diff --git a/typo3/sysext/core/Tests/Unit/TimeTracker/TimeTrackerTest.php b/typo3/sysext/core/Tests/Unit/TimeTracker/TimeTrackerTest.php
index 4d34f197e5361ab698505adf1242310c2f72e761..e8db9dc567b07b179cf1fbd6b2db161d09a96767 100644
--- a/typo3/sysext/core/Tests/Unit/TimeTracker/TimeTrackerTest.php
+++ b/typo3/sysext/core/Tests/Unit/TimeTracker/TimeTrackerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TimeTracker;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TimeTracker\TimeTracker;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class TimeTrackerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getParseTimeReturnsZeroOrOneIfNoValuesAreSet(): void
     {
         $parseTime = (new TimeTracker())->getParseTime();
diff --git a/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/DatabaseTreeDataProviderTest.php b/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/DatabaseTreeDataProviderTest.php
index e657fbd58582f64c5b91bac70f9787ab5ea376e2..2940ed6235a3b20fcdaa9aec7d4442e3f7cdf1f3 100644
--- a/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/DatabaseTreeDataProviderTest.php
+++ b/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/DatabaseTreeDataProviderTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Tree\TableConfiguration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\Tree\TreeNode;
 use TYPO3\CMS\Core\Tree\TableConfiguration\DatabaseTreeDataProvider;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DatabaseTreeDataProviderTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function loadTreeDataLevelMaximumSetToZeroWorks(): void
     {
         $subject = $this->getAccessibleMock(DatabaseTreeDataProvider::class, ['getRelatedRecords', 'getStartingPoints', 'getChildrenOf'], [], '', false);
@@ -37,9 +36,7 @@ final class DatabaseTreeDataProviderTest extends UnitTestCase
         $subject->_call('loadTreeData');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadTreeDataLevelMaximumSetToOneWorks(): void
     {
         $subject = $this->getAccessibleMock(DatabaseTreeDataProvider::class, ['getRelatedRecords', 'getStartingPoints', 'getChildrenOf'], [], '', false);
diff --git a/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/TreeDataProviderFactoryTest.php b/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/TreeDataProviderFactoryTest.php
index 771cff47863f6bde9c1fc8b80d0053a297451c59..e363bbdc3c016f12ee13d984b656b1a758d8f246 100644
--- a/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/TreeDataProviderFactoryTest.php
+++ b/typo3/sysext/core/Tests/Unit/Tree/TableConfiguration/TreeDataProviderFactoryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Tree\TableConfiguration;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Core\Tests\Unit\Tree\TableConfiguration\Fixtures\TreeDataProviderFixture;
@@ -82,10 +84,8 @@ final class TreeDataProviderFactoryTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidConfigurationDataProvider
-     */
+    #[DataProvider('invalidConfigurationDataProvider')]
+    #[Test]
     public function factoryThrowsExceptionIfInvalidConfigurationIsGiven(array $tcaConfiguration, int $expectedExceptionCode): void
     {
         if (isset($tcaConfiguration['type']) && $tcaConfiguration['type'] !== 'folder' && is_array($tcaConfiguration['treeConfig'] ?? null)) {
@@ -99,9 +99,7 @@ final class TreeDataProviderFactoryTest extends UnitTestCase
         TreeDataProviderFactory::getDataProvider($tcaConfiguration, 'foo', 'bar', ['uid' => 1]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configuredDataProviderClassIsInstantiated(): void
     {
         $dataProviderMockClassName = TreeDataProviderFixture::class;
@@ -116,9 +114,7 @@ final class TreeDataProviderFactoryTest extends UnitTestCase
         self::assertInstanceOf($dataProviderMockClassName, $dataProvider);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configuredDataProviderClassIsInstantiatedWithTcaConfigurationInConstructor(): void
     {
         $dataProviderMockClassName = TreeDataProviderWithConfigurationFixture::class;
diff --git a/typo3/sysext/core/Tests/Unit/Type/BitSetTest.php b/typo3/sysext/core/Tests/Unit/Type/BitSetTest.php
index 51b82cb0586ab2ca090ea8e5e571f0f789e59306..5036d1e6e5bd3488dccb4b6e606140c66e400779 100644
--- a/typo3/sysext/core/Tests/Unit/Type/BitSetTest.php
+++ b/typo3/sysext/core/Tests/Unit/Type/BitSetTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Type;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Type\BitSet;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class BitSetTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultBitSetOnlyHasZeroByteSet(): void
     {
         $bitSet = new BitSet();
@@ -32,9 +31,7 @@ final class BitSetTest extends UnitTestCase
         self::assertFalse($bitSet->get(0b1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsInternalSet(): void
     {
         $bitSet = new BitSet(0b1 | 0b100);
@@ -43,9 +40,7 @@ final class BitSetTest extends UnitTestCase
         self::assertFalse($bitSet->get(0b10));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSetsBit(): void
     {
         $bitSet = new BitSet(0b101);
@@ -57,9 +52,7 @@ final class BitSetTest extends UnitTestCase
         self::assertTrue($bitSet->get(0b10));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueSetsBit(): void
     {
         $bitSet = new BitSet();
@@ -72,9 +65,7 @@ final class BitSetTest extends UnitTestCase
         self::assertFalse($bitSet->get(0b1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearUnsetsBit(): void
     {
         $bitSet = new BitSet(0b111);
@@ -84,9 +75,7 @@ final class BitSetTest extends UnitTestCase
         self::assertFalse($bitSet->get(0b10));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function andPerformsABinaryAnd(): void
     {
         $bitSet = new BitSet(0b101);
@@ -97,9 +86,7 @@ final class BitSetTest extends UnitTestCase
         self::assertSame('0b101', $bitSet->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function orPerformsABinaryOr(): void
     {
         $bitSet = new BitSet(0b101);
@@ -110,9 +97,7 @@ final class BitSetTest extends UnitTestCase
         self::assertSame('0b111', $bitSet->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function xorPerformsABinaryXor(): void
     {
         $bitSet = new BitSet(0b1001);
@@ -123,9 +108,7 @@ final class BitSetTest extends UnitTestCase
         self::assertSame('0b11', $bitSet->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function andNotPerformsABinaryAndNot(): void
     {
         $bitSet = new BitSet(0b111);
@@ -136,18 +119,14 @@ final class BitSetTest extends UnitTestCase
         self::assertSame('0b10', $bitSet->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function __toIntReturnsIntegerRepresentationOfBitSet(): void
     {
         $bitSet = new BitSet(0b010);
         self::assertSame(2, $bitSet->__toInt());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function __toStringReturnsBinaryStringRepresentationOfBitSet(): void
     {
         $bitSet = new BitSet(13);
diff --git a/typo3/sysext/core/Tests/Unit/Type/EnumerationTest.php b/typo3/sysext/core/Tests/Unit/Type/EnumerationTest.php
index 8d7e9182562b71ddb8d9c5831c09f3c0d9213219..a1b52f1fd37642077e1c0556234cef4b3fe7f02a 100644
--- a/typo3/sysext/core/Tests/Unit/Type/EnumerationTest.php
+++ b/typo3/sysext/core/Tests/Unit/Type/EnumerationTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Type;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Type\Fixture\Enumeration\CompleteEnumeration;
 use TYPO3\CMS\Core\Tests\Unit\Type\Fixture\Enumeration\DuplicateConstantValueEnumeration;
 use TYPO3\CMS\Core\Tests\Unit\Type\Fixture\Enumeration\InvalidConstantEnumeration;
@@ -28,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class EnumerationTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfNoConstantsAreDefined(): void
     {
         $this->expectException(InvalidEnumerationValueException::class);
@@ -39,9 +39,7 @@ final class EnumerationTest extends UnitTestCase
         new MissingConstantsEnumeration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfInvalidValueIsRequested(): void
     {
         $this->expectException(InvalidEnumerationValueException::class);
@@ -50,9 +48,7 @@ final class EnumerationTest extends UnitTestCase
         new CompleteEnumeration('bar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadValuesThrowsExceptionIfGivenValueIsNotAvailableInEnumeration(): void
     {
         $this->expectException(InvalidEnumerationValueException::class);
@@ -61,9 +57,7 @@ final class EnumerationTest extends UnitTestCase
         new MissingConstantsEnumeration(2);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadValuesThrowsExceptionIfDisallowedTypeIsDefinedAsConstant(): void
     {
         $this->expectException(InvalidEnumerationDefinitionException::class);
@@ -72,9 +66,7 @@ final class EnumerationTest extends UnitTestCase
         new InvalidConstantEnumeration(1);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadValuesThrowsExceptionIfNoDefaultConstantIsDefinedAndNoValueIsGiven(): void
     {
         $this->expectException(InvalidEnumerationValueException::class);
@@ -83,9 +75,7 @@ final class EnumerationTest extends UnitTestCase
         new MissingDefaultEnumeration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadValuesThrowsExceptionIfValueIsDefinedMultipleTimes(): void
     {
         $this->expectException(InvalidEnumerationDefinitionException::class);
@@ -123,10 +113,8 @@ final class EnumerationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider looseEnumerationValues
-     */
+    #[DataProvider('looseEnumerationValues')]
+    #[Test]
     public function doesTypeLooseComparison(string|int $testValue, string|int $expectedValue): void
     {
         $value = new CompleteEnumeration($testValue);
@@ -134,9 +122,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertEquals((string)$expectedValue, (string)$value);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConstantsReturnsArrayOfPossibleValuesWithoutDefault(): void
     {
         $expected = [
@@ -148,9 +134,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertEquals($expected, CompleteEnumeration::getConstants());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConstantsReturnsArrayOfPossibleValuesWithDefaultIfRequested(): void
     {
         $expected = [
@@ -163,9 +147,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertEquals($expected, CompleteEnumeration::getConstants(true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConstantsCanBeCalledOnInstances(): void
     {
         $enumeration = new CompleteEnumeration();
@@ -178,27 +160,21 @@ final class EnumerationTest extends UnitTestCase
         self::assertEquals($expected, $enumeration::getConstants());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toStringReturnsValueAsString(): void
     {
         $enumeration = new CompleteEnumeration();
         self::assertSame('1', $enumeration->__toString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function castReturnsObjectOfEnumerationTypeIfSimpleValueIsGiven(): void
     {
         $enumeration = CompleteEnumeration::cast(1);
         self::assertInstanceOf(CompleteEnumeration::class, $enumeration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function castReturnsObjectOfCalledEnumerationTypeIfCalledWithValueOfDifferentType(): void
     {
         $initialEnumeration = new MissingDefaultEnumeration(1);
@@ -206,9 +182,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertInstanceOf(CompleteEnumeration::class, $enumeration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function castReturnsGivenObjectIfCalledWithValueOfSameType(): void
     {
         $initialEnumeration = new CompleteEnumeration(1);
@@ -216,9 +190,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertSame($initialEnumeration, $enumeration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function castCastsStringToEnumerationWithCorrespondingValue(): void
     {
         $value = new CompleteEnumeration(CompleteEnumeration::STRING_VALUE);
@@ -226,9 +198,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertSame(CompleteEnumeration::STRING_VALUE, (string)$value);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function castCastsIntegerToEnumerationWithCorrespondingValue(): void
     {
         $value = new CompleteEnumeration(CompleteEnumeration::INTEGER_VALUE);
@@ -236,27 +206,21 @@ final class EnumerationTest extends UnitTestCase
         self::assertSame((int)(string)CompleteEnumeration::INTEGER_VALUE, (int)(string)$value);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function equalsReturnsTrueIfIntegerIsGivenThatEqualsEnumerationsIntegerValue(): void
     {
         $enumeration = new CompleteEnumeration(1);
         self::assertTrue($enumeration->equals(1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function equalsReturnsTrueIfStringIsGivenThatEqualsEnumerationsIntegerValue(): void
     {
         $enumeration = new CompleteEnumeration(1);
         self::assertTrue($enumeration->equals('1'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function equalsReturnsTrueIfEqualEnumerationIsGiven(): void
     {
         $enumerationFoo = new CompleteEnumeration(1);
@@ -264,9 +228,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertTrue($enumerationFoo->equals($enumerationBar));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function equalsReturnsTrueIfDifferentEnumerationWithSameValueIsGiven(): void
     {
         $enumerationFoo = new CompleteEnumeration(1);
@@ -274,9 +236,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertTrue($enumerationFoo->equals($enumerationBar));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function equalsReturnsFalseIfDifferentEnumerationWithDifferentValueIsGiven(): void
     {
         $enumerationFoo = new CompleteEnumeration('foo');
@@ -284,9 +244,7 @@ final class EnumerationTest extends UnitTestCase
         self::assertFalse($enumerationFoo->equals($enumerationBar));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function equalsReturnsFalseIfEnumerationOfSameTypeWithDifferentValueIsGiven(): void
     {
         $enumerationFoo = new CompleteEnumeration(1);
@@ -294,36 +252,28 @@ final class EnumerationTest extends UnitTestCase
         self::assertFalse($enumerationFoo->equals($enumerationBar));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getNameProvidesNameForAvailableConstant(): void
     {
         $result = CompleteEnumeration::getName(CompleteEnumeration::INTEGER_VALUE);
         self::assertSame('INTEGER_VALUE', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getNameReturnsEmptyStringForNotAvailableConstant(): void
     {
         $result = CompleteEnumeration::getName(42);
         self::assertSame('', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHumanReadableNameProvidesNameForAvailableConstant(): void
     {
         $result = CompleteEnumeration::getHumanReadableName(CompleteEnumeration::INTEGER_VALUE);
         self::assertSame('Integer Value', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHumanReadableNameReturnsEmptyStringForNotAvailableConstant(): void
     {
         $result = CompleteEnumeration::getName(42);
diff --git a/typo3/sysext/core/Tests/Unit/Type/File/ImageInfoTest.php b/typo3/sysext/core/Tests/Unit/Type/File/ImageInfoTest.php
index 3b151124ffe49245c28a05e080d3b477aab07a9e..c40e87461cc7bb403cae05b7f62221380cd79472 100644
--- a/typo3/sysext/core/Tests/Unit/Type/File/ImageInfoTest.php
+++ b/typo3/sysext/core/Tests/Unit/Type/File/ImageInfoTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Type\File;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Imaging\GraphicalFunctions;
@@ -27,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ImageInfoTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function classImageInfoCanBeInstantiated(): void
     {
         $className = ImageInfo::class;
@@ -37,9 +37,7 @@ final class ImageInfoTest extends UnitTestCase
         self::assertInstanceOf($className, $classInstance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function doesNotBreakOnFileWithInvalidEnding(): void
     {
         $this->resetSingletonInstances = true;
@@ -93,10 +91,8 @@ final class ImageInfoTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider doesNotBreakOnImageInfoWithInvalidSvgDataProvider
-     */
+    #[DataProvider('doesNotBreakOnImageInfoWithInvalidSvgDataProvider')]
+    #[Test]
     public function doesNotBreakOnImageInfoWithInvalidSvg(string $svg, int $width, int $height): void
     {
         $this->resetSingletonInstances = true;
@@ -138,10 +134,8 @@ final class ImageInfoTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider canDetectImageSizesDataProvider
-     */
+    #[DataProvider('canDetectImageSizesDataProvider')]
+    #[Test]
     public function canDetectImageSizes(string $file, int $width, int $height): void
     {
         $imageInfo = new ImageInfo(__DIR__ . '/../Fixture/' . $file);
diff --git a/typo3/sysext/core/Tests/Unit/Type/MapTest.php b/typo3/sysext/core/Tests/Unit/Type/MapTest.php
index 468a670f692dcab199b8b76d549e2d0e0d06e198..72c96a90831491cd5117a612eb4be779fb52f1e3 100644
--- a/typo3/sysext/core/Tests/Unit/Type/MapTest.php
+++ b/typo3/sysext/core/Tests/Unit/Type/MapTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Type;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Type\Map;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MapTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function mapIsArrayAccessible(): void
     {
         $aKey = new \stdClass();
@@ -42,9 +41,7 @@ final class MapTest extends UnitTestCase
         self::assertSame($bValue, $map[$bKey]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mapKeyCanBeUnset(): void
     {
         $aKey = new \stdClass();
@@ -62,9 +59,7 @@ final class MapTest extends UnitTestCase
         self::assertFalse(isset($map[$bKey]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mapCanBeIterated(): void
     {
         $aKey = new \stdClass();
@@ -88,9 +83,7 @@ final class MapTest extends UnitTestCase
         self::assertSame($expectation, $entries);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mapIsCreatedFromEntries(): void
     {
         $aKey = new \stdClass();
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/AST/AstBuilderInterfaceTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/AST/AstBuilderInterfaceTest.php
index c2929f7191df8ff7706625beb7cc60233c2fbdf0..11a42b36293d546b8c2d62418efe8a9743472c3a 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/AST/AstBuilderInterfaceTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/AST/AstBuilderInterfaceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\AST;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Core\TypoScript\AST\AstBuilder;
 use TYPO3\CMS\Core\TypoScript\AST\CommentAwareAstBuilder;
@@ -1276,10 +1278,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildDataProvider
-     */
+    #[DataProvider('buildDataProvider')]
+    #[Test]
     public function build(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1288,10 +1288,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     * @dataProvider buildDataProvider
-     */
+    #[DataProvider('buildDataProvider')]
+    #[Test]
     public function buildCreatesSameAstWhenUnserialized(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1300,10 +1298,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, unserialize(serialize($ast)));
     }
 
-    /**
-     * @test
-     * @dataProvider buildDataProvider
-     */
+    #[DataProvider('buildDataProvider')]
+    #[Test]
     public function buildCommentAware(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1312,10 +1308,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     * @dataProvider buildDataProvider
-     */
+    #[DataProvider('buildDataProvider')]
+    #[Test]
     public function buildCompatArray(string $source, RootNode $_, array $expectedArray): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1324,10 +1318,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedArray, $ast->toArray());
     }
 
-    /**
-     * @test
-     * @dataProvider buildDataProvider
-     */
+    #[DataProvider('buildDataProvider')]
+    #[Test]
     public function buildCompatArrayCommentAware(string $source, RootNode $_, array $expectedArray): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1501,10 +1493,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildWithPreviousValueDataProvider
-     */
+    #[DataProvider('buildWithPreviousValueDataProvider')]
+    #[Test]
     public function buildWithPreviousValue(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1513,10 +1503,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     * @dataProvider buildWithPreviousValueDataProvider
-     */
+    #[DataProvider('buildWithPreviousValueDataProvider')]
+    #[Test]
     public function buildWithPreviousValueCreatesSameAstWhenUnserialized(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1525,10 +1513,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, unserialize(serialize($ast)));
     }
 
-    /**
-     * @test
-     * @dataProvider buildWithPreviousValueDataProvider
-     */
+    #[DataProvider('buildWithPreviousValueDataProvider')]
+    #[Test]
     public function buildWithPreviousValueCommentAware(string $source, RootNode $_, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1841,10 +1827,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildReferenceDataProvider
-     */
+    #[DataProvider('buildReferenceDataProvider')]
+    #[Test]
     public function buildReference(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1853,10 +1837,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     * @dataProvider buildReferenceDataProvider
-     */
+    #[DataProvider('buildReferenceDataProvider')]
+    #[Test]
     public function buildReferenceCreatesSameAstWhenUnserialized(string $source, RootNode $expectedAst): void
     {
         $this->registerComparator(new IdentifierTokenWithoutLineAndColumnComparator());
@@ -1866,10 +1848,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, unserialize(serialize($ast)));
     }
 
-    /**
-     * @test
-     * @dataProvider buildReferenceDataProvider
-     */
+    #[DataProvider('buildReferenceDataProvider')]
+    #[Test]
     public function buildReferenceCommentAware(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1878,10 +1858,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     * @dataProvider buildReferenceDataProvider
-     */
+    #[DataProvider('buildReferenceDataProvider')]
+    #[Test]
     public function buildReferenceArray(string $source, RootNode $_, array $expectedArray): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -1890,10 +1868,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedArray, $ast->toArray());
     }
 
-    /**
-     * @test
-     * @dataProvider buildReferenceDataProvider
-     */
+    #[DataProvider('buildReferenceDataProvider')]
+    #[Test]
     public function buildReferenceArrayCommentAware(string $source, RootNode $_, array $expectedArray): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -2023,10 +1999,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildConstantDataProvider
-     */
+    #[DataProvider('buildConstantDataProvider')]
+    #[Test]
     public function buildConstant(string $source, array $constants, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -2035,10 +2009,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     * @dataProvider buildConstantDataProvider
-     */
+    #[DataProvider('buildConstantDataProvider')]
+    #[Test]
     public function buildConstantCreatesSameAstWhenUnserialized(string $source, array $constants, RootNode $expectedAst): void
     {
         $this->registerComparator(new AbstractNodeWithoutOriginalValueTokenStreamIdentifierComparator());
@@ -2048,10 +2020,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, unserialize(serialize($ast)));
     }
 
-    /**
-     * @test
-     * @dataProvider buildConstantDataProvider
-     */
+    #[DataProvider('buildConstantDataProvider')]
+    #[Test]
     public function buildConstantCommentAware(string $source, array $constants, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -2060,10 +2030,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     * @dataProvider buildConstantDataProvider
-     */
+    #[DataProvider('buildConstantDataProvider')]
+    #[Test]
     public function buildConstantCompatArray(string $source, array $constants, RootNode $_, array $expectedArray): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -2072,10 +2040,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedArray, $ast->toArray());
     }
 
-    /**
-     * @test
-     * @dataProvider buildConstantDataProvider
-     */
+    #[DataProvider('buildConstantDataProvider')]
+    #[Test]
     public function buildConstantCompatArrayCommentAware(string $source, array $constants, RootNode $_, array $expectedArray): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -2084,9 +2050,7 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedArray, $ast->toArray());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExtendsGivenAst(): void
     {
         $fooNode = new ChildNode('foo');
@@ -2114,9 +2078,7 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedArray, $resultAst->toArray());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExtendsGivenAstCommentAware(): void
     {
         $fooNode = new ChildNode('foo');
@@ -2157,10 +2119,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider functionSortListThrowsSortingNonNumericListNumericDataProvider
-     */
+    #[DataProvider('functionSortListThrowsSortingNonNumericListNumericDataProvider')]
+    #[Test]
     public function functionSortListThrowsSortingNonNumericListNumeric(string $source): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -2170,10 +2130,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         (new AstBuilder($noopEventDispatcher))->build($tokens, new RootNode());
     }
 
-    /**
-     * @test
-     * @dataProvider functionSortListThrowsSortingNonNumericListNumericDataProvider
-     */
+    #[DataProvider('functionSortListThrowsSortingNonNumericListNumericDataProvider')]
+    #[Test]
     public function functionSortListThrowsSortingNonNumericListNumericCommentAware(string $source): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -2255,10 +2213,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider functionGetEnvDataProvider
-     */
+    #[DataProvider('functionGetEnvDataProvider')]
+    #[Test]
     public function functionGetEnv(?string $envVarName, ?string $envVarValue, $source, RootNode $expectedAst): void
     {
         if ($envVarName) {
@@ -2273,10 +2229,8 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     * @dataProvider functionGetEnvDataProvider
-     */
+    #[DataProvider('functionGetEnvDataProvider')]
+    #[Test]
     public function functionGetEnvCommentAware(?string $envVarName, ?string $envVarValue, $source, RootNode $expectedAst): void
     {
         if ($envVarName) {
@@ -2380,20 +2334,16 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider flattenDataProvider
-     */
+    #[DataProvider('flattenDataProvider')]
+    #[Test]
     public function flatten(string $typoscript, array $expected)
     {
         $ast = (new AstBuilder(new NoopEventDispatcher()))->build((new LosslessTokenizer())->tokenize($typoscript), new RootNode());
         self::assertSame($expected, $ast->flatten());
     }
 
-    /**
-     * @test
-     * @dataProvider flattenDataProvider
-     */
+    #[DataProvider('flattenDataProvider')]
+    #[Test]
     public function flattenCommentAware(string $typoscript, array $expected)
     {
         $ast = (new CommentAwareAstBuilder(new NoopEventDispatcher()))->build((new LosslessTokenizer())->tokenize($typoscript), new RootNode());
@@ -2762,10 +2712,9 @@ final class AstBuilderInterfaceTest extends UnitTestCase
 
     /**
      * This is for CommentAwareAstBuilder only, AstBuilder ignores comments.
-     *
-     * @test
-     * @dataProvider buildWithCommentsDataProvider
      */
+    #[DataProvider('buildWithCommentsDataProvider')]
+    #[Test]
     public function buildWithComments(string $source, RootNode $expectedAst): void
     {
         $noopEventDispatcher = new NoopEventDispatcher();
@@ -2774,9 +2723,7 @@ final class AstBuilderInterfaceTest extends UnitTestCase
         self::assertEquals($expectedAst, $ast);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildWithCommentsSetsPreviousValue(): void
     {
         $source = "foo = fooValue1\n" .
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/AST/CurrentObjectPath/CurrentObjectPathTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/AST/CurrentObjectPath/CurrentObjectPathTest.php
index a140702411188c0d179042b289cca4f1d56c159a..be4adcbf179bc87113725c87ffdf9a274ca66b92 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/AST/CurrentObjectPath/CurrentObjectPathTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/AST/CurrentObjectPath/CurrentObjectPathTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\AST\CurrentObjectPath;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\AST\CurrentObjectPath\CurrentObjectPath;
 use TYPO3\CMS\Core\TypoScript\AST\Node\ChildNode;
 use TYPO3\CMS\Core\TypoScript\AST\Node\RootNode;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CurrentObjectPathTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllReturnsPathArray()
     {
         $firstNode = new ChildNode('foo');
@@ -36,9 +35,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame([$firstNode, $secondNode], $currentObjectPath->getAll());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathAsStringReturnsPath()
     {
         $currentObjectPath = new CurrentObjectPath(new RootNode());
@@ -47,9 +44,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame('foo.bar', $currentObjectPath->getPathAsString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathAsStringReturnsQuotedPath()
     {
         $currentObjectPath = new CurrentObjectPath(new ChildNode('foo'));
@@ -57,9 +52,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame('foo.bar\.baz', $currentObjectPath->getPathAsString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathAsStringReturnsPathWithZero()
     {
         $currentObjectPath = new CurrentObjectPath(new ChildNode('foo'));
@@ -68,9 +61,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame('foo.0.bar', $currentObjectPath->getPathAsString());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPathAsStringThrowsWithNodeNameEmptyString()
     {
         $this->expectExceptionCode(\RuntimeException::class);
@@ -80,9 +71,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         $currentObjectPath->getPathAsString();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFirstReturnsFirstNode()
     {
         $firstNode = new ChildNode('foo');
@@ -94,9 +83,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame($firstNode, $currentObjectPath->getFirst());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLastReturnsLastNode()
     {
         $firstNode = new ChildNode('foo');
@@ -108,9 +95,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame($thirdNode, $currentObjectPath->getLast());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSecondLastReturnsSecondLastNode()
     {
         $firstNode = new ChildNode('foo');
@@ -122,9 +107,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame($secondNode, $currentObjectPath->getSecondLast());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSecondLastReturnsFirstIfThereIsOnlyOne()
     {
         $firstNode = new ChildNode('foo');
@@ -132,9 +115,7 @@ final class CurrentObjectPathTest extends UnitTestCase
         self::assertSame($firstNode, $currentObjectPath->getSecondLast());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeLastRemovesLastNode()
     {
         $firstNode = new ChildNode('foo');
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ChildNodeTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ChildNodeTest.php
index 8ac189d6da025118dc8ee2b91fd62139aaf3683f..333edab79c50ab308451ded3e26e7603b3cb1dac 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ChildNodeTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ChildNodeTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\AST\Node;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\AST\Node\ChildNode;
 use TYPO3\CMS\Core\TypoScript\AST\Node\ReferenceChildNode;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ChildNodeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierThrowsExceptionIfNotIdentifierHasBeenSet(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -33,9 +32,7 @@ final class ChildNodeTest extends UnitTestCase
         (new ChildNode('someName'))->getIdentifier();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierCreatesIdentifierString(): void
     {
         $node = new ChildNode('someName');
@@ -43,9 +40,7 @@ final class ChildNodeTest extends UnitTestCase
         self::assertIsString($node->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTriggersIdentifierCalculationForChild(): void
     {
         $node = new ChildNode('someName');
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ReferenceChildNodeTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ReferenceChildNodeTest.php
index ff99e3b60285ab30543cdf11e7f3edb66ed01285..44e4db32a17c2a738f044a1ff16981ec8791488b 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ReferenceChildNodeTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/ReferenceChildNodeTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\AST\Node;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\AST\Node\ChildNode;
 use TYPO3\CMS\Core\TypoScript\AST\Node\ReferenceChildNode;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ReferenceChildNodeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierThrowsExceptionIfNotIdentifierHasBeenSet(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -33,9 +32,7 @@ final class ReferenceChildNodeTest extends UnitTestCase
         (new ReferenceChildNode('someName'))->getIdentifier();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierCreatesIdentifierString(): void
     {
         $rootNode = new ReferenceChildNode('someName');
@@ -43,9 +40,7 @@ final class ReferenceChildNodeTest extends UnitTestCase
         self::assertIsString($rootNode->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTriggersIdentifierCalculationForChild(): void
     {
         $node = new ReferenceChildNode('someName');
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/RootNodeTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/RootNodeTest.php
index 560c754248424d4bfeda5bd1f869d97d21f9d4cc..ed747c4e095e2b40cf2814dbcdb4441a05d2e8b4 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/RootNodeTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Node/RootNodeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\AST\Node;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\AST\Node\ChildNode;
 use TYPO3\CMS\Core\TypoScript\AST\Node\ReferenceChildNode;
 use TYPO3\CMS\Core\TypoScript\AST\Node\RootNode;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RootNodeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierThrowsExceptionIfNotIdentifierHasBeenSet(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -34,9 +33,7 @@ final class RootNodeTest extends UnitTestCase
         (new RootNode())->getIdentifier();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierCreatesIdentifierString(): void
     {
         $rootNode = new RootNode();
@@ -44,9 +41,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertSame('5c638577a9858bb2', $rootNode->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTriggersIdentifierCalculationForChild(): void
     {
         $rootNode = new RootNode();
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Traverser/AstTraverserTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Traverser/AstTraverserTest.php
index 486f64492ccf6498342ad2506e72d509aa4beca6..8c1b3a670c26641127d17d60cf1b96716fdc2bca 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/AST/Traverser/AstTraverserTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/AST/Traverser/AstTraverserTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\AST\Traverser;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\AST\Node\RootNode;
 use TYPO3\CMS\Core\TypoScript\AST\Traverser\AstTraverser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AstTraverserTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function traverseThrowsExceptionWithVisitorNotImplementingInterface(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionElseIncludeTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionElseIncludeTest.php
index 92eca592fd4753379f44fdcee80b33eed808121a..b849018e46bcbb08db78d3dc3886bff7467b30e6 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionElseIncludeTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionElseIncludeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\IncludeTree\IncludeNode;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\ConditionElseInclude;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConditionElseIncludeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setConditionTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
@@ -34,9 +33,7 @@ final class ConditionElseIncludeTest extends UnitTestCase
         (new ConditionElseInclude())->setConditionToken(new Token(TokenType::T_BLANK, ''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOriginalConditionTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTest.php
index 566dc6e3adbbae40460962d39fd346182a5d27af..ef084e9d5539bf2c3646f78ddc12ab57803462cc 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\IncludeTree\IncludeNode;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\ConditionInclude;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConditionIncludeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setConditionTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
@@ -34,9 +33,7 @@ final class ConditionIncludeTest extends UnitTestCase
         (new ConditionInclude())->setConditionToken(new Token(TokenType::T_BLANK, ''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOriginalConditionTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTyposcriptIncludeTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTyposcriptIncludeTest.php
index 475b6adda2b760bd2861782076480978dce61947..10cbda5617127d0358c4cdd66b1bb408fdb26a73 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTyposcriptIncludeTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/ConditionIncludeTyposcriptIncludeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\IncludeTree\IncludeNode;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\ConditionIncludeTyposcriptInclude;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConditionIncludeTyposcriptIncludeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setConditionTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
@@ -34,9 +33,7 @@ final class ConditionIncludeTyposcriptIncludeTest extends UnitTestCase
         (new ConditionIncludeTyposcriptInclude())->setConditionToken(new Token(TokenType::T_BLANK, ''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOriginalConditionTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/RootNodeTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/RootNodeTest.php
index fda3be99d563aad9d006737633b590fbf1e53319..292137eb2f19abf6986ccd87efffd65605e01484 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/RootNodeTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/IncludeNode/RootNodeTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\IncludeTree\IncludeNode;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\RootInclude;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\StringInclude;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RootNodeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierThrowsExceptionIfNotIdentifierHasBeenSet(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -33,9 +32,7 @@ final class RootNodeTest extends UnitTestCase
         (new RootInclude())->getIdentifier();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierCreatesIdentifierString(): void
     {
         $rootNode = new RootInclude();
@@ -43,9 +40,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertSame('5c638577a9858bb2', $rootNode->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTriggersIdentifierCalculationForChild(): void
     {
         $rootNode = new RootInclude();
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/ConditionVerdictAwareIncludeTreeTraverserTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/ConditionVerdictAwareIncludeTreeTraverserTest.php
index bef5c91a0df98f370bdaf5f83e82605ca8663e87..8d59dfe71b396ca7e0fc6c14483a0cc600d65bed 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/ConditionVerdictAwareIncludeTreeTraverserTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/ConditionVerdictAwareIncludeTreeTraverserTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\IncludeTree\Traverser;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\RootInclude;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\Traverser\ConditionVerdictAwareIncludeTreeTraverser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConditionVerdictAwareIncludeTreeTraverserTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function traverseThrowsExceptionWithVisitorNotImplementingInterface(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/IncludeTreeTraverserTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/IncludeTreeTraverserTest.php
index ba7ae0fbd0b2d80c20cc09628fbeab091d909583..50aea3abeac6eb87a9c5813d20689d156999c80a 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/IncludeTreeTraverserTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/IncludeTree/Traverser/IncludeTreeTraverserTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\IncludeTree\Traverser;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\RootInclude;
 use TYPO3\CMS\Core\TypoScript\IncludeTree\Traverser\IncludeTreeTraverser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IncludeTreeTraverserTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function traverseThrowsExceptionWithVisitorNotImplementingInterface(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ConditionLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ConditionLineTest.php
index 27e3f88e672ad24fe5237f5e3765446f4b066d37..74f64bae4cef5c0174cb1c2a12662a6f1c6f2938 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ConditionLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ConditionLineTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\ConditionLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConditionLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierAssignmentLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierAssignmentLineTest.php
index 8e3ade9dd6392f15ced7221b609fdd8c5c02cabd..83394c074af8628ee608f3d5c2da27ba869439d2 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierAssignmentLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierAssignmentLineTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\IdentifierAssignmentLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\IdentifierTokenStream;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IdentifierAssignmentLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
@@ -33,9 +32,7 @@ final class IdentifierAssignmentLineTest extends UnitTestCase
         (new IdentifierAssignmentLine())->setIdentifierTokenStream(new IdentifierTokenStream());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierBlockOpenLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierBlockOpenLineTest.php
index 9d154faf0f24e641d1833b24989c5f9adb17eed5..d0e9db98a9f25275d689f346155b878129d5b7e2 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierBlockOpenLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierBlockOpenLineTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\IdentifierBlockOpenLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\IdentifierTokenStream;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IdentifierBlockOpenLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierCopyLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierCopyLineTest.php
index 29db4c1b8ce19fa1016df3cca3622f2463417d20..9e04fc4dbc1da7c9beebc2ce9de061857aeceaa2 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierCopyLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierCopyLineTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\IdentifierCopyLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\IdentifierTokenStream;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IdentifierCopyLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
@@ -33,9 +32,7 @@ final class IdentifierCopyLineTest extends UnitTestCase
         (new IdentifierCopyLine())->setIdentifierTokenStream(new IdentifierTokenStream());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierFunctionLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierFunctionLineTest.php
index 8a30c16754ceb087f8fba597a3776820695c1084..8c9e7cfdc76fa2e17209bc06cce1aa40e592a195 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierFunctionLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierFunctionLineTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\IdentifierFunctionLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\IdentifierTokenStream;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IdentifierFunctionLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
@@ -35,9 +34,7 @@ final class IdentifierFunctionLineTest extends UnitTestCase
         (new IdentifierFunctionLine())->setIdentifierTokenStream(new IdentifierTokenStream());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setFunctionNameTokenThrowsIfTokenIsNotOfTypeFunction(): void
     {
         $this->expectException(\LogicException::class);
@@ -45,9 +42,7 @@ final class IdentifierFunctionLineTest extends UnitTestCase
         (new IdentifierFunctionLine())->setFunctionNameToken(new Token(TokenType::T_BLANK, ''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setFunctionValueTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierReferenceLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierReferenceLineTest.php
index 1ce800ec29fdcd77e70d41f01c3fb37d00a9248d..097b0092f7c9a35f19ef697eac0968b81193ecb6 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierReferenceLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierReferenceLineTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\IdentifierReferenceLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\IdentifierTokenStream;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IdentifierReferenceLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
@@ -33,9 +32,7 @@ final class IdentifierReferenceLineTest extends UnitTestCase
         (new IdentifierReferenceLine())->setIdentifierTokenStream(new IdentifierTokenStream());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierUnsetLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierUnsetLineTest.php
index 1509f4ab0bdbe1ab1fb765e15b96f796e29847a5..01c14ac01c874052e2c383f4b4c5661cbef3701d 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierUnsetLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/IdentifierUnsetLineTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\IdentifierUnsetLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\IdentifierTokenStream;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IdentifierUnsetLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setIdentifierTokenStreamThrowsIfStreamIsEmpty(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportLineTest.php
index c7fec6a9c824a75407f3b72a93aa22382f36dafc..29c28d0907774d85ae532164b69b9090d1012849 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportLineTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\ImportLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ImportLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setFunctionValueTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportOldLineTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportOldLineTest.php
index 6044fb84429db0ce1b00ab24a6b31dee53002ca9..8290362325ea5eb065e37ca697bd17adac75e89c 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportOldLineTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Line/ImportOldLineTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Line;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\ImportOldLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ImportOldLineTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setFunctionValueTokenThrowsIfTokenIsNotOfTypeValue(): void
     {
         $this->expectException(\LogicException::class);
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/IdentifierTokenStreamTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/IdentifierTokenStreamTest.php
index 041514c0766d50ccccbb4c431c971741a1337ea0..f844393df98a3c4b827d41da4ff2ab7b1208ec7d 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/IdentifierTokenStreamTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/IdentifierTokenStreamTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Token;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\IdentifierTokenStream;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class IdentifierTokenStreamTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function appendThrowsExceptionIfTokenIsNotOfTypeIdentifier(): void
     {
         $this->expectException(\LogicException::class);
@@ -35,26 +34,20 @@ final class IdentifierTokenStreamTest extends UnitTestCase
         (new IdentifierTokenStream())->append($token);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canAppendIdentifierToken(): void
     {
         $token = new Token(TokenType::T_IDENTIFIER, '', 0, 0);
         (new IdentifierTokenStream())->append($token);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonRelativeStreamIsNotRelative(): void
     {
         self::assertFalse((new IdentifierTokenStream())->isRelative());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function relativeStreamIsRelative(): void
     {
         $tokenStream = (new IdentifierTokenStream());
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenStreamTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenStreamTest.php
index 640d7c38f970326b7eae6eee031273d777546758..e11e9f9f63e93ff83f436d6658f45f737850677f 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenStreamTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenStreamTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Token;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenStream;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TokenStreamTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getNextReturnsToken(): void
     {
         $subject = new TokenStream();
@@ -35,9 +34,7 @@ final class TokenStreamTest extends UnitTestCase
         self::assertSame($subject->getNext(), $token);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getNextReturnsNullIfThereIsNoToken(): void
     {
         $subject = new TokenStream();
@@ -47,9 +44,7 @@ final class TokenStreamTest extends UnitTestCase
         self::assertNull($subject->getNext());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function peekNextReturnsTokenAndDoesNotRaisePointer(): void
     {
         $subject = new TokenStream();
@@ -62,9 +57,7 @@ final class TokenStreamTest extends UnitTestCase
         self::assertSame($subject->peekNext(), $newLineToken);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function peekNextReturnsNullIfThereIsNoNextToken(): void
     {
         $subject = new TokenStream();
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenTest.php
index 0858314e9ee8988ed8a73c8e4be27ebf7b32a808..b03343afd8e64c77612d27e3da1a3cd6b0dda498 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/Token/TokenTest.php
@@ -17,47 +17,38 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer\Token;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TokenTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getTypeReturnsType(): void
     {
         self::assertSame(TokenType::T_VALUE, (new Token(TokenType::T_VALUE, '', 0, 0))->getType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getValueReturnsValue(): void
     {
         self::assertSame('foo', (new Token(TokenType::T_VALUE, 'foo', 0, 0))->getValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLineReturnsLine(): void
     {
         self::assertSame(42, (new Token(TokenType::T_VALUE, '', 42, 0))->getLine());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getColumnReturnsColumn(): void
     {
         self::assertSame(42, (new Token(TokenType::T_VALUE, '', 0, 42))->getColumn());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function stringCastReturnsValue(): void
     {
         self::assertSame('foo', (string)(new Token(TokenType::T_VALUE, 'foo', 0, 0)));
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/TokenizerInterfaceTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/TokenizerInterfaceTest.php
index ffef55851e231529aa9ff9055d4d9a832bc40064..4e1a884af4c4e4b0b5c1495167b0d6641128cd86 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/TokenizerInterfaceTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/Tokenizer/TokenizerInterfaceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript\Tokenizer;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\BlockCloseLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\CommentLine;
 use TYPO3\CMS\Core\TypoScript\Tokenizer\Line\ConditionElseLine;
@@ -7998,30 +8000,24 @@ final class TokenizerInterfaceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider tokenizeStringDataProvider
-     */
+    #[DataProvider('tokenizeStringDataProvider')]
+    #[Test]
     public function tokenize(string $source, LineStream $expected): void
     {
         $tokens = (new LosslessTokenizer())->tokenize($source);
         self::assertEquals($expected, $tokens);
     }
 
-    /**
-     * @test
-     * @dataProvider tokenizeStringDataProvider
-     */
+    #[DataProvider('tokenizeStringDataProvider')]
+    #[Test]
     public function tokenizeLossy(string $source, LineStream $_, LineStream $expected): void
     {
         $tokens = (new LossyTokenizer())->tokenize($source);
         self::assertEquals($expected, $tokens);
     }
 
-    /**
-     * @test
-     * @dataProvider tokenizeStringDataProvider
-     */
+    #[DataProvider('tokenizeStringDataProvider')]
+    #[Test]
     public function untokenize(string $source): void
     {
         $tokenizer = new LosslessTokenizer();
diff --git a/typo3/sysext/core/Tests/Unit/TypoScript/TypoScriptServiceTest.php b/typo3/sysext/core/Tests/Unit/TypoScript/TypoScriptServiceTest.php
index 8793a68518c1cedcc6e996f4443df937db69f00b..f3802ab1ab4c3895b66675d5507233064736f124 100644
--- a/typo3/sysext/core/Tests/Unit/TypoScript/TypoScriptServiceTest.php
+++ b/typo3/sysext/core/Tests/Unit/TypoScript/TypoScriptServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\TypoScript;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\TypoScript\TypoScriptService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -146,11 +148,11 @@ final class TypoScriptServiceTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider convertTypoScriptArrayToPlainArrayTestdata
      * @param mixed $typoScriptSettings
      * @param mixed $expectedSettings
      */
+    #[DataProvider('convertTypoScriptArrayToPlainArrayTestdata')]
+    #[Test]
     public function convertTypoScriptArrayToPlainArrayRemovesTrailingDotsWithChangedOrderInTheTypoScriptArray(
         $typoScriptSettings,
         $expectedSettings
@@ -280,11 +282,11 @@ final class TypoScriptServiceTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider convertPlainArrayToTypoScriptArrayTestdata
      * @param mixed $extbaseTS
      * @param mixed $classic
      */
+    #[DataProvider('convertPlainArrayToTypoScriptArrayTestdata')]
+    #[Test]
     public function convertPlainArrayToTypoScriptArray($extbaseTS, $classic): void
     {
         $typoScriptService = new TypoScriptService();
@@ -401,10 +403,10 @@ final class TypoScriptServiceTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider explodeConfigurationForOptionSplitProvider
      * @see https://docs.typo3.org/typo3cms/TyposcriptReference/ObjectsAndProperties/Index.html#objects-optionsplit
      */
+    #[DataProvider('explodeConfigurationForOptionSplitProvider')]
+    #[Test]
     public function explodeConfigurationForOptionSplitTest($configuration, $splitCount, $expected): void
     {
         $serviceObject = new TypoScriptService();
diff --git a/typo3/sysext/core/Tests/Unit/Utility/ArrayUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/ArrayUtilityTest.php
index 9e7dd52824697a209d3bdf84e751090818e11e7a..cf9ddea1e563c8ac5a4f9e2ff558cca2389c966b 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/ArrayUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/ArrayUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Utility\Fixtures\ArrayUtilityFilterRecursiveCallbackFixture;
 use TYPO3\CMS\Core\Utility\ArrayUtility;
 use TYPO3\CMS\Core\Utility\Exception\MissingArrayPathException;
@@ -161,12 +163,12 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider filterByValueRecursive
      * @param array $needle
      * @param array $haystack
      * @param array $expectedResult
      */
+    #[DataProvider('filterByValueRecursive')]
+    #[Test]
     public function filterByValueRecursiveCorrectlyFiltersArray($needle, $haystack, $expectedResult): void
     {
         self::assertEquals(
@@ -175,9 +177,7 @@ final class ArrayUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function filterByValueRecursiveMatchesReferencesToSameObject(): void
     {
         $instance = new \stdClass();
@@ -187,9 +187,7 @@ final class ArrayUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function filterByValueRecursiveDoesNotMatchDifferentInstancesOfSameClass(): void
     {
         self::assertEquals(
@@ -201,33 +199,25 @@ final class ArrayUtilityTest extends UnitTestCase
     ///////////////////////
     // Tests concerning isValidPath
     ///////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidPathReturnsTrueIfPathExistsStringVersion(): void
     {
         self::assertTrue(ArrayUtility::isValidPath(['foo' => 'bar'], 'foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidPathReturnsFalseIfPathDoesNotExistStringVersion(): void
     {
         self::assertFalse(ArrayUtility::isValidPath(['foo' => 'bar'], 'bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidPathReturnsTrueIfPathExistsArrayVersion(): void
     {
         self::assertTrue(ArrayUtility::isValidPath(['foo' => 'bar'], ['foo']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidPathReturnsFalseIfPathDoesNotExistArrayVersion(): void
     {
         self::assertFalse(ArrayUtility::isValidPath(['foo' => 'bar'], ['bar']));
@@ -236,10 +226,7 @@ final class ArrayUtilityTest extends UnitTestCase
     ///////////////////////
     // Tests concerning getValueByPath
     ///////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function getValueByPathThrowsExceptionIfPathIsEmpty(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -248,17 +235,13 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::getValueByPath([], '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getValueByPathReturnsFirstIndexIfPathIsZero(): void
     {
         self::assertSame('foo', ArrayUtility::getValueByPath(['foo'], '0'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getValueByPathReturnsFirstIndexIfPathSegmentIsZero(): void
     {
         self::assertSame('bar', ArrayUtility::getValueByPath(['foo' => ['bar']], 'foo/0'));
@@ -333,10 +316,10 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getValueByPathInvalidPathDataProvider
      * @param string $path
      */
+    #[DataProvider('getValueByPathInvalidPathDataProvider')]
+    #[Test]
     public function getValueByPathThrowsExceptionIfPathNotExists(array $array, $path): void
     {
         $this->expectException(\RuntimeException::class);
@@ -344,10 +327,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::getValueByPath($array, $path);
     }
 
-    /**
-     * @test
-     * @dataProvider getValueByPathInvalidPathDataProvider
-     */
+    #[DataProvider('getValueByPathInvalidPathDataProvider')]
+    #[Test]
     public function getValueByPathThrowsSpecificExceptionIfPathNotExists(array $array, string $path): void
     {
         $this->expectException(MissingArrayPathException::class);
@@ -462,19 +443,17 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getValueByPathValidDataProvider
      * @param string $path
      * @param mixed $expectedResult
      */
+    #[DataProvider('getValueByPathValidDataProvider')]
+    #[Test]
     public function getValueByPathGetsCorrectValue(array $array, $path, $expectedResult): void
     {
         self::assertEquals($expectedResult, ArrayUtility::getValueByPath($array, $path));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getValueByPathAcceptsDifferentDelimiter(): void
     {
         $input = [
@@ -497,9 +476,7 @@ final class ArrayUtilityTest extends UnitTestCase
     ///////////////////////
     // Tests concerning setValueByPath
     ///////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueByPathThrowsExceptionIfPathIsEmpty(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -508,9 +485,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::setValueByPath([], '', null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueByPathThrowsExceptionIfPathSegmentIsEmpty(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -519,17 +494,13 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::setValueByPath(['foo' => 'bar'], '/foo', 'value');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueByPathCanUseZeroAsPathSegment(): void
     {
         self::assertSame(['foo' => ['value']], ArrayUtility::setValueByPath(['foo' => []], 'foo/0', 'value'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueByPathCanUseZeroAsPath(): void
     {
         self::assertSame(['value', 'bar'], ArrayUtility::setValueByPath(['foo', 'bar'], '0', 'value'));
@@ -747,12 +718,12 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider setValueByPathSetsCorrectValueDataProvider
      * @param string $path
      * @param string $value
      * @param array $expectedResult
      */
+    #[DataProvider('setValueByPathSetsCorrectValueDataProvider')]
+    #[Test]
     public function setValueByPathSetsCorrectValue(array $array, $path, $value, $expectedResult): void
     {
         self::assertEquals(
@@ -762,12 +733,9 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**********************
-    /* Tests concerning removeByPath
-     ***********************/
-
-    /**
-     * @test
-     */
+       /* Tests concerning removeByPath
+        ***********************/
+    #[Test]
     public function removeByPathThrowsExceptionIfPathIsEmpty(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -776,9 +744,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::removeByPath([], '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByPathThrowsExceptionWithEmptyPathSegment(): void
     {
         $inputArray = [
@@ -793,9 +759,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::removeByPath($inputArray, 'foo//bar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByPathRemovesFirstIndexWithZeroAsPathSegment(): void
     {
         $inputArray = [
@@ -805,9 +769,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame(['foo' => []], ArrayUtility::removeByPath($inputArray, 'foo/0'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByPathRemovesFirstIndexWithZeroAsPath(): void
     {
         $inputArray = ['bar'];
@@ -815,9 +777,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame([], ArrayUtility::removeByPath($inputArray, '0'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByPathThrowsExceptionIfPathDoesNotExistInArray(): void
     {
         $inputArray = [
@@ -832,9 +792,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::removeByPath($inputArray, 'foo/baz');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByPathThrowsSpecificExceptionIfPathDoesNotExistInArray(): void
     {
         $inputArray = [
@@ -849,9 +807,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::removeByPath($inputArray, 'foo/baz');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeByPathAcceptsGivenDelimiter(): void
     {
         $inputArray = [
@@ -921,11 +877,11 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider removeByPathRemovesCorrectPathDataProvider
      * @param string $path
      * @param array $expectedResult
      */
+    #[DataProvider('removeByPathRemovesCorrectPathDataProvider')]
+    #[Test]
     public function removeByPathRemovesCorrectPath(array $array, $path, $expectedResult): void
     {
         self::assertEquals(
@@ -937,9 +893,7 @@ final class ArrayUtilityTest extends UnitTestCase
     ///////////////////////
     // Tests concerning sortByKeyRecursive
     ///////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function sortByKeyRecursiveCheckIfSortingIsCorrect(): void
     {
         $unsortedArray = [
@@ -1092,21 +1046,19 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider sortArraysByKeyCheckIfSortingIsCorrectDataProvider
      * @param string $key
      * @param bool $ascending
      * @param array $expectedResult
      */
+    #[DataProvider('sortArraysByKeyCheckIfSortingIsCorrectDataProvider')]
+    #[Test]
     public function sortArraysByKeyCheckIfSortingIsCorrect(array $array, $key, $ascending, $expectedResult): void
     {
         $sortedArray = ArrayUtility::sortArraysByKey($array, $key, $ascending);
         self::assertSame($expectedResult, $sortedArray);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sortArraysByKeyThrowsExceptionForNonExistingKey(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -1118,9 +1070,7 @@ final class ArrayUtilityTest extends UnitTestCase
     ///////////////////////
     // Tests concerning arrayExport
     ///////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayExportReturnsFormattedMultidimensionalArray(): void
     {
         $array = [
@@ -1157,9 +1107,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::arrayExport($array));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayExportThrowsExceptionIfObjectShouldBeExported(): void
     {
         $array = [
@@ -1174,9 +1122,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::arrayExport($array);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayExportReturnsNumericArrayKeys(): void
     {
         $array = [
@@ -1193,9 +1139,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::arrayExport($array));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayExportReturnsNoKeyIndexForConsecutiveCountedArrays(): void
     {
         $array = [
@@ -1212,9 +1156,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::arrayExport($array));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayExportReturnsKeyIndexForNonConsecutiveCountedArrays(): void
     {
         $array = [
@@ -1351,10 +1293,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider flattenCalculatesExpectedResultDataProvider
-     */
+    #[DataProvider('flattenCalculatesExpectedResultDataProvider')]
+    #[Test]
     public function flattenCalculatesExpectedResult(array $array, array $expected): void
     {
         self::assertEquals($expected, ArrayUtility::flatten($array));
@@ -1518,10 +1458,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider flattenPlainCalculatesExpectedResultDataProvider
-     */
+    #[DataProvider('flattenPlainCalculatesExpectedResultDataProvider')]
+    #[Test]
     public function flattenPlainCalculatesExpectedResult(array $array, array $expected): void
     {
         self::assertEquals($expected, ArrayUtility::flattenPlain($array));
@@ -1635,10 +1573,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider flattenWithKeepDotsCalculatesExpectedResultDataProvider
-     */
+    #[DataProvider('flattenWithKeepDotsCalculatesExpectedResultDataProvider')]
+    #[Test]
     public function flattenWithKeepDotsCalculatesExpectedResult(array $array, array $expected): void
     {
         self::assertEquals($expected, ArrayUtility::flatten($array, '', true));
@@ -1802,10 +1738,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider unflattenCalculatesExpectedResultDataProvider
-     */
+    #[DataProvider('unflattenCalculatesExpectedResultDataProvider')]
+    #[Test]
     public function unflattenCalculatesExpectedResult(array $array, array $expected): void
     {
         self::assertEquals($expected, ArrayUtility::unflatten($array));
@@ -2005,10 +1939,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider intersectRecursiveCalculatesExpectedResultDataProvider
-     */
+    #[DataProvider('intersectRecursiveCalculatesExpectedResultDataProvider')]
+    #[Test]
     public function intersectRecursiveCalculatesExpectedResult(array $source, array $mask, array $expected): void
     {
         self::assertSame($expected, ArrayUtility::intersectRecursive($source, $mask));
@@ -2134,10 +2066,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider renumberKeysToAvoidLeapsIfKeysAreAllNumericDataProvider
-     */
+    #[DataProvider('renumberKeysToAvoidLeapsIfKeysAreAllNumericDataProvider')]
+    #[Test]
     public function renumberKeysToAvoidLeapsIfKeysAreAllNumericReturnsExpectedOrder(array $inputArray, array $expected): void
     {
         self::assertEquals($expected, ArrayUtility::renumberKeysToAvoidLeapsIfKeysAreAllNumeric($inputArray));
@@ -2379,8 +2309,6 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider mergeRecursiveWithOverruleCalculatesExpectedResultDataProvider
      * @param array $input1 Input 1
      * @param array $input2 Input 2
      * @param bool $addKeys TRUE if should add keys, else FALSE
@@ -2388,6 +2316,8 @@ final class ArrayUtilityTest extends UnitTestCase
      * @param bool $enableUnsetFeature TRUE if should enable unset feature, else FALSE
      * @param array $expected expected array
      */
+    #[DataProvider('mergeRecursiveWithOverruleCalculatesExpectedResultDataProvider')]
+    #[Test]
     public function mergeRecursiveWithOverruleCalculatesExpectedResult($input1, $input2, $addKeys, $includeEmptyValues, $enableUnsetFeature, $expected): void
     {
         ArrayUtility::mergeRecursiveWithOverrule($input1, $input2, $addKeys, $includeEmptyValues, $enableUnsetFeature);
@@ -2397,9 +2327,7 @@ final class ArrayUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning removeArrayEntryByValue
     //////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRemoveArrayEntryByValueRemovesEntriesFromOneDimensionalArray(): void
     {
         $inputArray = [
@@ -2417,9 +2345,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRemoveArrayEntryByValueRemovesEntriesFromMultiDimensionalArray(): void
     {
         $inputArray = [
@@ -2438,9 +2364,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRemoveArrayEntryByValueRemovesEntryWithEmptyString(): void
     {
         $inputArray = [
@@ -2461,12 +2385,12 @@ final class ArrayUtilityTest extends UnitTestCase
     // Tests concerning keepItemsInArray
     //////////////////////////////////
     /**
-     * @test
-     * @dataProvider keepItemsInArrayWorksWithOneArgumentDataProvider
      * @param mixed $search The items which are allowed/kept in the array
      * @param array $array target array
      * @param array $expected expected array
      */
+    #[DataProvider('keepItemsInArrayWorksWithOneArgumentDataProvider')]
+    #[Test]
     public function keepItemsInArrayWorksWithOneArgument($search, $array, $expected): void
     {
         self::assertEquals($expected, ArrayUtility::keepItemsInArray($array, $search));
@@ -2496,9 +2420,8 @@ final class ArrayUtilityTest extends UnitTestCase
      * Shows the example from the doc comment where
      * a function is used to reduce the sub arrays to one item which
      * is then used for the matching.
-     *
-     * @test
      */
+    #[Test]
     public function keepItemsInArrayCanUseClosure(): void
     {
         $array = [
@@ -2521,9 +2444,7 @@ final class ArrayUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning remapArrayKeys
     //////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function remapArrayKeysExchangesKeysWithGivenMapping(): void
     {
         $array = [
@@ -2547,9 +2468,7 @@ final class ArrayUtilityTest extends UnitTestCase
     //////////////////////////////////////
     // Tests concerning arrayDiffKeyRecursive
     //////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffKeyRecursiveHandlesOneDimensionalArrays(): void
     {
         $array1 = [
@@ -2568,9 +2487,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffKeyRecursiveHandlesMultiDimensionalArrays(): void
     {
         $array1 = [
@@ -2605,9 +2522,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffKeyRecursiveHandlesMixedArrays(): void
     {
         $array1 = [
@@ -2631,9 +2546,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffKeyRecursiveReturnsEmptyIfEqual(): void
     {
         $array1 = [
@@ -2660,9 +2573,7 @@ final class ArrayUtilityTest extends UnitTestCase
     //////////////////////////////////////
     // Tests concerning arrayDiffAssocRecursive
     //////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffAssocRecursiveHandlesOneDimensionalArrays(): void
     {
         $array1 = [
@@ -2681,9 +2592,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffAssocRecursiveHandlesMultiDimensionalArrays(): void
     {
         $array1 = [
@@ -2719,9 +2628,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffAssocRecursiveHandlesMixedArrays(): void
     {
         $array1 = [
@@ -2746,9 +2653,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayDiffAssocRecursiveReturnsEmptyIfEqual(): void
     {
         $array1 = [
@@ -2775,10 +2680,7 @@ final class ArrayUtilityTest extends UnitTestCase
     //////////////////////////////////////
     // Tests concerning naturalKeySortRecursive
     //////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function naturalKeySortRecursiveSortsOneDimensionalArrayByNaturalOrder(): void
     {
         $testArray = [
@@ -2811,9 +2713,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, array_values($testArray));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function naturalKeySortRecursiveSortsMultiDimensionalArrayByNaturalOrder(): void
     {
         $testArray = [
@@ -2955,12 +2855,11 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider filterAndSortByNumericKeysWithAcceptAnyKey
-     *
      * @param array $input
      * @param array $expected
      */
+    #[DataProvider('filterAndSortByNumericKeysWithAcceptAnyKey')]
+    #[Test]
     public function filterAndSortByNumericKeysBehavesCorrectlyForAcceptAnyKeysIsTrue($input, $expected): void
     {
         $result = ArrayUtility::filterAndSortByNumericKeys($input, true);
@@ -3019,12 +2918,11 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider filterAndSortByNumericKeysWithoutAcceptAnyKey
-     *
      * @param array $input
      * @param array $expected
      */
+    #[DataProvider('filterAndSortByNumericKeysWithoutAcceptAnyKey')]
+    #[Test]
     public function filterAndSortByNumericKeysBehavesCorrectlyForAcceptAnyKeysIsFalse($input, $expected): void
     {
         $result = ArrayUtility::filterAndSortByNumericKeys($input);
@@ -3076,21 +2974,15 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     *
-     * @dataProvider sortArrayWithIntegerKeysDataProvider
-     */
+    #[DataProvider('sortArrayWithIntegerKeysDataProvider')]
+    #[Test]
     public function sortArrayWithIntegerKeysSortsNumericArrays(array $arrayToSort, array $expectedArray): void
     {
         $sortedArray = ArrayUtility::sortArrayWithIntegerKeys($arrayToSort);
         self::assertSame($sortedArray, $expectedArray);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function assertAllArrayKeysAreValidThrowsExceptionOnNotAllowedArrayKeys(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -3110,9 +3002,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::assertAllArrayKeysAreValid($arrayToTest, $allowedArrayKeys);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function assertAllArrayKeysAreValidReturnsNullOnAllowedArrayKeys(): void
     {
         $arrayToTest = [
@@ -3130,9 +3020,7 @@ final class ArrayUtilityTest extends UnitTestCase
         ArrayUtility::assertAllArrayKeysAreValid($arrayToTest, $allowedArrayKeys);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sortArrayWithIntegerKeysRecursiveExpectSorting(): void
     {
         $input = [
@@ -3160,9 +3048,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::sortArrayWithIntegerKeysRecursive($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sortArrayWithIntegerKeysRecursiveExpectNoSorting(): void
     {
         $input = [
@@ -3182,9 +3068,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::sortArrayWithIntegerKeysRecursive($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function reIndexNumericArrayKeysRecursiveExpectReindexing(): void
     {
         $input = [
@@ -3212,9 +3096,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::reIndexNumericArrayKeysRecursive($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function reIndexNumericArrayKeysRecursiveExpectNoReindexing(): void
     {
         $input = [
@@ -3242,9 +3124,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::reIndexNumericArrayKeysRecursive($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeNullValuesRecursiveExpectRemoval(): void
     {
         $input = [
@@ -3265,9 +3145,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::removeNullValuesRecursive($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function stripTagsFromValuesRecursiveExpectRemoval(): void
     {
         $input = [
@@ -3289,9 +3167,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::stripTagsFromValuesRecursive($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function stripTagsFromValuesRecursiveExpectNoTypeCast(): void
     {
         $testObject = new \stdClass();
@@ -3325,9 +3201,7 @@ final class ArrayUtilityTest extends UnitTestCase
         self::assertSame($expected, ArrayUtility::stripTagsFromValuesRecursive($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertBooleanStringsToBooleanRecursiveExpectConverting(): void
     {
         $input = [
@@ -3411,10 +3285,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider filterRecursiveFiltersFalseElementsDataProvider
-     */
+    #[DataProvider('filterRecursiveFiltersFalseElementsDataProvider')]
+    #[Test]
     public function filterRecursiveFiltersFalseElements(array $input, array $expectedResult): void
     {
         // If no callback is supplied, all entries of array equal to FALSE (see converting to boolean) will be removed.
@@ -3488,10 +3360,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider filterRecursiveCallbackFiltersEmptyElementsWithoutIntegerZeroByCallbackDataProvider
-     */
+    #[DataProvider('filterRecursiveCallbackFiltersEmptyElementsWithoutIntegerZeroByCallbackDataProvider')]
+    #[Test]
     public function filterRecursiveCallbackFiltersEmptyElementsWithoutIntegerByCallback(array $input, array $expectedResult): void
     {
         // callback filters empty strings, array and null but keeps zero integers
@@ -3563,12 +3433,12 @@ final class ArrayUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider filterRecursiveSupportsCallableCallbackDataProvider
      * @see https://forge.typo3.org/issues/84485
      *
      * @param 0|ARRAY_FILTER_USE_KEY|ARRAY_FILTER_USE_BOTH $mode
      */
+    #[DataProvider('filterRecursiveSupportsCallableCallbackDataProvider')]
+    #[Test]
     public function filterRecursiveSupportsCallableCallback(array $input, array $expectedResult, callable $callback, int $mode = 0): void
     {
         $result = ArrayUtility::filterRecursive($input, $callback, $mode);
@@ -3607,10 +3477,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isAssociativeCorrectlyFindsStringKeysDataProvider
-     */
+    #[DataProvider('isAssociativeCorrectlyFindsStringKeysDataProvider')]
+    #[Test]
     public function isAssociativeCorrectlyFindsStringKeys(array $array, bool $expectedResult): void
     {
         $result = ArrayUtility::isAssociative($array);
@@ -3692,10 +3560,8 @@ final class ArrayUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider replaceAndAppendScalarValuesRecursiveCorrectlyMergesArraysDataProvider
-     */
+    #[DataProvider('replaceAndAppendScalarValuesRecursiveCorrectlyMergesArraysDataProvider')]
+    #[Test]
     public function replaceAndAppendScalarValuesRecursiveCorrectlyMergesArrays(array $array1, array $array2, array $expectedResult): void
     {
         $result = ArrayUtility::replaceAndAppendScalarValuesRecursive($array1, $array2);
diff --git a/typo3/sysext/core/Tests/Unit/Utility/ClassNamingUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/ClassNamingUtilityTest.php
index 8b362a27b2b4518f1d984d3ca997ddbe83e445be..cbef331e4b9811c48a5235df29977b4cc5b10300 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/ClassNamingUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/ClassNamingUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\ClassNamingUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -63,20 +65,16 @@ final class ClassNamingUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider repositoryAndModelClassNames
-     * @test
-     */
+    #[DataProvider('repositoryAndModelClassNames')]
+    #[Test]
     public function translateModelNameToRepositoryName(string $expectedRepositoryName, string $modelName): void
     {
         $translatedRepositoryName = ClassNamingUtility::translateModelNameToRepositoryName($modelName);
         self::assertSame($expectedRepositoryName, $translatedRepositoryName);
     }
 
-    /**
-     * @dataProvider repositoryAndModelClassNames
-     * @test
-     */
+    #[DataProvider('repositoryAndModelClassNames')]
+    #[Test]
     public function translateRepositoryNameToModelName(string $repositoryName, string $expectedModelName): void
     {
         $translatedModelName = ClassNamingUtility::translateRepositoryNameToModelName($repositoryName);
@@ -137,11 +135,8 @@ final class ClassNamingUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider controllerObjectNamesAndMatches
-     *
-     * @test
-     */
+    #[DataProvider('controllerObjectNamesAndMatches')]
+    #[Test]
     public function explodeObjectControllerName(string $controllerObjectName, array $expectedMatches): void
     {
         $actualMatches = ClassNamingUtility::explodeObjectControllerName($controllerObjectName);
diff --git a/typo3/sysext/core/Tests/Unit/Utility/CommandUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/CommandUtilityTest.php
index be8d6c840362d5738751230023bce636a76bd173..442f42240f8442eb9f25126dffd444f83611432b 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/CommandUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/CommandUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\CommandUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -72,12 +74,12 @@ final class CommandUtilityTest extends UnitTestCase
     }
 
     /**
-     * @dataProvider getConfiguredAppsDataProvider
      * @param array $globalsBinSetup
      * @param array $expected
-     * @test
      * @todo When specifying parameter types test bench errors occur
      */
+    #[DataProvider('getConfiguredAppsDataProvider')]
+    #[Test]
     public function getConfiguredApps($globalsBinSetup, $expected): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['binSetup'] = $globalsBinSetup;
@@ -189,10 +191,9 @@ final class CommandUtilityTest extends UnitTestCase
 
     /**
      * Tests if the commands are exploded and unquoted correctly
-     *
-     * @dataProvider unQuoteFilenameUnquotesCorrectlyDataProvider
-     * @test
      */
+    #[DataProvider('unQuoteFilenameUnquotesCorrectlyDataProvider')]
+    #[Test]
     public function unQuoteFilenameUnquotesCorrectly(string $source, array $expectedQuoted): void
     {
         $commandUtilityMock = $this->getAccessibleMock(CommandUtility::class, null);
@@ -204,9 +205,8 @@ final class CommandUtilityTest extends UnitTestCase
      * Test to ensure that, the error isn't happening
      * Error: Typed static property TYPO3\CMS\Core\Utility\CommandUtility::$paths must not be
      * accessed before initialization
-     *
-     * @test
      */
+    #[Test]
     public function getCommandWithPhpReturnsPathToPhpExecutable(): void
     {
         $commandUtilityMock = $this->getAccessibleMock(CommandUtility::class, null);
diff --git a/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php
index 8d82b2628ac90ac5139aa5428c07cd0c0c7b38c2..56698d7f8874657544deb5920aa9975e54ef9ff2 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/CsvUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\CsvUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -85,10 +87,8 @@ final class CsvUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider csvToArrayDataProvider
-     * @test
-     */
+    #[DataProvider('csvToArrayDataProvider')]
+    #[Test]
     public function csvToArraySplitsAsExpected(string $input, string $fieldDelimiter, string $fieldEnclosure, int $maximumColumns, array $expectedResult): void
     {
         self::assertEquals($expectedResult, CsvUtility::csvToArray($input, $fieldDelimiter, $fieldEnclosure, $maximumColumns));
@@ -156,10 +156,8 @@ final class CsvUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider csvValuesDataProvider
-     * @test
-     */
+    #[DataProvider('csvValuesDataProvider')]
+    #[Test]
     public function csvValuesReturnsExpectedResult(array $row, string $delimiter, string $quote, string $expectedResult, int $flag): void
     {
         self::assertEquals($expectedResult, CsvUtility::csvValues($row, $delimiter, $quote, $flag));
diff --git a/typo3/sysext/core/Tests/Unit/Utility/DebugUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/DebugUtilityTest.php
index c749f866acc7d92182ecff5de76519661a317a54..82cb7033ee24c9749f1ff1b20cc8291839098a10 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/DebugUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/DebugUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\DebugUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -32,9 +34,7 @@ final class DebugUtilityTest extends UnitTestCase
         DebugUtility::useAnsiColor(true);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function debugNotEncodesHtmlInputIfPlainText(): void
     {
         DebugUtility::usePlainTextOutput(true);
@@ -51,9 +51,7 @@ final class DebugUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function debugEncodesHtmlInputIfNoPlainText(): void
     {
         DebugUtility::usePlainTextOutput(false);
@@ -106,10 +104,10 @@ final class DebugUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider convertVariableToStringReturnsVariableContentDataProvider
      * @param mixed $variable
      */
+    #[DataProvider('convertVariableToStringReturnsVariableContentDataProvider')]
+    #[Test]
     public function convertVariableToStringReturnsVariableContent($variable, string $expected): void
     {
         self::assertSame($expected, DebugUtility::convertVariableToString($variable));
diff --git a/typo3/sysext/core/Tests/Unit/Utility/ExtensionManagementUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/ExtensionManagementUtilityTest.php
index 63904fd05de5d124570b4374701ef0b90fd3008c..fcd83907686a212d67af9c8efbd0ec0ea5bb531d 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/ExtensionManagementUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/ExtensionManagementUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Cache\CacheManager;
@@ -89,9 +91,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning isLoaded
     ///////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function isLoadedReturnsFalseIfExtensionIsNotLoaded(): void
     {
         self::assertFalse(ExtensionManagementUtility::isLoaded(StringUtility::getUniqueId('foobar')));
@@ -100,9 +100,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning extPath
     ///////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function extPathThrowsExceptionIfExtensionIsNotLoaded(): void
     {
         $this->expectException(\BadFunctionCallException::class);
@@ -121,9 +119,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtility::extPath($packageName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extPathAppendsScriptNameToPath(): void
     {
         $package = $this->getMockBuilder(Package::class)
@@ -205,10 +201,8 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider extensionKeyDataProvider
-     */
+    #[DataProvider('extensionKeyDataProvider')]
+    #[Test]
     public function getClassNamePrefixForExtensionKey(string $extensionName, string $expectedPrefix): void
     {
         self::assertSame($expectedPrefix, ExtensionManagementUtility::getCN($extensionName));
@@ -220,9 +214,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to all TCA types and duplicate fields are considered.
      *
-     * @test
      * @see ExtensionManagementUtility::addToAllTCAtypes()
      */
+    #[Test]
     public function canAddFieldsToAllTCATypesBeforeExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -237,9 +231,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to all TCA types and duplicate fields are considered.
      *
-     * @test
      * @see ExtensionManagementUtility::addToAllTCAtypes()
      */
+    #[Test]
     public function canAddFieldsToAllTCATypesAfterExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -254,9 +248,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to all TCA types and duplicate fields are considered.
      *
-     * @test
      * @see ExtensionManagementUtility::addToAllTCAtypes()
      */
+    #[Test]
     public function canAddFieldsToAllTCATypesRespectsPalettes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -270,9 +264,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to all TCA types and fields in pallets are respected.
      *
-     * @test
      * @see ExtensionManagementUtility::addToAllTCAtypes()
      */
+    #[Test]
     public function canAddFieldsToAllTCATypesRespectsPositionFieldInPalette(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -285,9 +279,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to a TCA type before existing ones
      *
-     * @test
      * @see ExtensionManagementUtility::addToAllTCAtypes()
      */
+    #[Test]
     public function canAddFieldsToTCATypeBeforeExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -302,9 +296,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to a TCA type after existing ones
      *
-     * @test
      * @see ExtensionManagementUtility::addToAllTCAtypes()
      */
+    #[Test]
     public function canAddFieldsToTCATypeAfterExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -316,9 +310,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals('fieldA, fieldB, fieldC;labelC, --palette--;;paletteC, fieldC1, fieldD, fieldD1', $GLOBALS['TCA'][$table]['types']['typeB']['showitem']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canAddFieldWithPartOfAlreadyExistingFieldname(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -331,9 +323,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Test whether replacing other TCA fields works as promised
      *
-     * @test
      * @see ExtensionManagementUtility::addFieldsToAllPalettesOfField()
      */
+    #[Test]
     public function canAddFieldsToTCATypeAndReplaceExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -349,9 +341,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals('fieldZ, fieldX1, fieldY', $GLOBALS['TCA'][$table]['palettes']['paletteD']['showitem']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addToAllTCAtypesReplacesExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -367,9 +357,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals('fieldX, --palette--;;foo, fieldX1, fieldY', $GLOBALS['TCA'][$table]['palettes']['paletteD']['showitem']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addToAllTCAtypesAddsToPaletteIdentifier(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -379,9 +367,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals('fieldA, fieldB, fieldC;labelC, --palette--;;paletteC, fieldX, --palette--;;newpalette, fieldC1, fieldD, fieldD1', $GLOBALS['TCA'][$table]['types']['typeB']['showitem']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addToAllTCAtypesAddsBeforeDiv(): void
     {
         $showitemDiv = '--div--;LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:foobar';
@@ -397,9 +383,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to a palette before existing elements.
      *
-     * @test
      * @see ExtensionManagementUtility::addFieldsToPalette()
      */
+    #[Test]
     public function canAddFieldsToPaletteBeforeExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -411,9 +397,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to a palette after existing elements.
      *
-     * @test
      * @see ExtensionManagementUtility::addFieldsToPalette()
      */
+    #[Test]
     public function canAddFieldsToPaletteAfterExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -425,9 +411,9 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /**
      * Tests whether fields can be added to a palette after a not existing elements.
      *
-     * @test
      * @see ExtensionManagementUtility::addFieldsToPalette()
      */
+    #[Test]
     public function canAddFieldsToPaletteAfterNotExistingOnes(): void
     {
         $table = StringUtility::getUniqueId('tx_coretest_table');
@@ -457,10 +443,8 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider removeDuplicatesForInsertionRemovesDuplicatesDataProvider
-     */
+    #[DataProvider('removeDuplicatesForInsertionRemovesDuplicatesDataProvider')]
+    #[Test]
     public function removeDuplicatesForInsertionRemovesDuplicates(string $insertionList, string $list, string $expected): void
     {
         $result = ExtensionManagementUtilityAccessibleProxy::removeDuplicatesForInsertion($insertionList, $list);
@@ -470,10 +454,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     ///////////////////////////////////////////////////
     // Tests concerning addFieldsToAllPalettesOfField
     ///////////////////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldDoesNotAddAnythingIfFieldIsNotRegisteredInColumns(): void
     {
         $GLOBALS['TCA'] = [
@@ -499,9 +480,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsFieldsToPaletteAndSuppressesDuplicates(): void
     {
         $GLOBALS['TCA'] = [
@@ -546,9 +525,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldDoesNotAddAFieldThatIsPartOfPaletteAlready(): void
     {
         $GLOBALS['TCA'] = [
@@ -593,9 +570,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsFieldsToMultiplePalettes(): void
     {
         $GLOBALS['TCA'] = [
@@ -652,9 +627,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsMultipleFields(): void
     {
         $GLOBALS['TCA'] = [
@@ -699,9 +672,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsBeforeExistingIfRequested(): void
     {
         $GLOBALS['TCA'] = [
@@ -747,9 +718,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsFieldsAtEndIfBeforeRequestedDoesNotExist(): void
     {
         $GLOBALS['TCA'] = [
@@ -795,9 +764,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsAfterExistingIfRequested(): void
     {
         $GLOBALS['TCA'] = [
@@ -843,9 +810,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsFieldsAtEndIfAfterRequestedDoesNotExist(): void
     {
         $GLOBALS['TCA'] = [
@@ -891,9 +856,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsNewPaletteIfFieldHasNoPaletteYet(): void
     {
         $GLOBALS['TCA'] = [
@@ -933,9 +896,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expected, $GLOBALS['TCA']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addFieldsToAllPalettesOfFieldAddsNewPaletteIfFieldHasNoPaletteYetAndKeepsExistingLabel(): void
     {
         $GLOBALS['TCA'] = [
@@ -978,7 +939,6 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     ///////////////////////////////////////////////////
     // Tests concerning executePositionedStringInsertion
     ///////////////////////////////////////////////////
-
     /**
      * Data provider for executePositionedStringInsertionTrimsCorrectCharacters
      */
@@ -1012,10 +972,8 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider executePositionedStringInsertionTrimsCorrectCharactersDataProvider
-     */
+    #[DataProvider('executePositionedStringInsertionTrimsCorrectCharactersDataProvider')]
+    #[Test]
     public function executePositionedStringInsertionTrimsCorrectCharacters(string $string, string $expectedResult): void
     {
         $extensionManagementUtility = $this->getAccessibleMock(ExtensionManagementUtility::class, null);
@@ -1026,10 +984,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning addTcaSelectItem
     /////////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function addTcaSelectItemThrowsExceptionIfRelativePositionIsNotOneOfValidKeywords(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -1038,9 +993,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtility::addTcaSelectItem('foo', 'bar', [], 'foo', 'not allowed keyword');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addTcaSelectItemThrowsExceptionIfFieldIsNotFoundInTca(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -1112,10 +1065,8 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addTcaSelectItemDataProvider
-     */
+    #[DataProvider('addTcaSelectItemDataProvider')]
+    #[Test]
     public function addTcaSelectItemInsertsItemAtSpecifiedPosition(string $relativeToField, string $relativePosition, array $expectedResultArray): void
     {
         $GLOBALS['TCA'] = [
@@ -1140,9 +1091,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning loadExtLocalconf
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function loadExtLocalconfDoesNotReadFromCacheIfCachingIsDenied(): void
     {
         $mockCacheManager = $this->getMockBuilder(CacheManager::class)
@@ -1155,9 +1104,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtility::loadExtLocalconf(false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadExtLocalconfRequiresCacheFileIfExistsAndCachingIsAllowed(): void
     {
         $mockCache = $this->getMockBuilder(PhpFrontend::class)
@@ -1178,9 +1125,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning loadSingleExtLocalconfFiles
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function loadSingleExtLocalconfFilesRequiresExtLocalconfFileRegisteredInGlobalTypo3LoadedExt(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -1197,9 +1142,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning createExtLocalconfCacheEntry
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function createExtLocalconfCacheEntryWritesCacheEntryWithContentOfLoadedExtensionExtLocalconf(): void
     {
         $extensionName = StringUtility::getUniqueId('foo');
@@ -1219,9 +1162,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtilityAccessibleProxy::createExtLocalconfCacheEntry($mockCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createExtLocalconfCacheEntryWritesCacheEntryWithExtensionContentOnlyIfExtLocalconfExists(): void
     {
         $extensionName = StringUtility::getUniqueId('foo');
@@ -1240,9 +1181,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtilityAccessibleProxy::createExtLocalconfCacheEntry($mockCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createExtLocalconfCacheEntryWritesCacheEntryWithNoTags(): void
     {
         $mockCache = $this->getMockBuilder(PhpFrontend::class)
@@ -1259,9 +1198,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning getExtLocalconfCacheIdentifier
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtLocalconfCacheIdentifierCreatesSha1WithFourtyCharactersAndPrefix(): void
     {
         $prefix = 'ext_localconf_';
@@ -1274,10 +1211,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning loadBaseTca
     /////////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function loadBaseTcaDoesNotReadFromCacheIfCachingIsDenied(): void
     {
         $mockCacheManager = $this->getMockBuilder(CacheManager::class)
@@ -1288,9 +1222,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtilityAccessibleProxy::loadBaseTca(false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadBaseTcaRequiresCacheFileIfExistsAndCachingIsAllowed(): void
     {
         $mockCache = $this->getMockBuilder(PhpFrontend::class)
@@ -1302,9 +1234,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtilityAccessibleProxy::loadBaseTca(true, $mockCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadBaseTcaCreatesCacheFileWithContentOfAnExtensionsConfigurationTcaPhpFile(): void
     {
         $extensionName = StringUtility::getUniqueId('test_baseTca_');
@@ -1340,9 +1270,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtility::loadBaseTca(true);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadBaseTcaWritesCacheEntryWithNoTags(): void
     {
         $mockCache = $this->getMockBuilder(PhpFrontend::class)
@@ -1363,10 +1291,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning getBaseTcaCacheIdentifier
     /////////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function getBaseTcaCacheIdentifierCreatesSha1WithFourtyCharactersAndPrefix(): void
     {
         $prefix = 'tca_base_';
@@ -1379,9 +1304,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning loadExtTables
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function loadExtTablesDoesNotReadFromCacheIfCachingIsDenied(): void
     {
         $mockCacheManager = $this->getMockBuilder(CacheManager::class)
@@ -1394,9 +1317,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtility::loadExtLocalconf(false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadExtTablesRequiresCacheFileIfExistsAndCachingIsAllowed(): void
     {
         $mockCache = $this->getMockBuilder(PhpFrontend::class)
@@ -1420,9 +1341,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning createExtTablesCacheEntry
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function createExtTablesCacheEntryWritesCacheEntryWithContentOfLoadedExtensionExtTables(): void
     {
         $extensionName = StringUtility::getUniqueId('foo');
@@ -1442,9 +1361,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtilityAccessibleProxy::createExtTablesCacheEntry($mockCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createExtTablesCacheEntryWritesCacheEntryWithExtensionContentOnlyIfExtTablesExists(): void
     {
         $extensionName = StringUtility::getUniqueId('foo');
@@ -1462,9 +1379,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtilityAccessibleProxy::createExtTablesCacheEntry($mockCache);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createExtTablesCacheEntryWritesCacheEntryWithNoTags(): void
     {
         $mockCache = $this->getMockBuilder(PhpFrontend::class)
@@ -1482,9 +1397,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning getExtTablesCacheIdentifier
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtTablesCacheIdentifierCreatesSha1WithFourtyCharactersAndPrefix(): void
     {
         $prefix = 'ext_tables_';
@@ -1497,11 +1410,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning getExtensionVersion
     /////////////////////////////////////////
-
-    /**
-     * @test
-     * @throws \TYPO3\CMS\Core\Package\Exception
-     */
+    #[Test]
     public function getExtensionVersionForEmptyExtensionKeyThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -1510,9 +1419,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtility::getExtensionVersion('');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtensionVersionForNotLoadedExtensionReturnsEmptyString(): void
     {
         $uniqueSuffix = StringUtility::getUniqueId('test');
@@ -1520,9 +1427,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals('', ExtensionManagementUtility::getExtensionVersion($extensionKey));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtensionVersionForLoadedExtensionReturnsExtensionVersion(): void
     {
         $uniqueSuffix = StringUtility::getUniqueId('test');
@@ -1545,9 +1450,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning loadExtension
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function loadExtensionThrowsExceptionIfExtensionIsLoaded(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -1562,9 +1465,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     /////////////////////////////////////////
     // Tests concerning unloadExtension
     /////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function unloadExtensionThrowsExceptionIfExtensionIsNotLoaded(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -1583,9 +1484,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ExtensionManagementUtility::unloadExtension($packageName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unloadExtensionCallsPackageManagerToDeactivatePackage(): void
     {
         $packageName = StringUtility::getUniqueId('foo');
@@ -1606,10 +1505,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning addPlugin
     ///////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function addPluginSetsTcaCorrectlyForGivenExtKeyAsParameter(): void
     {
         $extKey = 'indexed_search';
@@ -1627,9 +1523,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expectedTCA, $GLOBALS['TCA']['tt_content']['columns']['list_type']['config']['items']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addPluginSetsCorrectItemGroupsEntry(): void
     {
         $extKey = 'indexed_search';
@@ -1661,9 +1555,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addPluginAsContentTypeAddsIconAndDefaultItem(): void
     {
         $extKey = 'felogin';
@@ -1685,9 +1577,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($GLOBALS['TCA']['tt_content']['types']['header'], $GLOBALS['TCA']['tt_content']['types']['felogin']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addPluginAsContentTypeAddsIconAndDefaultItemWithSelectItem(): void
     {
         $extKey = 'felogin';
@@ -1805,10 +1695,8 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider addTcaSelectItemGroupAddsGroupDataProvider
-     */
+    #[DataProvider('addTcaSelectItemGroupAddsGroupDataProvider')]
+    #[Test]
     public function addTcaSelectItemGroupAddsGroup(string $groupId, string $groupLabel, ?string $position, ?array $existingGroups, array $expectedGroups): void
     {
         $GLOBALS['TCA']['tt_content']['columns']['CType']['config'] = [];
@@ -1819,9 +1707,7 @@ final class ExtensionManagementUtilityTest extends UnitTestCase
         self::assertEquals($expectedGroups, $GLOBALS['TCA']['tt_content']['columns']['CType']['config']['itemGroups']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addServiceDoesNotFailIfValueIsNotSet(): void
     {
         ExtensionManagementUtility::addService(
diff --git a/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php
index f511dd452e068c9fedbd5935596e174df76dfbf6..03e7a5848e6b8542fc520fdcf31d40217ad8ea29 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php
@@ -17,11 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\LoggerInterface;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder;
+use TYPO3\CMS\Core\Exception;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Package\Package;
 use TYPO3\CMS\Core\Package\PackageManager;
@@ -111,10 +114,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cmpIPv4DataProviderMatching
-     */
+    #[DataProvider('cmpIPv4DataProviderMatching')]
+    #[Test]
     public function cmpIPv4ReturnsTrueForMatchingAddress($ip, $list): void
     {
         self::assertTrue(GeneralUtility::cmpIPv4($ip, $list));
@@ -137,10 +138,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cmpIPv4DataProviderNotMatching
-     */
+    #[DataProvider('cmpIPv4DataProviderNotMatching')]
+    #[Test]
     public function cmpIPv4ReturnsFalseForNotMatchingAddress($ip, $list): void
     {
         self::assertFalse(GeneralUtility::cmpIPv4($ip, $list));
@@ -170,10 +169,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cmpIPv6DataProviderMatching
-     */
+    #[DataProvider('cmpIPv6DataProviderMatching')]
+    #[Test]
     public function cmpIPv6ReturnsTrueForMatchingAddress($ip, $list): void
     {
         self::assertTrue(GeneralUtility::cmpIPv6($ip, $list));
@@ -198,10 +195,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cmpIPv6DataProviderNotMatching
-     */
+    #[DataProvider('cmpIPv6DataProviderNotMatching')]
+    #[Test]
     public function cmpIPv6ReturnsFalseForNotMatchingAddress($ip, $list): void
     {
         self::assertFalse(GeneralUtility::cmpIPv6($ip, $list));
@@ -227,10 +222,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider normalizeCompressIPv6DataProviderCorrect
-     */
+    #[DataProvider('normalizeCompressIPv6DataProviderCorrect')]
+    #[Test]
     public function normalizeIPv6CorrectlyNormalizesAddresses($compressed, $normalized): void
     {
         self::assertEquals($normalized, GeneralUtility::normalizeIPv6($compressed));
@@ -254,10 +247,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validIpDataProvider
-     */
+    #[DataProvider('validIpDataProvider')]
+    #[Test]
     public function validIpReturnsTrueForValidIp($ip): void
     {
         self::assertTrue(GeneralUtility::validIP($ip));
@@ -281,10 +272,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidIpDataProvider
-     */
+    #[DataProvider('invalidIpDataProvider')]
+    #[Test]
     public function validIpReturnsFalseForInvalidIp($ip): void
     {
         self::assertFalse(GeneralUtility::validIP($ip));
@@ -314,10 +303,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cmpFqdnValidDataProvider
-     */
+    #[DataProvider('cmpFqdnValidDataProvider')]
+    #[Test]
     public function cmpFqdnReturnsTrue($baseHost, $list): void
     {
         self::assertTrue(GeneralUtility::cmpFQDN($baseHost, $list));
@@ -336,10 +323,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider cmpFqdnInvalidDataProvider
-     */
+    #[DataProvider('cmpFqdnInvalidDataProvider')]
+    #[Test]
     public function cmpFqdnReturnsFalse($baseHost, $list): void
     {
         self::assertFalse(GeneralUtility::cmpFQDN($baseHost, $list));
@@ -348,10 +333,8 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning inList
     ///////////////////////////////
-    /**
-     * @test
-     * @dataProvider inListForItemContainedReturnsTrueDataProvider
-     */
+    #[DataProvider('inListForItemContainedReturnsTrueDataProvider')]
+    #[Test]
     public function inListForItemContainedReturnsTrue(string $haystack): void
     {
         self::assertTrue(GeneralUtility::inList($haystack, 'findme'));
@@ -370,10 +353,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider inListForItemNotContainedReturnsFalseDataProvider
-     */
+    #[DataProvider('inListForItemNotContainedReturnsFalseDataProvider')]
+    #[Test]
     public function inListForItemNotContainedReturnsFalse(string $haystack): void
     {
         self::assertFalse(GeneralUtility::inList($haystack, 'findme'));
@@ -394,10 +375,8 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning expandList
     ///////////////////////////////
-    /**
-     * @test
-     * @dataProvider expandListExpandsIntegerRangesDataProvider
-     */
+    #[DataProvider('expandListExpandsIntegerRangesDataProvider')]
+    #[Test]
     public function expandListExpandsIntegerRanges(string $list, string $expectation): void
     {
         self::assertSame($expectation, GeneralUtility::expandList($list));
@@ -421,9 +400,7 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function expandListExpandsForTwoThousandElementsExpandsOnlyToThousandElementsMaximum(): void
     {
         $list = GeneralUtility::expandList('1-2000');
@@ -433,10 +410,8 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning formatSize
     ///////////////////////////////
-    /**
-     * @test
-     * @dataProvider formatSizeDataProvider
-     */
+    #[DataProvider('formatSizeDataProvider')]
+    #[Test]
     public function formatSizeTranslatesBytesToHigherOrderRepresentation($size, $labels, $base, $expected): void
     {
         self::assertEquals($expected, GeneralUtility::formatSize($size, $labels, $base));
@@ -510,10 +485,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider splitCalcDataProvider
-     */
+    #[DataProvider('splitCalcDataProvider')]
+    #[Test]
     public function splitCalcCorrectlySplitsExpression(array $expected, string $expression): void
     {
         self::assertSame($expected, GeneralUtility::splitCalc($expression, '+-*/'));
@@ -557,10 +530,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validEmailValidDataProvider
-     */
+    #[DataProvider('validEmailValidDataProvider')]
+    #[Test]
     public function validEmailReturnsTrueForValidMailAddress($address): void
     {
         self::assertTrue(GeneralUtility::validEmail($address));
@@ -615,10 +586,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validEmailInvalidDataProvider
-     */
+    #[DataProvider('validEmailInvalidDataProvider')]
+    #[Test]
     public function validEmailReturnsFalseForInvalidMailAddress($address): void
     {
         self::assertFalse(GeneralUtility::validEmail($address));
@@ -654,10 +623,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider intExplodeDataProvider
-     */
+    #[DataProvider('intExplodeDataProvider')]
+    #[Test]
     public function intExplodeReturnsExplodedArray(string $input, bool $removeEmpty, array $expected): void
     {
         self::assertSame($expected, GeneralUtility::intExplode(',', $input, $removeEmpty));
@@ -680,18 +647,14 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider implodeArrayForUrlDataProvider
-     */
+    #[DataProvider('implodeArrayForUrlDataProvider')]
+    #[Test]
     public function implodeArrayForUrlBuildsValidParameterString($name, $input, $expected): void
     {
         self::assertSame($expected, GeneralUtility::implodeArrayForUrl($name, $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function implodeArrayForUrlCanSkipEmptyParameters(): void
     {
         $input = ['one' => '√', ''];
@@ -699,9 +662,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($expected, GeneralUtility::implodeArrayForUrl('foo', $input, '', true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function implodeArrayForUrlCanUrlEncodeKeyNames(): void
     {
         $input = ['one' => '√', ''];
@@ -722,10 +683,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider explodeUrl2ArrayTransformsParameterStringToFlatArrayDataProvider
-     */
+    #[DataProvider('explodeUrl2ArrayTransformsParameterStringToFlatArrayDataProvider')]
+    #[Test]
     public function explodeUrl2ArrayTransformsParameterStringToFlatArray(string $input, array $expected): void
     {
         self::assertEquals($expected, GeneralUtility::explodeUrl2Array($input));
@@ -797,19 +756,15 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider revExplodeDataProvider
-     */
+    #[DataProvider('revExplodeDataProvider')]
+    #[Test]
     public function revExplodeCorrectlyExplodesStringForGivenPartsCount($delimiter, $testString, $count, $expectedArray): void
     {
         $actualArray = GeneralUtility::revExplode($delimiter, $testString, $count);
         self::assertEquals($expectedArray, $actualArray);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function revExplodeRespectsLimitThreeWhenExploding(): void
     {
         $testString = 'even:more:of:my:words:here';
@@ -821,10 +776,8 @@ final class GeneralUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning trimExplode
     //////////////////////////////////
-    /**
-     * @test
-     * @dataProvider trimExplodeReturnsCorrectResultDataProvider
-     */
+    #[DataProvider('trimExplodeReturnsCorrectResultDataProvider')]
+    #[Test]
     public function trimExplodeReturnsCorrectResult(string $delimiter, string $testString, bool $removeEmpty, int $limit, array $expectedResult): void
     {
         self::assertSame($expectedResult, GeneralUtility::trimExplode($delimiter, $testString, $removeEmpty, $limit));
@@ -1063,10 +1016,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getBytesFromSizeMeasurementDataProvider
-     */
+    #[DataProvider('getBytesFromSizeMeasurementDataProvider')]
+    #[Test]
     public function getBytesFromSizeMeasurementCalculatesCorrectByteValue($expected, $byteString): void
     {
         self::assertEquals($expected, GeneralUtility::getBytesFromSizeMeasurement($byteString));
@@ -1075,17 +1026,13 @@ final class GeneralUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning getIndpEnv
     //////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function getIndpEnvTypo3SitePathReturnNonEmptyString(): void
     {
         self::assertTrue(strlen(GeneralUtility::getIndpEnv('TYPO3_SITE_PATH')) >= 1);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIndpEnvTypo3SitePathReturnsStringEndingWithSlash(): void
     {
         $result = GeneralUtility::getIndpEnv('TYPO3_SITE_PATH');
@@ -1106,20 +1053,16 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider hostnameAndPortDataProvider
-     */
+    #[DataProvider('hostnameAndPortDataProvider')]
+    #[Test]
     public function getIndpEnvTypo3HostOnlyParsesHostnamesAndIpAddresses($httpHost, $expectedIp): void
     {
         $_SERVER['HTTP_HOST'] = $httpHost;
         self::assertEquals($expectedIp, GeneralUtility::getIndpEnv('TYPO3_HOST_ONLY'));
     }
 
-    /**
-     * @test
-     * @dataProvider hostnameAndPortDataProvider
-     */
+    #[DataProvider('hostnameAndPortDataProvider')]
+    #[Test]
     public function getIndpEnvTypo3PortParsesHostnamesAndIpAddresses($httpHost, $dummy, $expectedPort): void
     {
         $_SERVER['HTTP_HOST'] = $httpHost;
@@ -1142,10 +1085,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider underscoredToUpperCamelCaseDataProvider
-     */
+    #[DataProvider('underscoredToUpperCamelCaseDataProvider')]
+    #[Test]
     public function underscoredToUpperCamelCase($expected, $inputString): void
     {
         self::assertEquals($expected, GeneralUtility::underscoredToUpperCamelCase($inputString));
@@ -1167,10 +1108,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider underscoredToLowerCamelCaseDataProvider
-     */
+    #[DataProvider('underscoredToLowerCamelCaseDataProvider')]
+    #[Test]
     public function underscoredToLowerCamelCase($expected, $inputString): void
     {
         self::assertEquals($expected, GeneralUtility::underscoredToLowerCamelCase($inputString));
@@ -1194,10 +1133,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider camelCaseToLowerCaseUnderscoredDataProvider
-     */
+    #[DataProvider('camelCaseToLowerCaseUnderscoredDataProvider')]
+    #[Test]
     public function camelCaseToLowerCaseUnderscored($expected, $inputString): void
     {
         self::assertEquals($expected, GeneralUtility::camelCaseToLowerCaseUnderscored($inputString));
@@ -1236,10 +1173,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validUrlValidResourceDataProvider
-     */
+    #[DataProvider('validUrlValidResourceDataProvider')]
+    #[Test]
     public function validURLReturnsTrueForValidResource($url): void
     {
         self::assertTrue(GeneralUtility::isValidUrl($url));
@@ -1271,10 +1206,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isValidUrlInvalidResourceDataProvider
-     */
+    #[DataProvider('isValidUrlInvalidResourceDataProvider')]
+    #[Test]
     public function validURLReturnsFalseForInvalidResource($url): void
     {
         self::assertFalse(GeneralUtility::isValidUrl($url));
@@ -1283,10 +1216,7 @@ final class GeneralUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning isOnCurrentHost
     //////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function isOnCurrentHostReturnsTrueWithCurrentHost(): void
     {
         $testUrl = GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL');
@@ -1310,11 +1240,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     * @dataProvider checkisOnCurrentHostInvalidHostsDataProvider
-     */
+    #[DataProvider('checkisOnCurrentHostInvalidHostsDataProvider')]
+    #[Test]
     public function isOnCurrentHostWithNotCurrentHostReturnsFalse(string $hostCandidate): void
     {
         self::assertFalse(GeneralUtility::isOnCurrentHost($hostCandidate));
@@ -1341,10 +1268,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeLocalUrlValidPathsDataProvider
-     */
+    #[DataProvider('sanitizeLocalUrlValidPathsDataProvider')]
+    #[Test]
     public function sanitizeLocalUrlAcceptsNotEncodedValidPaths(string $path): void
     {
         Environment::initialize(
@@ -1362,10 +1287,8 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals($path, GeneralUtility::sanitizeLocalUrl($path));
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeLocalUrlValidPathsDataProvider
-     */
+    #[DataProvider('sanitizeLocalUrlValidPathsDataProvider')]
+    #[Test]
     public function sanitizeLocalUrlAcceptsEncodedValidPaths(string $path): void
     {
         Environment::initialize(
@@ -1414,10 +1337,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeLocalUrlValidUrlsDataProvider
-     */
+    #[DataProvider('sanitizeLocalUrlValidUrlsDataProvider')]
+    #[Test]
     public function sanitizeLocalUrlAcceptsNotEncodedValidUrls(string $url, string $host, string $subDirectory): void
     {
         Environment::initialize(
@@ -1437,10 +1358,8 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals($url, GeneralUtility::sanitizeLocalUrl($url));
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeLocalUrlValidUrlsDataProvider
-     */
+    #[DataProvider('sanitizeLocalUrlValidUrlsDataProvider')]
+    #[Test]
     public function sanitizeLocalUrlAcceptsEncodedValidUrls(string $url, string $host, string $subDirectory): void
     {
         Environment::initialize(
@@ -1479,10 +1398,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeLocalUrlInvalidDataProvider
-     */
+    #[DataProvider('sanitizeLocalUrlInvalidDataProvider')]
+    #[Test]
     public function sanitizeLocalUrlDeniesPlainInvalidUrlsInBackendContext(string $url): void
     {
         Environment::initialize(
@@ -1501,10 +1418,8 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('', GeneralUtility::sanitizeLocalUrl($url));
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeLocalUrlInvalidDataProvider
-     */
+    #[DataProvider('sanitizeLocalUrlInvalidDataProvider')]
+    #[Test]
     public function sanitizeLocalUrlDeniesPlainInvalidUrlsInFrontendContext(string $url): void
     {
         Environment::initialize(
@@ -1523,10 +1438,8 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('', GeneralUtility::sanitizeLocalUrl($url));
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeLocalUrlInvalidDataProvider
-     */
+    #[DataProvider('sanitizeLocalUrlInvalidDataProvider')]
+    #[Test]
     public function sanitizeLocalUrlDeniesEncodedInvalidUrls($url): void
     {
         self::assertEquals('', GeneralUtility::sanitizeLocalUrl(rawurlencode($url)));
@@ -1535,10 +1448,7 @@ final class GeneralUtilityTest extends UnitTestCase
     ////////////////////////////////////////
     // Tests concerning unlink_tempfile
     ////////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function unlink_tempfileRemovesValidFileInTypo3temp(): void
     {
         $fixtureFile = __DIR__ . '/Fixtures/clear.gif';
@@ -1549,9 +1459,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFalse($fileExists);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unlink_tempfileRemovesHiddenFile(): void
     {
         $fixtureFile = __DIR__ . '/Fixtures/clear.gif';
@@ -1562,9 +1470,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFalse($fileExists);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unlink_tempfileReturnsTrueIfFileWasRemoved(): void
     {
         $fixtureFile = __DIR__ . '/Fixtures/clear.gif';
@@ -1574,18 +1480,14 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertTrue($returnValue);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unlink_tempfileReturnsNullIfFileDoesNotExist(): void
     {
         $returnValue = GeneralUtility::unlink_tempfile(Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('i_do_not_exist'));
         self::assertNull($returnValue);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unlink_tempfileReturnsNullIfFileIsNowWithinTypo3temp(): void
     {
         $returnValue = GeneralUtility::unlink_tempfile('/tmp/typo3-unit-test-unlink_tempfile');
@@ -1595,10 +1497,7 @@ final class GeneralUtilityTest extends UnitTestCase
     //////////////////////////////////////
     // Tests concerning tempnam
     //////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function tempnamReturnsPathStartingWithGivenPrefix(): void
     {
         $filePath = GeneralUtility::tempnam('foo');
@@ -1607,9 +1506,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertStringStartsWith('foo', $fileName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tempnamReturnsPathWithoutBackslashes(): void
     {
         $filePath = GeneralUtility::tempnam('foo');
@@ -1617,9 +1514,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertStringNotContainsString('\\', $filePath);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tempnamReturnsAbsolutePathInVarPath(): void
     {
         $filePath = GeneralUtility::tempnam('foo');
@@ -1630,9 +1525,7 @@ final class GeneralUtilityTest extends UnitTestCase
     //////////////////////////////////////
     // Tests concerning removeDotsFromTS
     //////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDotsFromTypoScriptSucceedsWithDottedArray(): void
     {
         $typoScript = [
@@ -1688,18 +1581,14 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider implodeAttributesDataProvider
-     */
+    #[DataProvider('implodeAttributesDataProvider')]
+    #[Test]
     public function implodeAttributesEscapesProperly(array $input, bool $xhtmlSafe, bool $keepEmptyValues, string $expected): void
     {
         self::assertSame($expected, GeneralUtility::implodeAttributes($input, $xhtmlSafe, $keepEmptyValues));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDotsFromTypoScriptOverridesSubArray(): void
     {
         $typoScript = [
@@ -1724,9 +1613,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, GeneralUtility::removeDotsFromTS($typoScript));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDotsFromTypoScriptOverridesWithScalar(): void
     {
         $typoScript = [
@@ -1752,18 +1639,14 @@ final class GeneralUtilityTest extends UnitTestCase
     //////////////////////////////////////
     // Tests concerning get_dirs
     //////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function getDirsReturnsArrayOfDirectoriesFromGivenDirectory(): void
     {
         $directories = GeneralUtility::get_dirs(Environment::getLegacyConfigPath() . '/');
         self::assertIsArray($directories);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDirsReturnsStringErrorOnPathFailure(): void
     {
         $path = 'foo';
@@ -1775,9 +1658,7 @@ final class GeneralUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning hmac
     //////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function hmacReturnsHashOfProperLength(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
@@ -1786,9 +1667,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals(strlen($hmac), 40);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hmacReturnsEqualHashesForEqualInput(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
@@ -1797,9 +1676,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals(GeneralUtility::hmac($msg0), GeneralUtility::hmac($msg1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hmacReturnsNoEqualHashesForNonEqualInput(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
@@ -1860,10 +1737,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider quoteJsValueDataProvider
-     */
+    #[DataProvider('quoteJsValueDataProvider')]
+    #[Test]
     public function quoteJsValueTest(string $input, string $expected): void
     {
         self::assertSame('\'' . $expected . '\'', GeneralUtility::quoteJSvalue($input));
@@ -1892,10 +1767,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider jsonEncodeForHtmlAttributeTestDataProvider
-     */
+    #[DataProvider('jsonEncodeForHtmlAttributeTestDataProvider')]
+    #[Test]
     public function jsonEncodeForHtmlAttributeTest($value, bool $useHtmlEntities, string $expectation): void
     {
         self::assertSame($expectation, GeneralUtility::jsonEncodeForHtmlAttribute($value, $useHtmlEntities));
@@ -1916,10 +1789,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider jsonEncodeForJavaScriptTestDataProvider
-     */
+    #[DataProvider('jsonEncodeForJavaScriptTestDataProvider')]
+    #[Test]
     public function jsonEncodeForJavaScriptTest($value, string $expectation): void
     {
         self::assertSame($expectation, GeneralUtility::jsonEncodeForJavaScript($value));
@@ -1933,18 +1804,14 @@ final class GeneralUtilityTest extends UnitTestCase
         yield 'HTML markup' => ['url(</style>)', 'url(&lt;/style&gt;)'];
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeCssVariableValueDataProvider
-     */
+    #[DataProvider('sanitizeCssVariableValueDataProvider')]
+    #[Test]
     public function sanitizeCssVariableValue(string $value, string $expectation): void
     {
         self::assertSame($expectation, GeneralUtility::sanitizeCssVariableValue($value));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsPermissionsToFile(): void
     {
         if (Environment::isWindows()) {
@@ -1962,9 +1829,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0660', substr(decoct(fileperms($filename)), 2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsPermissionsToHiddenFile(): void
     {
         if (Environment::isWindows()) {
@@ -1982,9 +1847,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0660', substr(decoct(fileperms($filename)), 2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsPermissionsToDirectory(): void
     {
         if (Environment::isWindows()) {
@@ -2002,9 +1865,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0770', substr(decoct(fileperms($directory)), 1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsPermissionsToDirectoryWithTrailingSlash(): void
     {
         if (Environment::isWindows()) {
@@ -2023,9 +1884,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0770', substr(decoct(fileperms($directory)), 1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsPermissionsToHiddenDirectory(): void
     {
         if (Environment::isWindows()) {
@@ -2044,9 +1903,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0770', substr(decoct(fileperms($directory)), 1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsCorrectlySetsPermissionsRecursive(): void
     {
         if (Environment::isWindows()) {
@@ -2095,9 +1952,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0660', $resultBarFile2Permissions);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsDoesNotSetPermissionsToNotAllowedPath(): void
     {
         if (Environment::isWindows()) {
@@ -2111,9 +1966,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFalse($fixPermissionsResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsPermissionsWithRelativeFileReference(): void
     {
         if (Environment::isWindows()) {
@@ -2131,9 +1984,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0660', substr(decoct(fileperms(Environment::getPublicPath() . '/' . $filename)), 2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsDefaultPermissionsToFile(): void
     {
         if (Environment::isWindows()) {
@@ -2149,9 +2000,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('0644', substr(decoct(fileperms($filename)), 2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionsSetsDefaultPermissionsToDirectory(): void
     {
         if (Environment::isWindows()) {
@@ -2170,9 +2019,7 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning mkdir
     ///////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirCreatesDirectory(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -2182,9 +2029,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertDirectoryExists($directory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirCreatesHiddenDirectory(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('.test_');
@@ -2194,9 +2039,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertDirectoryExists($directory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirCreatesDirectoryWithTrailingSlash(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_') . '/';
@@ -2206,9 +2049,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertDirectoryExists($directory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirSetsPermissionsOfCreatedDirectory(): void
     {
         if (Environment::isWindows()) {
@@ -2227,7 +2068,6 @@ final class GeneralUtilityTest extends UnitTestCase
     /////////////////////////////////////////////
     // Tests concerning writeFileToTypo3tempDir()
     /////////////////////////////////////////////
-
     /**
      * when adding entries here, make sure to register any files or directories that might get created as third array item
      * they will be cleaned up after test run.
@@ -2273,12 +2113,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidFilePathForTypo3tempDirDataProvider
-     *
-     * * @param non-empty-string $pathToCleanUp
-     */
+    #[DataProvider('invalidFilePathForTypo3tempDirDataProvider')]
+    #[Test]
     public function writeFileToTypo3tempDirFailsWithInvalidPath(string $invalidFilePath, string $expectedResult, string $pathToCleanUp): void
     {
         if ($pathToCleanUp !== '') {
@@ -2319,11 +2155,11 @@ final class GeneralUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validFilePathForTypo3tempDirDataProvider
      * @param non-empty-string $filePath
      * @param non-empty-string $pathToCleanUp
      */
+    #[DataProvider('validFilePathForTypo3tempDirDataProvider')]
+    #[Test]
     public function writeFileToTypo3tempDirWorksWithValidPath(string $filePath, string $pathToCleanUp): void
     {
         if ($pathToCleanUp !== '') {
@@ -2342,9 +2178,7 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning mkdir_deep
     ///////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirDeepCreatesDirectory(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('test_');
@@ -2352,9 +2186,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertDirectoryExists($directory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirDeepCreatesSubdirectoriesRecursive(): void
     {
         $directory = $this->getTestDirectory() . '/typo3temp/var/tests/' . StringUtility::getUniqueId('test_');
@@ -2374,10 +2206,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider mkdirDeepCreatesDirectoryWithAndWithoutDoubleSlashesDataProvider
-     */
+    #[DataProvider('mkdirDeepCreatesDirectoryWithAndWithoutDoubleSlashesDataProvider')]
+    #[Test]
     public function mkdirDeepCreatesDirectoryWithDoubleSlashes($directoryToCreate): void
     {
         $testRoot = Environment::getVarPath() . '/public/';
@@ -2387,9 +2217,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertDirectoryExists($directory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirDeepFixesPermissionsOfCreatedDirectory(): void
     {
         if (Environment::isWindows()) {
@@ -2405,9 +2233,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('777', substr(decoct(fileperms(Environment::getVarPath() . '/tests/' . $directory)), -3, 3));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirDeepFixesPermissionsOnNewParentDirectory(): void
     {
         if (Environment::isWindows()) {
@@ -2424,9 +2250,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('777', substr(decoct(fileperms(Environment::getVarPath() . '/tests/' . $directory)), -3, 3));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirDeepDoesNotChangePermissionsOfExistingSubDirectories(): void
     {
         if (Environment::isWindows()) {
@@ -2442,9 +2266,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals(742, (int)substr(decoct(fileperms($baseDirectory . $existingDirectory)), 2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirDeepThrowsExceptionIfDirectoryCreationFails(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -2453,9 +2275,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::mkdir_deep('http://localhost');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mkdirDeepThrowsExceptionIfBaseDirectoryIsNotOfTypeString(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -2468,10 +2288,7 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning rmdir
     ///////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirRemovesFile(): void
     {
         $testRoot = Environment::getVarPath() . '/tests/';
@@ -2483,9 +2300,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFileDoesNotExist($file);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirReturnTrueIfFileWasRemoved(): void
     {
         $file = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('file_');
@@ -2493,18 +2308,14 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertTrue(GeneralUtility::rmdir($file));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirReturnFalseIfNoFileWasRemoved(): void
     {
         $file = Environment::getVarPath() . '/tests/' . StringUtility::getUniqueId('file_');
         self::assertFalse(GeneralUtility::rmdir($file));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirRemovesDirectory(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('directory_');
@@ -2513,9 +2324,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFileDoesNotExist($directory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirRemovesDirectoryWithTrailingSlash(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('directory_') . '/';
@@ -2524,9 +2333,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFileDoesNotExist($directory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirDoesNotRemoveDirectoryWithFilesAndReturnsFalseIfRecursiveDeletionIsOff(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('directory_') . '/';
@@ -2539,9 +2346,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFalse($return);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirRemovesDirectoriesRecursiveAndReturnsTrue(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('directory_') . '/';
@@ -2553,9 +2358,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertTrue($return);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirRemovesLinkToDirectory(): void
     {
         $existingDirectory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('notExists_') . '/';
@@ -2566,9 +2369,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFalse(is_link($symlinkName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirRemovesDeadLinkToDirectory(): void
     {
         $notExistingDirectory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('notExists_') . '/';
@@ -2581,9 +2382,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFalse(is_link($symlinkName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function rmdirRemovesDeadLinkToFile(): void
     {
         $testDirectory = $this->getTestDirectory() . '/';
@@ -2599,7 +2398,6 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////////
     // Tests concerning getFilesInDir
     ///////////////////////////////////
-
     /**
      * Helper method to create test directory.
      *
@@ -2628,9 +2426,7 @@ final class GeneralUtilityTest extends UnitTestCase
         return $path;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirFindsRegularFile(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2638,9 +2434,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertContains('testA.txt', $files);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirFindsHiddenFile(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2648,9 +2442,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertContains('.secret.txt', $files);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirOnlyFindWithMatchingExtension(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2680,10 +2472,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider fileExtensionDataProvider
-     * @test
-     */
+    #[DataProvider('fileExtensionDataProvider')]
+    #[Test]
     public function getFilesInDirByExtensionFindsFiles($fileExtensions): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2694,9 +2484,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertContains('test.css', $files);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirByExtensionDoesNotFindFilesWithOtherExtensions(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2706,9 +2494,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertNotContains('test.css', $files);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirExcludesFilesMatchingPattern(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2717,9 +2503,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertNotContains('excludeMe.txt', $files);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirCanPrependPath(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2729,9 +2513,7 @@ final class GeneralUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirDoesSortAlphabeticallyByDefault(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2741,9 +2523,7 @@ final class GeneralUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirReturnsArrayWithMd5OfElementAndPathAsArrayKey(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2753,9 +2533,7 @@ final class GeneralUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFilesInDirDoesNotFindDirectories(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2768,9 +2546,8 @@ final class GeneralUtilityTest extends UnitTestCase
     /**
      * Dotfiles; current directory: '.' and parent directory: '..' must not be
      * present.
-     *
-     * @test
      */
+    #[Test]
     public function getFilesInDirDoesNotFindDotfiles(): void
     {
         $path = $this->getFilesInDirCreateTestDirectory();
@@ -2782,9 +2559,7 @@ final class GeneralUtilityTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning split_fileref
     ///////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function splitFileRefReturnsFileTypeNotForFolders(): void
     {
         $directoryName = StringUtility::getUniqueId('test_') . '.com';
@@ -2804,9 +2579,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertArrayNotHasKey('realFileext', $fileInfo);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function splitFileRefReturnsFileTypeForFilesWithoutPathSite(): void
     {
         $testFile = 'fileadmin/media/someFile.png';
@@ -2839,11 +2612,11 @@ final class GeneralUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider dirnameDataProvider
      * @param string $input the input for dirname
      * @param string $expectedValue the expected return value expected from dirname
      */
+    #[DataProvider('dirnameDataProvider')]
+    #[Test]
     public function dirnameWithDataProvider(string $input, string $expectedValue): void
     {
         self::assertEquals($expectedValue, GeneralUtility::dirname($input));
@@ -2890,11 +2663,11 @@ final class GeneralUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider resolveBackPathDataProvider
      * @param string $input the input for resolveBackPath
      * @param string $expectedValue Expected return value from resolveBackPath
      */
+    #[DataProvider('resolveBackPathDataProvider')]
+    #[Test]
     public function resolveBackPathWithDataProvider(string $input, string $expectedValue): void
     {
         self::assertEquals($expectedValue, GeneralUtility::resolveBackPath($input));
@@ -2903,9 +2676,7 @@ final class GeneralUtilityTest extends UnitTestCase
     /////////////////////////////////////////////////////////////////////////////////////
     // Tests concerning makeInstance, setSingletonInstance, addInstance, purgeInstances
     /////////////////////////////////////////////////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceWithEmptyClassNameThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -2915,9 +2686,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::makeInstance('');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceWithBeginningSlashInClassNameThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -2926,17 +2695,13 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::makeInstance('\\TYPO3\\CMS\\Backend\\Controller\\BackendController');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceReturnsClassInstance(): void
     {
         self::assertInstanceOf(\stdClass::class, GeneralUtility::makeInstance(\stdClass::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstancePassesParametersToConstructor(): void
     {
         $instance = GeneralUtility::makeInstance(TwoParametersConstructorFixture::class, 'one parameter', 'another parameter');
@@ -2944,9 +2709,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('another parameter', $instance->constructorParameter2, 'The second constructor parameter has not been set.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceInstanciatesConfiguredImplementation(): void
     {
         GeneralUtility::flushInternalRuntimeCaches();
@@ -2954,9 +2717,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertInstanceOf(ReplacementClassFixture::class, GeneralUtility::makeInstance(OriginalClassFixture::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceResolvesConfiguredImplementationsRecursively(): void
     {
         GeneralUtility::flushInternalRuntimeCaches();
@@ -2965,27 +2726,21 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertInstanceOf(OtherReplacementClassFixture::class, GeneralUtility::makeInstance(OriginalClassFixture::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceCalledTwoTimesForNonSingletonClassReturnsDifferentInstances(): void
     {
         $className = \stdClass::class;
         self::assertNotSame(GeneralUtility::makeInstance($className), GeneralUtility::makeInstance($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceCalledTwoTimesForSingletonClassReturnsSameInstance(): void
     {
         $className = get_class($this->createMock(SingletonInterface::class));
         self::assertSame(GeneralUtility::makeInstance($className), GeneralUtility::makeInstance($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceCalledTwoTimesForSingletonClassWithPurgeInstancesInbetweenReturnsDifferentInstances(): void
     {
         $className = get_class($this->createMock(SingletonInterface::class));
@@ -2994,18 +2749,14 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertNotSame($instance, GeneralUtility::makeInstance($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceInjectsLogger(): void
     {
         $instance = GeneralUtility::makeInstance(GeneralUtilityMakeInstanceInjectLoggerFixture::class);
         self::assertInstanceOf(LoggerInterface::class, $instance->getLogger());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSingletonInstanceForEmptyClassNameThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -3016,9 +2767,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::setSingletonInstance('', $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSingletonInstanceForClassThatIsNoSubclassOfProvidedClassThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -3031,9 +2780,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::setSingletonInstance($singletonClassName, $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSingletonInstanceMakesMakeInstanceReturnThatInstance(): void
     {
         $instance = $this->createMock(SingletonInterface::class);
@@ -3042,9 +2789,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($instance, GeneralUtility::makeInstance($singletonClassName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSingletonInstanceCalledTwoTimesMakesMakeInstanceReturnLastSetInstance(): void
     {
         $instance1 = $this->createMock(SingletonInterface::class);
@@ -3055,9 +2800,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($instance2, GeneralUtility::makeInstance($singletonClassName));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSingletonInstancesContainsPreviouslySetSingletonInstance(): void
     {
         $instance = $this->createMock(SingletonInterface::class);
@@ -3068,9 +2811,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($registeredSingletonInstances[$instanceClassName], $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSingletonInstanceReturnsFinalClassNameWithOverriddenClass(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][SingletonClassFixture::class]['className'] = ExtendedSingletonClassFixture::class;
@@ -3082,9 +2823,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals(ExtendedSingletonClassFixture::class, get_class($anotherInstance));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resetSingletonInstancesResetsPreviouslySetInstance(): void
     {
         $instance = $this->createMock(SingletonInterface::class);
@@ -3095,9 +2834,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertArrayNotHasKey($instanceClassName, $registeredSingletonInstances);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resetSingletonInstancesSetsGivenInstance(): void
     {
         $instance = $this->createMock(SingletonInterface::class);
@@ -3110,9 +2847,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($registeredSingletonInstances[$instanceClassName], $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInstanceForEmptyClassNameThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -3122,9 +2857,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::addInstance('', new \stdClass());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInstanceForClassThatIsNoSubclassOfProvidedClassThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -3137,9 +2870,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::addInstance($singletonClassName, $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInstanceWithSingletonInstanceThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -3149,9 +2880,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::addInstance(get_class($instance), $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInstanceMakesMakeInstanceReturnThatInstance(): void
     {
         $instance = $this->createMock(\stdClass::class);
@@ -3160,9 +2889,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($instance, GeneralUtility::makeInstance($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeInstanceCalledTwoTimesAfterAddInstanceReturnTwoDifferentInstances(): void
     {
         $instance = $this->createMock(\stdClass::class);
@@ -3171,9 +2898,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertNotSame(GeneralUtility::makeInstance($className), GeneralUtility::makeInstance($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addInstanceCalledTwoTimesMakesMakeInstanceReturnBothInstancesInAddingOrder(): void
     {
         $instance1 = $this->createMock(\stdClass::class);
@@ -3185,9 +2910,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($instance2, GeneralUtility::makeInstance($className), 'The second returned instance does not match the second added instance.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function purgeInstancesDropsAddedInstance(): void
     {
         $instance = $this->createMock(\stdClass::class);
@@ -3231,10 +2954,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getFileAbsFileNameDataProvider
-     */
+    #[DataProvider('getFileAbsFileNameDataProvider')]
+    #[Test]
     public function getFileAbsFileNameReturnsCorrectValues(string $path, string $expected): void
     {
         // build the dummy package "foo" for use in ExtensionManagementUtility::extPath('foo');
@@ -3299,10 +3020,9 @@ final class GeneralUtilityTest extends UnitTestCase
 
     /**
      * Tests whether invalid characters are detected.
-     *
-     * @dataProvider validPathStrInvalidCharactersDataProvider
-     * @test
      */
+    #[DataProvider('validPathStrInvalidCharactersDataProvider')]
+    #[Test]
     public function validPathStrDetectsInvalidCharacters(string $path): void
     {
         self::assertFalse(GeneralUtility::validPathStr($path));
@@ -3323,10 +3043,9 @@ final class GeneralUtilityTest extends UnitTestCase
 
     /**
      * Tests whether Unicode characters are recognized as valid file name characters.
-     *
-     * @dataProvider validPathStrDataProvider
-     * @test
      */
+    #[DataProvider('validPathStrDataProvider')]
+    #[Test]
     public function validPathStrWorksWithUnicodeFileNames($path): void
     {
         self::assertTrue(GeneralUtility::validPathStr($path));
@@ -3335,10 +3054,7 @@ final class GeneralUtilityTest extends UnitTestCase
     /////////////////////////////////////////////////////////////////////////////////////
     // Tests concerning copyDirectory
     /////////////////////////////////////////////////////////////////////////////////////
-
-    /**
-     * @test
-     */
+    #[Test]
     public function copyDirectoryCopiesFilesAndDirectoriesWithRelativePaths(): void
     {
         $sourceDirectory = 'typo3temp/var/tests/' . StringUtility::getUniqueId('test_') . '/';
@@ -3360,9 +3076,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertFileExists($absoluteTargetDirectory . 'foo/file');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function copyDirectoryCopiesFilesAndDirectoriesWithAbsolutePaths(): void
     {
         $sourceDirectory = 'typo3temp/var/tests/' . StringUtility::getUniqueId('test_') . '/';
@@ -3396,10 +3110,10 @@ final class GeneralUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider callUserFunctionInvalidParameterDataProvider
      * @param non-empty-string $functionName
      */
+    #[DataProvider('callUserFunctionInvalidParameterDataProvider')]
+    #[Test]
     public function callUserFunctionWillThrowExceptionForInvalidParameters(string $functionName, int $expectedException): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -3408,9 +3122,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::callUserFunction($functionName, $inputData, $this);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function callUserFunctionCanCallClosure(): void
     {
         $inputData = ['foo' => 'bar'];
@@ -3423,9 +3135,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('Worked fine', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function callUserFunctionCanCallMethod(): void
     {
         $inputData = ['foo' => 'bar'];
@@ -3433,9 +3143,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('Worked fine', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function callUserFunctionTrimsSpaces(): void
     {
         $inputData = ['foo' => 'bar'];
@@ -3443,9 +3151,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('Worked fine', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function callUserFunctionAcceptsClosures(): void
     {
         $inputData = ['foo' => 'bar'];
@@ -3456,9 +3162,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertEquals('Worked fine', GeneralUtility::callUserFunction($closure, $inputData, $this));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllFilesAndFoldersInPathReturnsArrayWithMd5Keys(): void
     {
         $directory = $this->getTestDirectory() . '/' . StringUtility::getUniqueId('directory_');
@@ -3477,9 +3181,8 @@ final class GeneralUtilityTest extends UnitTestCase
     /**
      * If the element is not empty, its contents might be treated as "something" (instead of "nothing")
      * e.g. by Fluid view helpers, which is why we want to avoid that.
-     *
-     * @test
      */
+    #[Test]
     public function array2xmlConvertsEmptyArraysToElementWithoutContent(): void
     {
         $input = [
@@ -3493,9 +3196,7 @@ final class GeneralUtilityTest extends UnitTestCase
 </phparray>', $output);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function xml2arrayUsesCache(): void
     {
         $cacheMock = $this->createMock(FrontendInterface::class);
@@ -3564,10 +3265,8 @@ final class GeneralUtilityTest extends UnitTestCase
         return $data;
     }
 
-    /**
-     * @test
-     * @dataProvider xml2arrayProcessHandlesWhitespacesDataProvider
-     */
+    #[DataProvider('xml2arrayProcessHandlesWhitespacesDataProvider')]
+    #[Test]
     public function xml2arrayProcessHandlesWhitespaces(string $input): void
     {
         $expected = [
@@ -3619,10 +3318,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider xml2arrayProcessHandlesTagNamespacesDataProvider
-     */
+    #[DataProvider('xml2arrayProcessHandlesTagNamespacesDataProvider')]
+    #[Test]
     public function xml2arrayProcessHandlesTagNamespaces(string $input): void
     {
         $expected = [
@@ -3677,10 +3374,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider xml2arrayProcessHandlesDocumentTagDataProvider
-     */
+    #[DataProvider('xml2arrayProcessHandlesDocumentTagDataProvider')]
+    #[Test]
     public function xml2arrayProcessHandlesDocumentTag(string $input, string $docTag): void
     {
         $expected = [
@@ -3725,10 +3420,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider xml2ArrayProcessHandlesBigXmlContentDataProvider
-     */
+    #[DataProvider('xml2ArrayProcessHandlesBigXmlContentDataProvider')]
+    #[Test]
     public function xml2ArrayProcessHandlesBigXmlContent(string $input, string $testValue): void
     {
         $expected = [
@@ -3816,10 +3509,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider xml2ArrayProcessHandlesAttributeTypesDataProvider
-     */
+    #[DataProvider('xml2ArrayProcessHandlesAttributeTypesDataProvider')]
+    #[Test]
     public function xml2ArrayProcessHandlesAttributeTypes(string $input, mixed $expected): void
     {
         $result = GeneralUtility::xml2arrayProcess($input);
@@ -3858,10 +3549,10 @@ final class GeneralUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider locationHeaderUrlDataProvider
-     * @throws \TYPO3\CMS\Core\Exception
+     * @throws Exception
      */
+    #[DataProvider('locationHeaderUrlDataProvider')]
+    #[Test]
     public function locationHeaderUrl(string $path, string $host, string $expected): void
     {
         Environment::initialize(
@@ -3881,9 +3572,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertSame($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createVersionNumberedFilenameDoesNotResolveBackpathForAbsolutePath(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['versionNumberInFilename'] = true;
@@ -3900,9 +3589,7 @@ final class GeneralUtilityTest extends UnitTestCase
         self::assertMatchesRegularExpression('/^.*\/tests\/' . $uniqueFilename . '\.[0-9]+\.css/', $versionedFilename);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createVersionNumberedFilenameKeepsInvalidAbsolutePathInFrontendAndAddsQueryString(): void
     {
         Environment::initialize(
@@ -3938,9 +3625,7 @@ final class GeneralUtilityTest extends UnitTestCase
         GeneralUtility::rmdir($testFileDirectory, true);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMaxUploadFileSizeReturnsPositiveInt(): void
     {
         $result = GeneralUtility::getMaxUploadFileSize();
diff --git a/typo3/sysext/core/Tests/Unit/Utility/HttpUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/HttpUtilityTest.php
index 7dffb1c9251671b37873a540a452afb3d3b42d27..dae3774ad3b135965cab8e6e53dda5dbcbd14cd6 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/HttpUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/HttpUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\HttpUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -25,10 +27,8 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class HttpUtilityTest extends UnitTestCase
 {
-    /**
-     * @dataProvider isUrlBuiltCorrectlyDataProvider
-     * @test
-     */
+    #[DataProvider('isUrlBuiltCorrectlyDataProvider')]
+    #[Test]
     public function isUrlBuiltCorrectly(array $urlParts, string $expected): void
     {
         $url = HttpUtility::buildUrl($urlParts);
@@ -76,10 +76,8 @@ final class HttpUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider queryStringDataProvider
-     */
+    #[DataProvider('queryStringDataProvider')]
+    #[Test]
     public function buildQueryStringBuildsValidParameterString(string $name, array $input, string $expected): void
     {
         if ($name === '') {
@@ -89,9 +87,7 @@ final class HttpUtilityTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildQueryStringCanSkipEmptyParameters(): void
     {
         $input = ['one' => '√', ''];
@@ -99,9 +95,7 @@ final class HttpUtilityTest extends UnitTestCase
         self::assertSame($expected, HttpUtility::buildQueryString(['foo' => $input], '', true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildQueryStringCanUrlEncodeKeyNames(): void
     {
         $input = ['one' => '√', ''];
@@ -109,9 +103,7 @@ final class HttpUtilityTest extends UnitTestCase
         self::assertSame($expected, HttpUtility::buildQueryString(['foo' => $input]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildQueryStringCanUrlEncodeKeyNamesMultidimensional(): void
     {
         $input = ['one' => ['two' => ['three' => '√']], ''];
@@ -119,9 +111,7 @@ final class HttpUtilityTest extends UnitTestCase
         self::assertSame($expected, HttpUtility::buildQueryString(['foo' => $input]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildQueryStringSkipsLeadingCharacterOnEmptyParameters(): void
     {
         $input = [];
@@ -129,9 +119,7 @@ final class HttpUtilityTest extends UnitTestCase
         self::assertSame($expected, HttpUtility::buildQueryString($input, '?', true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildQueryStringSkipsLeadingCharacterOnCleanedEmptyParameters(): void
     {
         $input = ['one' => ''];
diff --git a/typo3/sysext/core/Tests/Unit/Utility/IpAnonymizationUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/IpAnonymizationUtilityTest.php
index 594efb2583be91ccdf02a382be9e8906e2ec36fd..4baa2c21e57d6fbb237c5e6a9c8f243a97be5a30 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/IpAnonymizationUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/IpAnonymizationUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\IpAnonymizationUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -48,10 +50,10 @@ final class IpAnonymizationUtilityTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider anonymizeIpReturnsCorrectValueDataProvider
      * @param int|null $mask
      */
+    #[DataProvider('anonymizeIpReturnsCorrectValueDataProvider')]
+    #[Test]
     public function anonymizeIpReturnsCorrectValue(string $address, int $mask = null, string $expected): void
     {
         // set the default if $mask is null
@@ -59,9 +61,7 @@ final class IpAnonymizationUtilityTest extends UnitTestCase
         self::assertEquals($expected, IpAnonymizationUtility::anonymizeIp($address, $mask));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function wrongMaskForAnonymizeIpThrowsException(): void
     {
         $this->expectException(\UnexpectedValueException::class);
diff --git a/typo3/sysext/core/Tests/Unit/Utility/MailUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/MailUtilityTest.php
index d2af33d33034cd43a5b3d380a1884e9a4325a7b5..b21bc0adb908421f18aba909549ffbe65e76c04f 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/MailUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/MailUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\MailUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -24,17 +26,13 @@ final class MailUtilityTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function breakLinesForEmailReturnsEmptyStringIfEmptyStringIsGiven(): void
     {
         self::assertEmpty(MailUtility::breakLinesForEmail(''));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function breakLinesForEmailReturnsOneLineIfCharWithIsNotExceeded(): void
     {
         $newlineChar = LF;
@@ -44,9 +42,7 @@ final class MailUtilityTest extends UnitTestCase
         self::assertCount(1, explode($newlineChar, $returnString));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function breakLinesForEmailBreaksTextIfCharWithIsExceeded(): void
     {
         $newlineChar = LF;
@@ -56,9 +52,7 @@ final class MailUtilityTest extends UnitTestCase
         self::assertCount(2, explode($newlineChar, $returnString));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function breakLinesForEmailBreaksTextWithNoSpaceFoundBeforeLimit(): void
     {
         $newlineChar = LF;
@@ -69,9 +63,7 @@ final class MailUtilityTest extends UnitTestCase
         self::assertEquals($returnString, 'abcdefghijklmnopqrst' . LF . 'uvwxyz' . LF . '123456');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function breakLinesForEmailBreaksTextIfLineIsLongerThanTheLineWidth(): void
     {
         $str = 'Mein Link auf eine News (Link: http://zzzzzzzzzzzzz.xxxxxxxxx.de/index.php?id=10&tx_ttnews%5Btt_news%5D=1&cHash=66f5af320da29b7ae1cda49047ca7358)';
@@ -104,10 +96,8 @@ final class MailUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider parseAddressesProvider
-     */
+    #[DataProvider('parseAddressesProvider')]
+    #[Test]
     public function parseAddressesTest(string $source, array $addressList): void
     {
         $returnArray = MailUtility::parseAddresses($source);
@@ -136,10 +126,8 @@ final class MailUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider replyToProvider
-     */
+    #[DataProvider('replyToProvider')]
+    #[Test]
     public function getSystemReplyToTest(array $configuration, array $expectedReplyTo): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['MAIL'] = $configuration;
diff --git a/typo3/sysext/core/Tests/Unit/Utility/MathUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/MathUtilityTest.php
index f2fb696985be5499405418923aac78a25d0d0cc9..fe058a2af51794badd8296992d117804d55b4b7d 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/MathUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/MathUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Utility\Fixtures\MathUtilityTestClassWithStringRepresentationFixture;
 use TYPO3\CMS\Core\Utility\MathUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -42,18 +44,14 @@ final class MathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider forceIntegerInRangeForcesIntegerIntoDefaultBoundariesDataProvider
-     */
+    #[DataProvider('forceIntegerInRangeForcesIntegerIntoDefaultBoundariesDataProvider')]
+    #[Test]
     public function forceIntegerInRangeForcesIntegerIntoDefaultBoundaries($expected, $value): void
     {
         self::assertEquals($expected, MathUtility::forceIntegerInRange($value, 0));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forceIntegerInRangeSetsDefaultValueIfZeroValueIsGiven(): void
     {
         self::assertEquals(42, MathUtility::forceIntegerInRange('', 0, 2000000000, 42));
@@ -62,17 +60,13 @@ final class MathUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning convertToPositiveInteger
     //////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function convertToPositiveIntegerReturnsZeroForNegativeValues(): void
     {
         self::assertEquals(0, MathUtility::convertToPositiveInteger(-123));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertToPositiveIntegerReturnsTheInputValueForPositiveValues(): void
     {
         self::assertEquals(123, MathUtility::convertToPositiveInteger(123));
@@ -99,10 +93,8 @@ final class MathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider functionCanBeInterpretedAsIntegerValidDataProvider
-     */
+    #[DataProvider('functionCanBeInterpretedAsIntegerValidDataProvider')]
+    #[Test]
     public function canBeInterpretedAsIntegerReturnsTrue($int): void
     {
         self::assertTrue(MathUtility::canBeInterpretedAsInteger($int));
@@ -148,10 +140,8 @@ final class MathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider functionCanBeInterpretedAsIntegerInvalidDataProvider
-     */
+    #[DataProvider('functionCanBeInterpretedAsIntegerInvalidDataProvider')]
+    #[Test]
     public function canBeInterpretedAsIntegerReturnsFalse($int): void
     {
         self::assertFalse(MathUtility::canBeInterpretedAsInteger($int));
@@ -179,10 +169,8 @@ final class MathUtilityTest extends UnitTestCase
         return array_merge($intTestcases, $floatTestcases);
     }
 
-    /**
-     * @test
-     * @dataProvider functionCanBeInterpretedAsFloatValidDataProvider
-     */
+    #[DataProvider('functionCanBeInterpretedAsFloatValidDataProvider')]
+    #[Test]
     public function canBeInterpretedAsFloatReturnsTrue($val): void
     {
         self::assertTrue(MathUtility::canBeInterpretedAsFloat($val));
@@ -224,10 +212,8 @@ final class MathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider functionCanBeInterpretedAsFloatInvalidDataProvider
-     */
+    #[DataProvider('functionCanBeInterpretedAsFloatInvalidDataProvider')]
+    #[Test]
     public function canBeInterpretedAsFloatReturnsFalse($int): void
     {
         self::assertFalse(MathUtility::canBeInterpretedAsFloat($int));
@@ -260,10 +246,8 @@ final class MathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider calculateWithPriorityToAdditionAndSubtractionDataProvider
-     */
+    #[DataProvider('calculateWithPriorityToAdditionAndSubtractionDataProvider')]
+    #[Test]
     public function calculateWithPriorityToAdditionAndSubtractionCorrectlyCalculatesExpression($expected, $expression): void
     {
         self::assertEquals($expected, MathUtility::calculateWithPriorityToAdditionAndSubtraction($expression));
@@ -288,10 +272,8 @@ final class MathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider calculateWithParenthesesDataProvider
-     */
+    #[DataProvider('calculateWithParenthesesDataProvider')]
+    #[Test]
     public function calculateWithParenthesesCorrectlyCalculatesExpression($expected, $expression): void
     {
         self::assertEquals($expected, MathUtility::calculateWithParentheses($expression));
@@ -300,33 +282,25 @@ final class MathUtilityTest extends UnitTestCase
     //////////////////////////////////
     // Tests concerning isIntegerInRange
     //////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function isIntegerInRangeIncludesLowerBoundary(): void
     {
         self::assertTrue(MathUtility::isIntegerInRange(1, 1, 2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isIntegerInRangeIncludesUpperBoundary(): void
     {
         self::assertTrue(MathUtility::isIntegerInRange(2, 1, 2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isIntegerInRangeAcceptsValueInRange(): void
     {
         self::assertTrue(MathUtility::isIntegerInRange(10, 1, 100));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isIntegerInRangeRejectsValueOutsideOfRange(): void
     {
         self::assertFalse(MathUtility::isIntegerInRange(10, 1, 2));
@@ -348,10 +322,8 @@ final class MathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isIntegerInRangeRejectsOtherDataTypesDataProvider
-     */
+    #[DataProvider('isIntegerInRangeRejectsOtherDataTypesDataProvider')]
+    #[Test]
     public function isIntegerInRangeRejectsOtherDataTypes($inputValue): void
     {
         self::assertFalse(MathUtility::isIntegerInRange($inputValue, 0, 10));
diff --git a/typo3/sysext/core/Tests/Unit/Utility/PathUtilityPublicPathsTest.php b/typo3/sysext/core/Tests/Unit/Utility/PathUtilityPublicPathsTest.php
index 71f6a1231e09fe65776171cd559abd963e7c6903..9a5d3acd3544bca06ca815059b82520fa52e06b8 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/PathUtilityPublicPathsTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/PathUtilityPublicPathsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Resource\Exception\InvalidFileException;
 use TYPO3\CMS\Core\Utility\PathUtility;
@@ -81,9 +83,7 @@ final class PathUtilityPublicPathsTest extends UnitTestCase
         self::simulateWebRequest(Environment::getPublicPath(), $subDirectory);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tryingToResolveNonExtensionResourcesThrowsException(): void
     {
         $this->expectException(InvalidFileException::class);
@@ -91,9 +91,7 @@ final class PathUtilityPublicPathsTest extends UnitTestCase
         PathUtility::getPublicResourceWebPath('typo3/sysext/core/Resources/Public/Icons/Extension.svg');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tryingToResolvePrivateResourcesFromComposerPackagesThrowsException(): void
     {
         self::simulateWebRequestInComposerMode();
@@ -135,9 +133,9 @@ final class PathUtilityPublicPathsTest extends UnitTestCase
 
     /**
      * @throws InvalidFileException
-     * @dataProvider getPublicResourceWebPathResolvesUrlsCorrectlyDataProvider
-     * @test
      */
+    #[DataProvider('getPublicResourceWebPathResolvesUrlsCorrectlyDataProvider')]
+    #[Test]
     public function getPublicResourceWebPathResolvesUrlsCorrectly(string $pathReference, string $expectedUrl, callable $setup): void
     {
         $setup();
diff --git a/typo3/sysext/core/Tests/Unit/Utility/PathUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/PathUtilityTest.php
index 5e977c4b650f1406cd6642830e21705c024529fe..0f887d631fbed871d955a7929534dba1d2b51d6f 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/PathUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/PathUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Utility\PathUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -30,9 +32,9 @@ final class PathUtilityTest extends UnitTestCase
 
     /**
      * @param string $expected
-     * @dataProvider isCommonPrefixResolvedCorrectlyDataProvider
-     * @test
      */
+    #[DataProvider('isCommonPrefixResolvedCorrectlyDataProvider')]
+    #[Test]
     public function isCommonPrefixResolvedCorrectly(array $paths, $expected): void
     {
         $commonPrefix = PathUtility::getCommonPrefix($paths);
@@ -135,9 +137,9 @@ final class PathUtilityTest extends UnitTestCase
      * @param string $source
      * @param string $target
      * @param string $expected
-     * @dataProvider isRelativePathResolvedCorrectlyDataProvider
-     * @test
      */
+    #[DataProvider('isRelativePathResolvedCorrectlyDataProvider')]
+    #[Test]
     public function isRelativePathResolvedCorrectly($source, $target, $expected): void
     {
         $relativePath = PathUtility::getRelativePath($source, $target);
@@ -184,9 +186,9 @@ final class PathUtilityTest extends UnitTestCase
      * @param string $path
      * @param string $separator
      * @param string $expected
-     * @dataProvider isTrailingSeparatorSanitizedCorrectlyDataProvider
-     * @test
      */
+    #[DataProvider('isTrailingSeparatorSanitizedCorrectlyDataProvider')]
+    #[Test]
     public function isTrailingSeparatorSanitizedCorrectly($path, $separator, $expected): void
     {
         $sanitizedPath = PathUtility::sanitizeTrailingSeparator($path, $separator);
@@ -241,10 +243,8 @@ final class PathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getAbsolutePathOfRelativeReferencedFileOrPathResolvesFileCorrectlyDataProvider
-     */
+    #[DataProvider('getAbsolutePathOfRelativeReferencedFileOrPathResolvesFileCorrectlyDataProvider')]
+    #[Test]
     public function getAbsolutePathOfRelativeReferencedFileOrPathResolvesFileCorrectly(string $baseFileName, string $includeFileName, string $expectedFileName): void
     {
         $resolvedFilename = PathUtility::getAbsolutePathOfRelativeReferencedFileOrPath($baseFileName, $includeFileName);
@@ -354,10 +354,8 @@ final class PathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getCanonicalPathCorrectlyCleansPathDataProvider
-     */
+    #[DataProvider('getCanonicalPathCorrectlyCleansPathDataProvider')]
+    #[Test]
     public function getCanonicalPathCorrectlyCleansPath(string $inputName, string $expectedResult): void
     {
         // Ensure Environment runs as Windows test
@@ -405,10 +403,8 @@ final class PathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider dirnameDuringBootstrapCorrectlyFetchesParentDataProvider
-     */
+    #[DataProvider('dirnameDuringBootstrapCorrectlyFetchesParentDataProvider')]
+    #[Test]
     public function dirnameDuringBootstrapCorrectlyFetchesParent(string $inputPath, string $expectedResult): void
     {
         self::assertSame(
@@ -442,10 +438,8 @@ final class PathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider basenameDuringBootstrapCorrectlyFetchesBasenameDataProvider
-     */
+    #[DataProvider('basenameDuringBootstrapCorrectlyFetchesBasenameDataProvider')]
+    #[Test]
     public function basenameDuringBootstrapCorrectlyFetchesBasename(string $inputPath, string $expectedResult): void
     {
         self::assertSame(
@@ -510,10 +504,8 @@ final class PathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isAbsolutePathRespectsAllOperatingSystemsPathDataProvider
-     */
+    #[DataProvider('isAbsolutePathRespectsAllOperatingSystemsPathDataProvider')]
+    #[Test]
     public function isAbsolutePathRespectsAllOperatingSystems(string $inputPath, bool $isWindows, bool $expectedResult): void
     {
         if ($isWindows) {
@@ -552,10 +544,8 @@ final class PathUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider hasProtocolAndSchemeDataProvider
-     */
+    #[DataProvider('hasProtocolAndSchemeDataProvider')]
+    #[Test]
     public function hasProtocolAndScheme(string $url, bool $result): void
     {
         self::assertSame($result, PathUtility::hasProtocolAndScheme($url));
@@ -588,10 +578,8 @@ final class PathUtilityTest extends UnitTestCase
         yield [['/var/shared/'], '/var', false];
     }
 
-    /**
-     * @test
-     * @dataProvider allowedAdditionalPathsAreEvaluatedDataProvider
-     */
+    #[DataProvider('allowedAdditionalPathsAreEvaluatedDataProvider')]
+    #[Test]
     public function allowedAdditionalPathsAreEvaluated(mixed $lockRootPath, string $path, bool $expectation): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['BE']['lockRootPath'] = $lockRootPath;
diff --git a/typo3/sysext/core/Tests/Unit/Utility/PermutationUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/PermutationUtilityTest.php
index 830f53344148e996c70be07397e59dbf6c91620e..28ab742361c572fcf6801fcd0fa3ad610ae5e055 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/PermutationUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/PermutationUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Utility\Fixtures\StringValue;
 use TYPO3\CMS\Core\Utility\PermutationUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -101,10 +103,9 @@ final class PermutationUtilityTest extends UnitTestCase
 
     /**
      * @param array|int $expectation
-     *
-     * @test
-     * @dataProvider meltStringItemsDataProvider
      */
+    #[DataProvider('meltStringItemsDataProvider')]
+    #[Test]
     public function meltStringItemsIsExecuted(array $payload, $expectation): void
     {
         if (is_int($expectation)) {
@@ -184,10 +185,9 @@ final class PermutationUtilityTest extends UnitTestCase
 
     /**
      * @param array|int $expectation
-     *
-     * @test
-     * @dataProvider meltArrayItemsDataProvider
      */
+    #[DataProvider('meltArrayItemsDataProvider')]
+    #[Test]
     public function meltArrayItemsIsExecuted(array $payload, $expectation): void
     {
         if (is_int($expectation)) {
diff --git a/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php
index 279222776a02de99359d4be75be7e8458bd51ab3..f09e01bb333dc70d2d9652d032230ebf5c807f6e 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/RootlineUtilityTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
@@ -70,36 +71,28 @@ final class RootlineUtilityTest extends UnitTestCase
         self::assertSame($subsetCandidate, array_intersect_assoc($subsetCandidate, $superset));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isMountedPageWithoutMountPointsReturnsFalse(): void
     {
         $this->subject->__construct(1, '', new Context());
         self::assertFalse($this->subject->isMountedPage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isMountedPageWithMatchingMountPointParameterReturnsTrue(): void
     {
         $this->subject->__construct(1, '1-99', new Context());
         self::assertTrue($this->subject->isMountedPage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isMountedPageWithNonMatchingMountPointParameterReturnsFalse(): void
     {
         $this->subject->__construct(1, '99-99', new Context());
         self::assertFalse($this->subject->isMountedPage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processMountedPageWithNonMountedPageThrowsException(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -113,9 +106,7 @@ final class RootlineUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processMountedPageWithMountedPageNotThrowsException(): void
     {
         $this->subject->__construct(1, '1-99', new Context());
@@ -126,9 +117,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processMountedPageWithMountedPageAddsMountedFromParameter(): void
     {
         $this->subject->__construct(1, '1-99', new Context());
@@ -141,9 +130,7 @@ final class RootlineUtilityTest extends UnitTestCase
         self::assertSame(1, $result['_MOUNTED_FROM']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processMountedPageWithMountedPageAddsMountPointParameterToReturnValue(): void
     {
         $this->subject->__construct(1, '1-99', new Context());
@@ -156,9 +143,7 @@ final class RootlineUtilityTest extends UnitTestCase
         self::assertSame('1-99', $result['_MP_PARAM']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processMountedPageForMountPageIsOverlayAddsMountOLParameter(): void
     {
         $this->subject->__construct(1, '1-99', new Context());
@@ -171,9 +156,7 @@ final class RootlineUtilityTest extends UnitTestCase
         self::assertTrue($result['_MOUNT_OL']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processMountedPageForMountPageIsOverlayAddsDataInformationAboutMountPage(): void
     {
         $this->subject->__construct(1, '1-99', new Context());
@@ -189,9 +172,7 @@ final class RootlineUtilityTest extends UnitTestCase
         self::assertSame(['uid' => 99, 'pid' => 5, 'title' => 'TestCase'], $result['_MOUNT_PAGE']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processMountedPageForMountPageWithoutOverlayReplacesMountedPageWithMountPage(): void
     {
         $mountPointPageData = [
@@ -205,9 +186,7 @@ final class RootlineUtilityTest extends UnitTestCase
         $this->assertIsSubset($mountPointPageData, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnHasRelationToResolveDetectsGroupFieldAsLocal(): void
     {
         self::assertFalse($this->subject->_call('columnHasRelationToResolve', [
@@ -215,9 +194,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnHasRelationToResolveDetectsGroupFieldWithMMAsRemote2(): void
     {
         self::assertTrue($this->subject->_call('columnHasRelationToResolve', [
@@ -228,9 +205,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnHasRelationToResolveDetectsInlineFieldAsLocal(): void
     {
         self::assertFalse($this->subject->_call('columnHasRelationToResolve', [
@@ -240,9 +215,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnHasRelationToResolveDetectsInlineFieldWithForeignKeyAsRemote(): void
     {
         self::assertTrue($this->subject->_call('columnHasRelationToResolve', [
@@ -253,9 +226,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnHasRelationToResolveDetectsInlineFieldWithFMMAsRemote(): void
     {
         self::assertTrue($this->subject->_call('columnHasRelationToResolve', [
@@ -266,9 +237,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnHasRelationToResolveDetectsSelectFieldAsLocal(): void
     {
         self::assertFalse($this->subject->_call('columnHasRelationToResolve', [
@@ -278,9 +247,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function columnHasRelationToResolveDetectsSelectFieldWithMMAsRemote(): void
     {
         self::assertTrue($this->subject->_call('columnHasRelationToResolve', [
@@ -291,9 +258,7 @@ final class RootlineUtilityTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheIdentifierContainsAllContextParameters(): void
     {
         $this->subject->method('resolvePageId')->willReturn(42);
@@ -312,9 +277,7 @@ final class RootlineUtilityTest extends UnitTestCase
         self::assertSame('42_47-11_8_0_0_1', $this->subject->getCacheIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCacheIdentifierReturnsValidIdentifierWithCommasInMountPointParameter(): void
     {
         $this->subject->method('resolvePageId')->willReturn(42);
diff --git a/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentCollectionTest.php b/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentCollectionTest.php
index f9df1919513dd75fbf3c0bbbe8d7616131e4d70b..bd8efc8b2c2d07bb9c80635ec241ac2b54b1c634 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentCollectionTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentCollectionTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility\String;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\String\StringFragment;
 use TYPO3\CMS\Core\Utility\String\StringFragmentCollection;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class StringFragmentCollectionTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function collectionReflectsFragments(): void
     {
         $a = StringFragment::raw('aa');
@@ -64,10 +64,9 @@ final class StringFragmentCollectionTest extends UnitTestCase
      * @param list<StringFragment> $first
      * @param list<StringFragment> $second
      * @param list<StringFragment> $expectations
-     *
-     * @test
-     * @dataProvider differencesAreResolvedDataProvider
      */
+    #[DataProvider('differencesAreResolvedDataProvider')]
+    #[Test]
     public function differencesAreResolved(array $first, array $second, array $expectations): void
     {
         $firstCollection = new StringFragmentCollection(...$first);
@@ -103,10 +102,9 @@ final class StringFragmentCollectionTest extends UnitTestCase
      * @param list<StringFragment> $first
      * @param list<StringFragment> $second
      * @param list<StringFragment> $expectations
-     *
-     * @test
-     * @dataProvider intersectionsAreResolvedDataProvider
      */
+    #[DataProvider('intersectionsAreResolvedDataProvider')]
+    #[Test]
     public function intersectionsAreResolved(array $first, array $second, array $expectations): void
     {
         $firstCollection = new StringFragmentCollection(...$first);
diff --git a/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentSplitterTest.php b/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentSplitterTest.php
index c54f148de3b038f7d680bb18845f6b6112a81a28..c9a06d9f05065cc90b6d5d56b1879fe370c321f4 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentSplitterTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/String/StringFragmentSplitterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility\String;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\String\StringFragment;
 use TYPO3\CMS\Core\Utility\String\StringFragmentPattern;
 use TYPO3\CMS\Core\Utility\String\StringFragmentSplitter;
@@ -78,10 +80,9 @@ final class StringFragmentSplitterTest extends UnitTestCase
     /**
      * @param list<StringFragmentPattern> $patterns
      * @param list<StringFragment> $expectations
-     *
-     * @test
-     * @dataProvider stringIsSplitDataProvider
      */
+    #[DataProvider('stringIsSplitDataProvider')]
+    #[Test]
     public function stringIsSplit(string $value, array $patterns, int $flags, ?array $expectations): void
     {
         $splitter = new StringFragmentSplitter(...$patterns);
diff --git a/typo3/sysext/core/Tests/Unit/Utility/StringUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/StringUtilityTest.php
index 9eaeedf7d7933f8d3a186ca52950e67d01e309df..ea1ec3a33d88d8b1445caf34895f2830979e7887 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/StringUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/StringUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ApplicationType;
 use TYPO3\CMS\Core\Utility\StringUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -35,10 +37,8 @@ final class StringUtilityTest extends UnitTestCase
         yield 'bool' => [true];
     }
 
-    /**
-     * @test
-     * @dataProvider stringCastableValuesDataProvider
-     */
+    #[DataProvider('stringCastableValuesDataProvider')]
+    #[Test]
     public function castWithStringCastableReturnsValueCastToString(mixed $value): void
     {
         $expected = (string)$value;
@@ -62,10 +62,8 @@ final class StringUtilityTest extends UnitTestCase
         yield 'NaN' => [acos(2)];
     }
 
-    /**
-     * @test
-     * @dataProvider nonStringCastableValuesDataProvider
-     */
+    #[DataProvider('nonStringCastableValuesDataProvider')]
+    #[Test]
     public function castWithWithNonStringCastableReturnsDefault(mixed $value): void
     {
         $default = 'default';
@@ -73,10 +71,8 @@ final class StringUtilityTest extends UnitTestCase
         self::assertSame($default, StringUtility::cast($value, $default));
     }
 
-    /**
-     * @test
-     * @dataProvider nonStringCastableValuesDataProvider
-     */
+    #[DataProvider('nonStringCastableValuesDataProvider')]
+    #[Test]
     public function castWithWithNonStringCastableAndNoDefaultProvidedReturnsNull(mixed $value): void
     {
         self::assertNull(StringUtility::cast($value));
@@ -101,10 +97,8 @@ final class StringUtilityTest extends UnitTestCase
         yield 'NaN' => [acos(2)];
     }
 
-    /**
-     * @test
-     * @dataProvider nonStringValueToFilterDataProvider
-     */
+    #[DataProvider('nonStringValueToFilterDataProvider')]
+    #[Test]
     public function filterForNonStringValueAndDefaultProvidedReturnsDefault(mixed $value): void
     {
         $default = 'default';
@@ -112,10 +106,8 @@ final class StringUtilityTest extends UnitTestCase
         self::assertSame($default, StringUtility::filter($value, $default));
     }
 
-    /**
-     * @test
-     * @dataProvider nonStringValueToFilterDataProvider
-     */
+    #[DataProvider('nonStringValueToFilterDataProvider')]
+    #[Test]
     public function filterForNonStringValueAndNoDefaultProvidedReturnsNull(mixed $value): void
     {
         self::assertNull(StringUtility::filter($value));
@@ -129,36 +121,28 @@ final class StringUtilityTest extends UnitTestCase
         yield 'empty string' => [''];
         yield 'non-empty string' => ['value'];
     }
-    /**
-     * @test
-     * @dataProvider stringValueToFilterDataProvider
-     */
+    #[DataProvider('stringValueToFilterDataProvider')]
+    #[Test]
     public function filterForStringValuesReturnsProvidedValue(string $value): void
     {
         self::assertSame($value, StringUtility::filter($value, 'some default'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUniqueIdReturnsIdWithPrefix(): void
     {
         $id = StringUtility::getUniqueId('NEW');
         self::assertEquals('NEW', substr($id, 0, 3));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUniqueIdReturnsIdWithoutDot(): void
     {
         self::assertStringNotContainsString('.', StringUtility::getUniqueId());
     }
 
-    /**
-     * @test
-     * @dataProvider escapeCssSelectorDataProvider
-     */
+    #[DataProvider('escapeCssSelectorDataProvider')]
+    #[Test]
     public function escapeCssSelector(string $selector, string $expectedValue): void
     {
         self::assertEquals($expectedValue, StringUtility::escapeCssSelector($selector));
@@ -175,10 +159,8 @@ final class StringUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider removeByteOrderMarkDataProvider
-     */
+    #[DataProvider('removeByteOrderMarkDataProvider')]
+    #[Test]
     public function removeByteOrderMark(string $input, string $expectedValue): void
     {
         // assertContains is necessary as one test contains non-string characters
@@ -199,10 +181,8 @@ final class StringUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider searchStringWildcardDataProvider
-     */
+    #[DataProvider('searchStringWildcardDataProvider')]
+    #[Test]
     public function searchStringWildcard(string $haystack, string $needle, bool $result): void
     {
         self::assertSame($result, StringUtility::searchStringWildcard($haystack, $needle));
@@ -265,10 +245,8 @@ final class StringUtilityTest extends UnitTestCase
         yield 'List with multiple consecutive commas' => ['one,,two', 'one,two'];
     }
 
-    /**
-     * @test
-     * @dataProvider uniqueListUnifiesCommaSeparatedListDataProvider
-     */
+    #[DataProvider('uniqueListUnifiesCommaSeparatedListDataProvider')]
+    #[Test]
     public function uniqueListUnifiesCommaSeparatedList(string $initialList, string $unifiedList): void
     {
         self::assertSame($unifiedList, StringUtility::uniqueList($initialList));
@@ -297,10 +275,9 @@ final class StringUtilityTest extends UnitTestCase
     /**
      * Tests that StringUtility::multibyteStringPad() returns the same value as \str_pad()
      * for ASCII strings.
-     *
-     * @test
-     * @dataProvider multibyteStringPadReturnsSameValueAsStrPadForAsciiStringsDataProvider
      */
+    #[DataProvider('multibyteStringPadReturnsSameValueAsStrPadForAsciiStringsDataProvider')]
+    #[Test]
     public function multibyteStringPadReturnsSameValueAsStrPadForAsciiStrings(string $string, int $length, string $pad_string, int $pad_type): void
     {
         self::assertEquals(
@@ -326,10 +303,8 @@ final class StringUtilityTest extends UnitTestCase
         yield 'Pad both to 8 with string with even length and 2 character padding with MB char'  => ['äöähüäöä', 'hü', 8, 'äö', STR_PAD_BOTH];
     }
 
-    /**
-     * @test
-     * @dataProvider multibyteStringPadReturnsCorrectResultsMultibyteDataProvider
-     */
+    #[DataProvider('multibyteStringPadReturnsCorrectResultsMultibyteDataProvider')]
+    #[Test]
     public function multibyteStringPadReturnsCorrectResultsMultibyte(string $expectedResult, string $string, int $length, string $pad_string, int $pad_type): void
     {
         self::assertEquals(
@@ -349,10 +324,8 @@ final class StringUtilityTest extends UnitTestCase
         yield [random_bytes(33)];
     }
 
-    /**
-     * @test
-     * @dataProvider base64urlRoundTripWorksDataProvider
-     */
+    #[DataProvider('base64urlRoundTripWorksDataProvider')]
+    #[Test]
     public function base64urlRoundTripWorks(string $rawValue): void
     {
         $encoded = StringUtility::base64urlEncode($rawValue);
@@ -371,19 +344,15 @@ final class StringUtilityTest extends UnitTestCase
         yield ['aaaa', 'YWFhYQ'];
     }
 
-    /**
-     * @test
-     * @dataProvider base64urlDataProvider
-     */
+    #[DataProvider('base64urlDataProvider')]
+    #[Test]
     public function base64urlEncodeWorks(string $rawValue, string $encodedValue): void
     {
         self::assertSame($encodedValue, StringUtility::base64urlEncode($rawValue));
     }
 
-    /**
-     * @test
-     * @dataProvider base64urlDataProvider
-     */
+    #[DataProvider('base64urlDataProvider')]
+    #[Test]
     public function base64urlDecodeWorks(string $rawValue, string $encodedValue): void
     {
         self::assertSame($rawValue, StringUtility::base64urlDecode($encodedValue));
@@ -406,10 +375,8 @@ final class StringUtilityTest extends UnitTestCase
         yield ["Y\tW\tE", 'aa'];
     }
 
-    /**
-     * @test
-     * @dataProvider base64urlStrictDataProvider
-     */
+    #[DataProvider('base64urlStrictDataProvider')]
+    #[Test]
     public function base64urlStrictDecodeWorks(string $encodedValue, string|bool $expectation): void
     {
         self::assertSame($expectation, StringUtility::base64urlDecode($encodedValue, true));
@@ -456,10 +423,8 @@ final class StringUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider explodeEscapedDataProvider
-     */
+    #[DataProvider('explodeEscapedDataProvider')]
+    #[Test]
     public function explodeEscapedWorks(string $escaped, array $unescapedExploded): void
     {
         self::assertSame($unescapedExploded, StringUtility::explodeEscaped('.', $escaped));
diff --git a/typo3/sysext/core/Tests/Unit/Utility/VersionNumberUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/VersionNumberUtilityTest.php
index 0684d0c3edbad60672c86fb846e6cb069524b9ed..ca298ed858bae268ca3e6f2a5ad53661c74a10b6 100644
--- a/typo3/sysext/core/Tests/Unit/Utility/VersionNumberUtilityTest.php
+++ b/typo3/sysext/core/Tests/Unit/Utility/VersionNumberUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\Unit\Utility\Fixtures\VersionNumberUtilityFixture;
 use TYPO3\CMS\Core\Utility\VersionNumberUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -59,10 +61,9 @@ final class VersionNumberUtilityTest extends UnitTestCase
     /**
      * Check whether getNumericTypo3Version handles all kinds of valid
      * version strings
-     *
-     * @dataProvider getNumericTypo3VersionNumberDataProvider
-     * @test
      */
+    #[DataProvider('getNumericTypo3VersionNumberDataProvider')]
+    #[Test]
     public function getNumericTypo3VersionNumber(string $currentVersion, string $expectedVersion): void
     {
         VersionNumberUtilityFixture::$versionNumber = $currentVersion;
@@ -99,10 +100,8 @@ final class VersionNumberUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider convertVersionsStringToVersionNumbersForcesVersionNumberInRangeDataProvider
-     */
+    #[DataProvider('convertVersionsStringToVersionNumbersForcesVersionNumberInRangeDataProvider')]
+    #[Test]
     public function convertVersionsStringToVersionNumbersForcesVersionNumberInRange(string $versionString, array $expectedResult): void
     {
         $versions = VersionNumberUtility::convertVersionsStringToVersionNumbers($versionString);
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicMethodDeprecationTraitTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicMethodDeprecationTraitTest.php
index 07582c6c7825f7df547f27e072ad77027027b1a4..23bb67d37bec0785a11de09ca634c1069c29085a 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicMethodDeprecationTraitTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicMethodDeprecationTraitTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Compatibility;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Tests\UnitDeprecated\Compatibility\Fixtures\PublicMethodDeprecationTraitTextFixture;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PublicMethodDeprecationTraitTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function publicMethodCanBeCalled(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -32,27 +31,21 @@ final class PublicMethodDeprecationTraitTest extends UnitTestCase
         (new PublicMethodDeprecationTraitTextFixture())->standardPublicMethod();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function protectedMethodNotHandledByTraitThrowsError(): void
     {
         $this->expectException(\Error::class);
         (new PublicMethodDeprecationTraitTextFixture())->standardProtectedMethod();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function notExistingMethodThrowsError(): void
     {
         $this->expectException(\Error::class);
         (new PublicMethodDeprecationTraitTextFixture())->doesNotExist();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function methodMadeProtectedCanBeCalled(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -60,17 +53,13 @@ final class PublicMethodDeprecationTraitTest extends UnitTestCase
         (new PublicMethodDeprecationTraitTextFixture())->methodMadeProtected();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function methodMadeProtectedReturnsValue(): void
     {
         self::assertEquals('foo', (new PublicMethodDeprecationTraitTextFixture())->methodMadeProtectedWithReturn());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function methodMadeProtectedCanBeCalledWithArguments(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php
index 4c1f2de6538a1fd1fc061dcab01d1a6c0c3d76c0..97b54b9a960e3461e0fc1c5fb85c7de9928bb21e 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Compatibility/PublicPropertyDeprecationTraitTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Compatibility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Compatibility\PublicPropertyDeprecationTrait;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -77,18 +79,14 @@ final class PublicPropertyDeprecationTraitTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider issetDataProvider
-     * @test
-     */
+    #[DataProvider('issetDataProvider')]
+    #[Test]
     public function issetWorksAsExpected(bool $expected, string $property): void
     {
         self::assertSame($expected, isset($this->fixture->$property));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unknownPropertyCanBeHandledAsUsual(): void
     {
         // Uses __isset()
@@ -105,9 +103,7 @@ final class PublicPropertyDeprecationTraitTest extends UnitTestCase
         self::assertFalse(isset($this->fixture->unknownProperty));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function publicPropertyCanBeHandledAsUsual(): void
     {
         self::assertFalse(isset($this->fixture->unsetPublicProperty));
@@ -118,9 +114,7 @@ final class PublicPropertyDeprecationTraitTest extends UnitTestCase
         self::assertFalse(isset($this->fixture->unsetPublicProperty));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function taggedPropertyCanBeHandledLikePublicProperty(): void
     {
         self::assertFalse(isset($this->fixture->unsetTaggedProperty));
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/FlexForm/FlexFormToolsTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/FlexForm/FlexFormToolsTest.php
index 9ff6b6615223d14cfde507bcde54a5ca4e170c14..106309729c741efd74f3d18676919595d52375df 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/FlexForm/FlexFormToolsTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/FlexForm/FlexFormToolsTest.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Configuration\FlexForm;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -56,10 +58,8 @@ final class FlexFormToolsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider tceFormsRemovedInMigrationDataProvider
-     * @test
-     */
+    #[DataProvider('tceFormsRemovedInMigrationDataProvider')]
+    #[Test]
     public function tceFormsRemovedInMigration(array $dataStructure, array $expected): void
     {
         $eventDispatcher = new class () implements EventDispatcherInterface {
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Loader/PageTsConfigLoaderTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Loader/PageTsConfigLoaderTest.php
index 74fad1e1a25aa008bebbe3d0dba54dde57436cbb..7d4b6a8dbdbcf533b1787316f634148de929b761 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Loader/PageTsConfigLoaderTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Loader/PageTsConfigLoaderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Configuration\Loader;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Configuration\Event\ModifyLoadedPageTsConfigEvent;
 use TYPO3\CMS\Core\Configuration\Loader\PageTsConfigLoader;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PageTsConfigLoaderTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function alwaysLoadDefaultSettings(): void
     {
         $expected = [
@@ -45,9 +44,7 @@ final class PageTsConfigLoaderTest extends UnitTestCase
         self::assertSame($expectedString, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadDefaultSettingsAtTheBeginningAndKeepEmptyEntriesExpectUidZero(): void
     {
         $expected = [
@@ -64,9 +61,7 @@ final class PageTsConfigLoaderTest extends UnitTestCase
         self::assertSame($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadExternalInclusionsCorrectlyAndKeepLoadingOrder(): void
     {
         $expected = [
@@ -83,9 +78,7 @@ final class PageTsConfigLoaderTest extends UnitTestCase
         self::assertSame($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidExternalFileIsNotLoaded(): void
     {
         $expected = [
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Parser/PageTsConfigParserTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Parser/PageTsConfigParserTest.php
index 3993a0e2cac5644477073d7cd9f96334f371d6b4..acb6d5410114cdc0f68d1be8c986d8df073dc59d 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Parser/PageTsConfigParserTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/Parser/PageTsConfigParserTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Configuration\Parser;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Cache\Backend\TransientMemoryBackend;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
@@ -30,9 +31,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PageTsConfigParserTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidCacheAlwaysExecutesMatcher(): void
     {
         $input = 'mod.web_layout = disabled';
@@ -53,9 +52,7 @@ final class PageTsConfigParserTest extends UnitTestCase
         self::assertEquals($expectedParsedTsConfig, $parsedTsConfig);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function cachedHitOnlyExecutesMatcher(): void
     {
         $cachedSection = 'mod.web_layout = disabled';
@@ -83,9 +80,7 @@ final class PageTsConfigParserTest extends UnitTestCase
         self::assertEquals($expectedParsedTsConfig, $parsedTsConfig);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseReplacesSiteSettings(): void
     {
         $input = 'mod.web_layout = {$numberedThings.1}' . "\n" .
@@ -132,9 +127,7 @@ final class PageTsConfigParserTest extends UnitTestCase
         self::assertEquals($expectedParsedTsConfig, $parsedTsConfig);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseReplacesSiteSettingsWithMultipleSitesAndCache(): void
     {
         $input = 'mod.web_layout = {$numberedThings.1}';
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php
index ef769856a7aef0a781a9fed0097798bbfc282234..73b9e6f5170cf23b906f4939837e67db416f593d 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Configuration\TypoScript\ConditionMatching;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Backend\Configuration\TypoScript\ConditionMatching\ConditionMatcher;
 use TYPO3\CMS\Core\Cache\CacheManager;
@@ -109,10 +111,8 @@ final class AbstractConditionMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider requestFunctionDataProvider
-     */
+    #[DataProvider('requestFunctionDataProvider')]
+    #[Test]
     public function checkConditionMatcherForRequestFunction(string $expression, bool $expected): void
     {
         $request = (new ServerRequest())
@@ -142,10 +142,8 @@ final class AbstractConditionMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider datesFunctionDataProvider
-     */
+    #[DataProvider('datesFunctionDataProvider')]
+    #[Test]
     public function checkConditionMatcherForDateFunction(string $format, int $expressionValue, bool $expected): void
     {
         $GLOBALS['SIM_EXEC_TIME'] = gmmktime(11, 4, 0, 1, 17, 1945);
@@ -157,9 +155,7 @@ final class AbstractConditionMatcherTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkConditionMatcherForFeatureFunction(): void
     {
         $featureName = 'test.testFeature';
@@ -212,10 +208,8 @@ final class AbstractConditionMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchingApplicationContextConditionsDataProvider
-     */
+    #[DataProvider('matchingApplicationContextConditionsDataProvider')]
+    #[Test]
     public function evaluateConditionCommonReturnsTrueForMatchingContexts($matchingContextCondition): void
     {
         Environment::initialize(
@@ -253,10 +247,8 @@ final class AbstractConditionMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider notMatchingApplicationContextConditionsDataProvider
-     */
+    #[DataProvider('notMatchingApplicationContextConditionsDataProvider')]
+    #[Test]
     public function evaluateConditionCommonReturnsNullForNotMatchingApplicationContexts($notMatchingApplicationContextCondition): void
     {
         Environment::initialize(
@@ -330,10 +322,8 @@ final class AbstractConditionMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider evaluateConditionCommonDevIpMaskDataProvider
-     */
+    #[DataProvider('evaluateConditionCommonDevIpMaskDataProvider')]
+    #[Test]
     public function evaluateConditionCommonEvaluatesIpAddressesCorrectly($devIpMask, $actualIp, $expectedResult): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'] = $devIpMask;
@@ -357,9 +347,7 @@ final class AbstractConditionMatcherTest extends UnitTestCase
         self::assertSame($expectedResult, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function typoScriptElseConditionIsNotEvaluatedAndAlwaysReturnsFalse(): void
     {
         $this->initConditionMatcher();
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/BackendWorkspaceRestrictionTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/BackendWorkspaceRestrictionTest.php
index 97b896cb308ad49ded013f70b34b7b771ba24307..c86d58976aff1ad6a943fe292f03e943f6819946 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/BackendWorkspaceRestrictionTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/BackendWorkspaceRestrictionTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction;
 use TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction\AbstractRestrictionTestCase;
 
 final class BackendWorkspaceRestrictionTest extends AbstractRestrictionTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsLiveWorkspaceWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -35,9 +34,7 @@ final class BackendWorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(("aTable"."t3ver_wsid" = 0) OR ("aTable"."t3ver_state" <= 0))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsNonLiveWorkspaceWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -48,9 +45,7 @@ final class BackendWorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(("aTable"."t3ver_wsid" = 42) OR ("aTable"."t3ver_state" <= 0))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsLiveWorkspaceLimitedWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
@@ -61,9 +56,7 @@ final class BackendWorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(("aTable"."t3ver_wsid" = 0) AND ("aTable"."t3ver_oid" = 0))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsNonLiveWorkspaceLimitedWhereClause(): void
     {
         $GLOBALS['TCA']['aTable']['ctrl'] = [
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/FrontendWorkspaceRestrictionTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/FrontendWorkspaceRestrictionTest.php
index 321bbccce572a96709bc15ccf7d92fbc33d449f5..af9a2f1ee6e6a59d2ec01597f4bf941d036f4c1c 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/FrontendWorkspaceRestrictionTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Database/Query/Restriction/FrontendWorkspaceRestrictionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Database\Query\Restriction;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Query\Restriction\FrontendWorkspaceRestriction;
 use TYPO3\CMS\Core\Tests\Unit\Database\Query\Restriction\AbstractRestrictionTestCase;
 
@@ -24,9 +25,7 @@ final class FrontendWorkspaceRestrictionTest extends AbstractRestrictionTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsLiveWorkspaceWhereClause(): void
     {
         $GLOBALS['TCA'] = [
@@ -42,9 +41,7 @@ final class FrontendWorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(("aTable"."t3ver_state" <= 0) AND ("aTable"."t3ver_oid" = 0))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsNonLiveWorkspaceWhereClause(): void
     {
         $GLOBALS['TCA'] = [
@@ -60,9 +57,7 @@ final class FrontendWorkspaceRestrictionTest extends AbstractRestrictionTestCase
         self::assertSame('(((("aTable"."t3ver_wsid" = 0) OR ("aTable"."t3ver_wsid" = 42))) AND ("aTable"."t3ver_oid" = 0))', (string)$expression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildExpressionAddsNonLiveWorkspaceExclusiveWhereClause(): void
     {
         $GLOBALS['TCA'] = [
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Domain/Repository/PageRepositoryTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Domain/Repository/PageRepositoryTest.php
index 11a3fc81c366dc0752835661c72def4e88217acc..5d4f51e64e3332e5803e18376be8fa2ef3706fc3 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Domain/Repository/PageRepositoryTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Domain/Repository/PageRepositoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Domain\Repository;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder;
@@ -63,9 +64,7 @@ final class PageRepositoryTest extends UnitTestCase
     ///////////////////////////////
     // Tests concerning getExtURL
     ///////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtUrlForDokType3UsesTheSameValue(): void
     {
         self::assertEquals('http://www.example.com', $this->pageSelectObject->getExtURL([
@@ -74,9 +73,7 @@ final class PageRepositoryTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtUrlForDokType3PrependsSiteUrl(): void
     {
         $request = (new ServerRequest('https://foo.de', 'GET'))
@@ -91,9 +88,7 @@ final class PageRepositoryTest extends UnitTestCase
         unset($GLOBALS['TYPO3_REQUEST']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtUrlForDokType3AssumesAbsoluteUrl(): void
     {
         self::assertEquals('/hello/world/', $this->pageSelectObject->getExtURL([
@@ -102,9 +97,7 @@ final class PageRepositoryTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtUrlForDokType3UsesEmailAsSameValue(): void
     {
         self::assertEquals('mailto:mail@typo3-test.com', $this->pageSelectObject->getExtURL([
@@ -113,9 +106,7 @@ final class PageRepositoryTest extends UnitTestCase
         ]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtUrlForDokType3UsesValidEmailWithoutProtocolAsEmail(): void
     {
         self::assertEquals('mailto:mail@typo3-test.com', $this->pageSelectObject->getExtURL([
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php b/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php
index c87306a86a5caf202f09d5cb5f7cd699829639d2..8ac94151a2711c438c7aa6f6173f68d87ddd2f19 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/FormProtection/FormProtectionFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\FormProtection;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Cache\Backend\TransientMemoryBackend;
@@ -65,9 +66,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
     /////////////////////////
     // Tests concerning get
     /////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function getForNotExistingClassThrowsException(): void
     {
         GeneralUtility::addInstance(FormProtectionFactory::class, $this->subject);
@@ -77,9 +76,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         FormProtectionFactory::get('noSuchClass');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForClassThatIsNoFormProtectionSubclassThrowsException(): void
     {
         GeneralUtility::addInstance(FormProtectionFactory::class, $this->subject);
@@ -89,9 +86,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         FormProtectionFactory::get(\stdClass::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForTypeBackEndWithExistingBackEndReturnsBackEndFormProtection(): void
     {
         GeneralUtility::addInstance(FormProtectionFactory::class, $this->subject);
@@ -107,9 +102,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForTypeBackEndCalledTwoTimesReturnsTheSameInstance(): void
     {
         GeneralUtility::addInstance(FormProtectionFactory::class, $this->subject);
@@ -127,9 +120,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForTypeInstallToolReturnsInstallToolFormProtection(): void
     {
         GeneralUtility::addInstance(FormProtectionFactory::class, $this->subject);
@@ -139,9 +130,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForTypeInstallToolCalledTwoTimesReturnsTheSameInstance(): void
     {
         GeneralUtility::addInstance(FormProtectionFactory::class, $this->subject);
@@ -152,9 +141,7 @@ final class FormProtectionFactoryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForTypesInstallToolAndDisabledReturnsDifferentInstances(): void
     {
         GeneralUtility::addInstance(FormProtectionFactory::class, $this->subject);
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php
index 0d34511a54e00ef8eba8e99bd77d416f833b2027..7eb0ce30e922683cf57f58bffe4be439e3c5851c 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Resource/Utility/FileExtensionFilterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Resource\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\DataHandling\DataHandler;
 use TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
@@ -50,9 +52,9 @@ final class FileExtensionFilterTest extends UnitTestCase
      * @param array|string $allowed
      * @param array|string $disallowed
      * @param array|string $values
-     * @test
-     * @dataProvider invalidInlineChildrenFilterParametersDataProvider
      */
+    #[DataProvider('invalidInlineChildrenFilterParametersDataProvider')]
+    #[Test]
     public function areInlineChildrenFilteredWithInvalidParameters($allowed, $disallowed, $values): void
     {
         $parameters = [
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php b/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php
index c2db2b2fde5edeba55d6f007f11bedfe28b06831..614681076532ed6343a2e810440eff47acdc36c7 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/Parser/TypoScriptParserTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\TypoScript\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Backend\Configuration\TypoScript\ConditionMatching\ConditionMatcher;
 use TYPO3\CMS\Core\Cache\CacheManager;
@@ -228,10 +230,8 @@ final class TypoScriptParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider executeValueModifierDataProvider
-     */
+    #[DataProvider('executeValueModifierDataProvider')]
+    #[Test]
     public function executeValueModifierReturnsModifiedResult(
         string $modifierName,
         string $currentValue,
@@ -289,10 +289,8 @@ final class TypoScriptParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider executeGetEnvModifierDataProvider
-     */
+    #[DataProvider('executeGetEnvModifierDataProvider')]
+    #[Test]
     public function executeGetEnvModifierReturnsModifiedResult(
         array $environmentVariables,
         ?string $currentValue,
@@ -335,10 +333,8 @@ final class TypoScriptParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider executeValueModifierInvalidDataProvider
-     */
+    #[DataProvider('executeValueModifierInvalidDataProvider')]
+    #[Test]
     public function executeValueModifierThrowsException(
         string $modifierName,
         string $currentValue,
@@ -349,9 +345,7 @@ final class TypoScriptParserTest extends UnitTestCase
         $this->typoScriptParser->_call('executeValueModifier', $modifierName, $modifierArgument, $currentValue);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidCharactersInObjectNamesAreReported(): void
     {
         $timeTrackerMock = $this->createMock(TimeTracker::class);
@@ -372,10 +366,8 @@ final class TypoScriptParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidConditionsDataProvider
-     */
+    #[DataProvider('invalidConditionsDataProvider')]
+    #[Test]
     public function invalidConditionsAreReported(string $condition, bool $isValid): void
     {
         $timeTrackerMock = $this->createMock(TimeTracker::class);
@@ -388,9 +380,7 @@ final class TypoScriptParserTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emptyConditionIsReported(): void
     {
         $timeTrackerMock = $this->createMock(TimeTracker::class);
@@ -411,10 +401,8 @@ final class TypoScriptParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider doubleSlashCommentsDataProvider
-     */
+    #[DataProvider('doubleSlashCommentsDataProvider')]
+    #[Test]
     public function doubleSlashCommentsAreValid(string $typoScript): void
     {
         $this->typoScriptParser->parse($typoScript);
@@ -439,10 +427,8 @@ final class TypoScriptParserTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider includeFileDataProvider
-     */
+    #[DataProvider('includeFileDataProvider')]
+    #[Test]
     public function includeFilesWithConditions(string $typoScript): void
     {
         // This test triggers a BackendUtility::BEgetRootLine() down below, we need to suppress the cache call
@@ -661,10 +647,8 @@ test.TYPO3Forever.TypoScript = 1
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider importFilesDataProvider
-     */
+    #[DataProvider('importFilesDataProvider')]
+    #[Test]
     public function importFiles(string $typoScript, string $expected): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'secret-encryption-key-test';
@@ -673,10 +657,8 @@ test.TYPO3Forever.TypoScript = 1
         self::assertEquals($expected, $resolvedIncludeLines);
     }
 
-    /**
-     * @dataProvider typoScriptIsParsedToArrayDataProvider
-     * @test
-     */
+    #[DataProvider('typoScriptIsParsedToArrayDataProvider')]
+    #[Test]
     public function typoScriptIsParsedToArray(string $typoScript, array $expected): void
     {
         $this->typoScriptParser->parse($typoScript);
@@ -1117,9 +1099,7 @@ test.TYPO3Forever.TypoScript = 1
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValCanBeCalledWithArrayValueParameter(): void
     {
         $string = '';
@@ -1136,9 +1116,7 @@ test.TYPO3Forever.TypoScript = 1
         $mock($typoScriptParser);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValCanBeCalledWithStringValueParameter(): void
     {
         $string = '';
@@ -1155,10 +1133,8 @@ test.TYPO3Forever.TypoScript = 1
         $mock($typoScriptParser);
     }
 
-    /**
-     * @test
-     * @dataProvider parseNextKeySegmentReturnsCorrectNextKeySegmentDataProvider
-     */
+    #[DataProvider('parseNextKeySegmentReturnsCorrectNextKeySegmentDataProvider')]
+    #[Test]
     public function parseNextKeySegmentReturnsCorrectNextKeySegment(
         string $key,
         string $expectedKeySegment,
@@ -1226,9 +1202,7 @@ test.TYPO3Forever.TypoScript = 1
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function typoScriptWithModifierReturningNullDoesNotCreateErrors(): void
     {
         $typoScript = '
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/TemplateServiceTest.php b/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/TemplateServiceTest.php
index 39d97a4cee01f356ed48f1a2371db714684746c1..dc0bc6f47d81779a5b908a25ed8050df4670e9a0 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/TemplateServiceTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/TypoScript/TemplateServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\TypoScript;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Database\ConnectionPool;
@@ -77,9 +78,7 @@ final class TemplateServiceTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extensionStaticFilesAreNotProcessedIfNotExplicitlyRequested(): void
     {
         $queryBuilderMock = $this->createMock(QueryBuilder::class);
@@ -96,9 +95,7 @@ final class TemplateServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extensionStaticsAreProcessedIfExplicitlyRequested(): void
     {
         $queryBuilderMock = $this->createMock(QueryBuilder::class);
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
index 1bdf2cf428b14a67c9e86edce1c0cc9c0f0ba588..576dcb6f8406f21fd0c09e54dd1b5f9cdd15e35c 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Utility/GeneralUtilityTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class GeneralUtilityTest extends UnitTestCase
 {
-    /**
-     * @test
-     * @dataProvider gpMergedDataProvider
-     */
+    #[DataProvider('gpMergedDataProvider')]
+    #[Test]
     public function gpMergedWillMergeArraysFromGetAndPost($get, $post, $expected): void
     {
         $_POST = $post;
@@ -66,20 +66,16 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getAndPostDataProvider
-     */
+    #[DataProvider('getAndPostDataProvider')]
+    #[Test]
     public function canRetrieveGlobalInputsThroughGet($key, $get, $expected): void
     {
         $_GET = $get;
         self::assertSame($expected, GeneralUtility::_GET($key));
     }
 
-    /**
-     * @test
-     * @dataProvider getAndPostDataProvider
-     */
+    #[DataProvider('getAndPostDataProvider')]
+    #[Test]
     public function canRetrieveGlobalInputsThroughPost($key, $post, $expected): void
     {
         $_POST = $post;
@@ -104,10 +100,8 @@ final class GeneralUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider gpDataProvider
-     */
+    #[DataProvider('gpDataProvider')]
+    #[Test]
     public function canRetrieveValueWithGP($key, $get, $post, $expected): void
     {
         $_GET = $get;
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Utility/PathUtilityPublicPathsTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Utility/PathUtilityPublicPathsTest.php
index df8b34c8f427bd06ee3bdc57a0fcda5448ce459a..d02e2caec6041033d65d6c05285ef2aaa43fbf68 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Utility/PathUtilityPublicPathsTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Utility/PathUtilityPublicPathsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Resource\Exception\InvalidFileException;
 use TYPO3\CMS\Core\Utility\PathUtility;
@@ -89,9 +91,9 @@ final class PathUtilityPublicPathsTest extends UnitTestCase
 
     /**
      * @throws InvalidFileException
-     * @dataProvider getPublicResourceWebPathResolvesUrlsCorrectlyDataProvider
-     * @test
      */
+    #[DataProvider('getPublicResourceWebPathResolvesUrlsCorrectlyDataProvider')]
+    #[Test]
     public function getPublicResourceWebPathResolvesUrlsCorrectly(string $pathReference, string $expectedUrl, callable $setup): void
     {
         $setup();
diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php
index 3ec11a76e72ef58efe501b36abe2e91888b0cd64..0ee3c1316b3fa71263999e9f769ff9cbb84fd3cb 100644
--- a/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php
+++ b/typo3/sysext/core/Tests/UnitDeprecated/Utility/ResourceUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\UnitDeprecated\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\ResourceUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -63,10 +65,8 @@ final class ResourceUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider recursiveFileListSortingHelperTestDataProvider
-     * @test
-     */
+    #[DataProvider('recursiveFileListSortingHelperTestDataProvider')]
+    #[Test]
     public function recursiveFileListSortingHelperCorrectlySorts(array $unsortedList, array $expectedList): void
     {
         $result = $unsortedList;
diff --git a/typo3/sysext/dashboard/Tests/Unit/DashboardPresetRegistryTest.php b/typo3/sysext/dashboard/Tests/Unit/DashboardPresetRegistryTest.php
index 919869e94069cf8a3aa1a6cdfc18663b93a9c867..346a53cfa72e3101ca7c742cf44da126171d1349 100644
--- a/typo3/sysext/dashboard/Tests/Unit/DashboardPresetRegistryTest.php
+++ b/typo3/sysext/dashboard/Tests/Unit/DashboardPresetRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Dashboard\Tests\Unit;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Dashboard\DashboardPreset;
 use TYPO3\CMS\Dashboard\DashboardPresetRegistry;
@@ -35,9 +36,7 @@ final class DashboardPresetRegistryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withoutRegisteredPresetsOnlyFallbackPresetsIsReturned(): void
     {
         $presets = $this->subject->getDashboardPresets();
@@ -47,9 +46,7 @@ final class DashboardPresetRegistryTest extends UnitTestCase
         self::assertInstanceOf(DashboardPreset::class, reset($presets));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getWidgetsMethodReturnsDashboardPresetsObjects(): void
     {
         $dashboardPreset1 = new DashboardPreset('identifier1', 'title1', 'description1');
@@ -63,9 +60,7 @@ final class DashboardPresetRegistryTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function dashboardPresetsGetRegistered(): void
     {
         // If no dashboard preset is registered, it will return a fallback preset
diff --git a/typo3/sysext/dashboard/Tests/Unit/DependencyInjection/DashboardWidgetPassTest.php b/typo3/sysext/dashboard/Tests/Unit/DependencyInjection/DashboardWidgetPassTest.php
index acae44441c6ece714655fbb9f5724808d8f4e46e..0db4b7029fe8a1e6fd2322d1208d5733ceb05fb1 100644
--- a/typo3/sysext/dashboard/Tests/Unit/DependencyInjection/DashboardWidgetPassTest.php
+++ b/typo3/sysext/dashboard/Tests/Unit/DependencyInjection/DashboardWidgetPassTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Dashboard\Tests\Unit\DependencyInjection;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Definition;
@@ -41,9 +42,7 @@ final class DashboardWidgetPassTest extends UnitTestCase
         $this->widgetRegistryDefinition = $this->createMock(Definition::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function doesNothingIfWidgetRegistryIsUnknown(): void
     {
         $this->container->method('hasDefinition')->with(WidgetRegistry::class)->willReturn(false);
@@ -52,9 +51,7 @@ final class DashboardWidgetPassTest extends UnitTestCase
         $this->subject->process($this->container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function doesNothingIfNoWidgetsAreTagged(): void
     {
         $this->container->method('hasDefinition')->with(WidgetRegistry::class)->willReturn(true);
@@ -65,9 +62,7 @@ final class DashboardWidgetPassTest extends UnitTestCase
         $this->subject->process($this->container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makesWidgetPublic(): void
     {
         $this->container->method('hasDefinition')->with(WidgetRegistry::class)->willReturn(true);
@@ -82,9 +77,7 @@ final class DashboardWidgetPassTest extends UnitTestCase
         $this->subject->process($this->container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registersTaggedWidgetWithMinimumConfigurationInRegistry(): void
     {
         $this->container->method('hasDefinition')->with(WidgetRegistry::class)->willReturn(true);
@@ -132,9 +125,7 @@ final class DashboardWidgetPassTest extends UnitTestCase
         $this->subject->process($this->container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registersWidgetToMultipleGroupsByComma(): void
     {
         $this->container->method('hasDefinition')->with(WidgetRegistry::class)->willReturn(true);
@@ -176,9 +167,7 @@ final class DashboardWidgetPassTest extends UnitTestCase
         $this->subject->process($this->container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registersTaggedWidgetWithMaximumConfigurationInRegistry(): void
     {
         $this->container->method('hasDefinition')->with(WidgetRegistry::class)->willReturn(true);
diff --git a/typo3/sysext/dashboard/Tests/Unit/WidgetGroupRegistryTest.php b/typo3/sysext/dashboard/Tests/Unit/WidgetGroupRegistryTest.php
index f599dea70a14b1fea62f9adc718a5432fe51e7e9..f43c6f6f05b3710cbf026db38d785ccfc1fb0cdd 100644
--- a/typo3/sysext/dashboard/Tests/Unit/WidgetGroupRegistryTest.php
+++ b/typo3/sysext/dashboard/Tests/Unit/WidgetGroupRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Dashboard\Tests\Unit;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Dashboard\WidgetGroup;
 use TYPO3\CMS\Dashboard\WidgetGroupRegistry;
@@ -35,17 +36,13 @@ final class WidgetGroupRegistryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initiallyZeroWidgetGroupsAreRegistered(): void
     {
         self::assertCount(0, $this->subject->getWidgetGroups());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getWidgetsMethodReturnsWidgetGroupObjects(): void
     {
         $widgetGroup1 = new WidgetGroup('identifier1', 'title1');
@@ -60,9 +57,7 @@ final class WidgetGroupRegistryTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function widgetGroupsGetRegistered(): void
     {
         self::assertCount(0, $this->subject->getWidgetGroups());
@@ -89,9 +84,7 @@ final class WidgetGroupRegistryTest extends UnitTestCase
         self::assertEquals(['identifier', 'identifier2'], array_keys($widgetGroups));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function alternativeRepositoryObjectReturnsSameResults(): void
     {
         $widgetGroup1 = new WidgetGroup('identifier1', 'title1');
diff --git a/typo3/sysext/extbase/Tests/Unit/Configuration/FrontendConfigurationManagerTest.php b/typo3/sysext/extbase/Tests/Unit/Configuration/FrontendConfigurationManagerTest.php
index 7c1110ca1f9f299f303bafaa12e00462b329b9a5..88dc3f0596d7b62678d3ba7f4049cab0a1f39694 100644
--- a/typo3/sysext/extbase/Tests/Unit/Configuration/FrontendConfigurationManagerTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Configuration/FrontendConfigurationManagerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Domain\Repository\PageRepository;
 use TYPO3\CMS\Core\EventDispatcher\EventDispatcher;
@@ -115,9 +116,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         $this->frontendConfigurationManager->_set('eventDispatcher', $this->createMock(EventDispatcher::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setConfigurationResetsConfigurationCache(): void
     {
         $this->frontendConfigurationManager->_set('configurationCache', ['foo' => 'bar']);
@@ -125,9 +124,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals([], $this->frontendConfigurationManager->_get('configurationCache'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setConfigurationSetsExtensionAndPluginName(): void
     {
         $configuration = [
@@ -139,9 +136,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals('SomePluginName', $this->frontendConfigurationManager->_get('pluginName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setConfigurationConvertsTypoScriptArrayToPlainArray(): void
     {
         $configuration = [
@@ -159,9 +154,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $this->frontendConfigurationManager->_get('configuration'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationReturnsCachedResultOfCurrentPlugin(): void
     {
         $this->frontendConfigurationManager->_set('extensionName', 'CurrentExtensionName');
@@ -175,9 +168,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationReturnsCachedResultForGivenExtension(): void
     {
         $this->frontendConfigurationManager->_set('configurationCache', [
@@ -189,9 +180,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationRecursivelyMergesCurrentPluginConfigurationWithFrameworkConfiguration(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -239,9 +228,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationRecursivelyMergesPluginConfigurationOfSpecifiedPluginWithFrameworkConfiguration(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -287,9 +274,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationDoesNotOverrideConfigurationWithContextSpecificFrameworkConfigurationIfDifferentPluginIsSpecified(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -310,9 +295,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         $frontendConfigurationManager->getConfiguration('SomeExtensionName', 'SomePluginName');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOverridesConfigurationWithContextSpecificFrameworkConfigurationIfNoPluginWasSpecified(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -342,9 +325,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($contextSpecificFrameworkConfiguration, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationOverridesConfigurationWithContextSpecificFrameworkConfigurationIfSpecifiedPluginIsTheCurrentPlugin(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -382,9 +363,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($contextSpecificFrameworkConfiguration, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationStoresResultInConfigurationCache(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -414,9 +393,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationRetrievesStoragePidIncludingGivenStoragePidWithRecursiveSetForSingleStoragePid(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -444,9 +421,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         $frontendConfigurationManager->getConfiguration('SomeOtherExtensionName', 'SomeOtherCurrentPluginName');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationRetrievesStoragePidIncludingGivenStoragePidWithRecursiveSetForMultipleStoragePid(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
@@ -474,17 +449,13 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         $frontendConfigurationManager->getConfiguration('SomeOtherExtensionName', 'SomeOtherCurrentPluginName');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContentObjectReturnsInstanceOfContentObjectRenderer(): void
     {
         self::assertInstanceOf(ContentObjectRenderer::class, $this->frontendConfigurationManager->getContentObject());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContentObjectTheCurrentContentObject(): void
     {
         $mockContentObject = $this->createMock(ContentObjectRenderer::class);
@@ -492,9 +463,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertSame($this->frontendConfigurationManager->getContentObject(), $mockContentObject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTypoScriptSetupReturnsSetupFromRequest(): void
     {
         $frontendTypoScript = new FrontendTypoScript(new RootNode(), []);
@@ -503,9 +472,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals(['foo' => 'bar'], $this->frontendConfigurationManager->_call('getTypoScriptSetup'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPluginConfigurationReturnsEmptyArrayIfNoPluginConfigurationWasFound(): void
     {
         $frontendTypoScript = new FrontendTypoScript(new RootNode(), []);
@@ -520,9 +487,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPluginConfigurationReturnsExtensionConfiguration(): void
     {
         $testSettings = [
@@ -553,9 +518,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPluginConfigurationReturnsPluginConfiguration(): void
     {
         $testSettings = [
@@ -590,9 +553,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPluginConfigurationRecursivelyMergesExtensionAndPluginConfiguration(): void
     {
         $testExtensionSettings = [
@@ -663,9 +624,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getControllerConfigurationReturnsEmptyArrayByDefault(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase'] = null;
@@ -678,9 +637,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getControllerConfigurationReturnsConfigurationStoredInExtconf(): void
     {
         $controllerConfiguration = [
@@ -710,9 +667,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContextSpecificFrameworkConfigurationCorrectlyCallsOverrideMethods(): void
     {
         $frameworkConfiguration = [
@@ -742,9 +697,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mergeConfigurationIntoFrameworkConfigurationWorksAsExpected(): void
     {
         $configuration = [
@@ -765,9 +718,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideStoragePidIfStartingPointIsSetOverridesCorrectly(): void
     {
         $this->mockContentObject->data = ['pages' => '0', 'recursive' => 1];
@@ -785,9 +736,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideStoragePidIfStartingPointIsSetCorrectlyHandlesEmptyValuesFromPageRepository(): void
     {
         $this->mockContentObject->data = ['pages' => '0', 'recursive' => 1];
@@ -805,9 +754,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideConfigurationFromFlexFormChecksForDataIsString(): void
     {
         $flexFormService = $this->getMockBuilder(FlexFormService::class)
@@ -829,9 +776,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideConfigurationFromFlexFormChecksForDataIsStringAndEmpty(): void
     {
         $flexFormService = $this->getMockBuilder(FlexFormService::class)
@@ -849,9 +794,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideConfigurationFromFlexFormChecksForDataIsArray(): void
     {
         $flexFormService = $this->getMockBuilder(FlexFormService::class)
@@ -869,9 +812,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideConfigurationFromFlexFormChecksForDataIsArrayAndEmpty(): void
     {
         $flexFormService = $this->getMockBuilder(FlexFormService::class)
@@ -889,9 +830,7 @@ final class FrontendConfigurationManagerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideConfigurationFromPluginOverridesCorrectly(): void
     {
         $frontendConfigurationManager = $this->getAccessibleMock(
diff --git a/typo3/sysext/extbase/Tests/Unit/Domain/Model/CategoryTest.php b/typo3/sysext/extbase/Tests/Unit/Domain/Model/CategoryTest.php
index 2fbc31ae60e72c43c5a23a5c92b7b94ffd4439cb..4f8938404fd816e2fd7944d0e9402d0fb9246868 100644
--- a/typo3/sysext/extbase/Tests/Unit/Domain/Model/CategoryTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Domain/Model/CategoryTest.php
@@ -17,23 +17,20 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Domain\Model\Category;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CategoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getTitleInitiallyReturnsEmptyString(): void
     {
         $subject = new Category();
         self::assertSame('', $subject->getTitle());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setTitleSetsTitle(): void
     {
         $subject = new Category();
@@ -41,18 +38,14 @@ final class CategoryTest extends UnitTestCase
         self::assertSame('foo bar', $subject->getTitle());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDescriptionInitiallyReturnsEmptyString(): void
     {
         $subject = new Category();
         self::assertSame('', $subject->getDescription());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDescriptionSetsDescription(): void
     {
         $subject = new Category();
@@ -60,18 +53,14 @@ final class CategoryTest extends UnitTestCase
         self::assertSame('foo bar', $subject->getDescription());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParentInitiallyReturnsNull(): void
     {
         $subject = new Category();
         self::assertNull($subject->getParent());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setParentSetsParent(): void
     {
         $parent = new Category();
diff --git a/typo3/sysext/extbase/Tests/Unit/DomainObject/AbstractEntityTest.php b/typo3/sysext/extbase/Tests/Unit/DomainObject/AbstractEntityTest.php
index 5054a4a0c14bc5922abdd7c18d5944c5bac4c81d..82e549317db2f0ed7b0c1985808321c4f07af16e 100644
--- a/typo3/sysext/extbase/Tests/Unit/DomainObject/AbstractEntityTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/DomainObject/AbstractEntityTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\DomainObject;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractEntityTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function objectIsNotDirtyAfterCallingMemorizeCleanStateWithSimpleProperties(): void
     {
         $domainObject = new class () extends AbstractEntity {
@@ -36,9 +35,7 @@ final class AbstractEntityTest extends UnitTestCase
         self::assertFalse($domainObject->_isDirty());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectIsDirtyAfterCallingMemorizeCleanStateWithSimplePropertiesAndModifyingThePropertiesAfterwards(): void
     {
         $domainObject = new class () extends AbstractEntity {
@@ -51,9 +48,7 @@ final class AbstractEntityTest extends UnitTestCase
         self::assertTrue($domainObject->_isDirty());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectIsNotDirtyAfterCallingMemorizeCleanStateWithObjectProperties(): void
     {
         $domainObject = new class () extends AbstractEntity {
@@ -66,9 +61,7 @@ final class AbstractEntityTest extends UnitTestCase
         self::assertFalse($domainObject->_isDirty());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectIsNotDirtyAfterCallingMemorizeCleanStateWithOtherDomainObjectsAsProperties(): void
     {
         $domainObject = new class () extends AbstractEntity {
diff --git a/typo3/sysext/extbase/Tests/Unit/Error/ErrorTest.php b/typo3/sysext/extbase/Tests/Unit/Error/ErrorTest.php
index 27b50442a4a73f6f0764c14d218dec30f5af87f2..135391b2f3afb8398a15c103ec5ef77f0de6d32b 100644
--- a/typo3/sysext/extbase/Tests/Unit/Error/ErrorTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Error/ErrorTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Error;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Error\Error;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ErrorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorSetsTheErrorMessageCorrectly(): void
     {
         $errorMessage = 'The message';
@@ -32,9 +31,7 @@ final class ErrorTest extends UnitTestCase
         self::assertEquals($errorMessage, $error->getMessage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorSetsTheErrorCodeCorrectly(): void
     {
         $errorCode = 123456789;
diff --git a/typo3/sysext/extbase/Tests/Unit/Error/MessageTest.php b/typo3/sysext/extbase/Tests/Unit/Error/MessageTest.php
index 839ff8eebf7c3ee71aa56f49ea27898aa8a261e0..2cc5df6c9d45d0970ad39dd578e9dbff49de0a00 100644
--- a/typo3/sysext/extbase/Tests/Unit/Error/MessageTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Error/MessageTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Error;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Error\Message;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MessageTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorSetsTheMessageMessageCorrectly(): void
     {
         $messageMessage = 'The message';
@@ -32,9 +31,7 @@ final class MessageTest extends UnitTestCase
         self::assertEquals($messageMessage, $error->getMessage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorSetsTheMessageCodeCorrectly(): void
     {
         $messageCode = 123456789;
@@ -42,9 +39,7 @@ final class MessageTest extends UnitTestCase
         self::assertEquals($messageCode, $error->getCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorSetsTheMessageArgumentsCorrectly(): void
     {
         $messageArguments = ['foo', 'bar'];
@@ -52,9 +47,7 @@ final class MessageTest extends UnitTestCase
         self::assertEquals($messageArguments, $error->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theConstructorSetsTheMessageTitleCorrectly(): void
     {
         $messageTitle = 'Title';
@@ -62,27 +55,21 @@ final class MessageTest extends UnitTestCase
         self::assertEquals($messageTitle, $error->getTitle());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderRendersCorrectlyWithoutArguments(): void
     {
         $error = new Message('Message', 1);
         self::assertEquals('Message', $error->render());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderRendersCorrectlyWithArguments(): void
     {
         $error = new Message('Foo is %s and Bar is %s', 1, ['baz', 'qux']);
         self::assertEquals('Foo is baz and Bar is qux', $error->render());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toStringCallsRender(): void
     {
         $error = new Message('Foo is %s and Bar is %s', 1, ['baz', 'qux']);
diff --git a/typo3/sysext/extbase/Tests/Unit/Error/ResultTest.php b/typo3/sysext/extbase/Tests/Unit/Error/ResultTest.php
index 4c48a699dbd7eb1166d86c1c52c7cf11daaa3e7e..30161efcf1e718ef8f4fe8443e5d3b8619da9668 100644
--- a/typo3/sysext/extbase/Tests/Unit/Error/ResultTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Error/ResultTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Error;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Extbase\Error\Result;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -45,10 +47,8 @@ final class ResultTest extends UnitTestCase
         return $this->createMock('TYPO3\\CMS\\Extbase\\Error\\' . $type);
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function addedMessagesShouldBeRetrievableAgain(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $message = $this->getMockMessage($dataTypeInSingular);
@@ -58,10 +58,8 @@ final class ResultTest extends UnitTestCase
         self::assertEquals([$message], $this->result->{$getterMethodName}());
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function getMessageShouldNotBeRecursive(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $message = $this->getMockMessage($dataTypeInSingular);
@@ -71,10 +69,8 @@ final class ResultTest extends UnitTestCase
         self::assertEquals([], $this->result->{$getterMethodName}());
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function getFirstMessageShouldReturnFirstMessage(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $message1 = $this->getMockMessage($dataTypeInSingular);
@@ -86,9 +82,7 @@ final class ResultTest extends UnitTestCase
         self::assertSame($message1, $this->result->{$getterMethodName}());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forPropertyShouldReturnSubResult(): void
     {
         $container2 = $this->result->forProperty('foo.bar');
@@ -96,28 +90,22 @@ final class ResultTest extends UnitTestCase
         self::assertSame($container2, $this->result->forProperty('foo')->forProperty('bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forPropertyWithEmptyStringShouldReturnSelf(): void
     {
         $container2 = $this->result->forProperty('');
         self::assertSame($container2, $this->result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forPropertyWithNullShouldReturnSelf(): void
     {
         $container2 = $this->result->forProperty(null);
         self::assertSame($container2, $this->result);
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function hasMessagesShouldReturnTrueIfTopLevelObjectHasMessages(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $message = $this->getMockMessage($dataTypeInSingular);
@@ -127,10 +115,8 @@ final class ResultTest extends UnitTestCase
         self::assertTrue($this->result->{$methodName}());
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function hasMessagesShouldReturnTrueIfSubObjectHasErrors(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $addMethodName = 'add' . $dataTypeInSingular;
@@ -140,10 +126,8 @@ final class ResultTest extends UnitTestCase
         self::assertTrue($this->result->{$methodName}());
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function hasMessagesShouldReturnFalseIfSubObjectHasNoErrors(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $methodName = 'has' . $dataTypeInPlural;
@@ -152,10 +136,8 @@ final class ResultTest extends UnitTestCase
         self::assertFalse($this->result->{$methodName}());
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function getFlattenedMessagesShouldReturnAllSubMessages(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $message1 = $this->getMockMessage($dataTypeInSingular);
@@ -179,10 +161,8 @@ final class ResultTest extends UnitTestCase
         self::assertEquals($expected, $this->result->{$getMethodName}());
     }
 
-    /**
-     * @test
-     * @dataProvider dataTypes
-     */
+    #[DataProvider('dataTypes')]
+    #[Test]
     public function getFlattenedMessagesShouldNotContainEmptyResults(string $dataTypeInSingular, string $dataTypeInPlural): void
     {
         $message1 = $this->getMockMessage($dataTypeInSingular);
@@ -198,9 +178,7 @@ final class ResultTest extends UnitTestCase
         self::assertEquals($expected, $this->result->{$getMethodName}());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mergeShouldMergeTwoResults(): void
     {
         $notice1 = $this->getMockMessage('Notice');
@@ -231,9 +209,7 @@ final class ResultTest extends UnitTestCase
         self::assertSame([$error1, $error2], $this->result->forProperty('foo')->getErrors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFirstReturnsFalseOnEmptyResult(): void
     {
         $subject = new Result();
diff --git a/typo3/sysext/extbase/Tests/Unit/Event/Configuration/BeforeFlexFormConfigurationOverrideEventTest.php b/typo3/sysext/extbase/Tests/Unit/Event/Configuration/BeforeFlexFormConfigurationOverrideEventTest.php
index be3c604e5b89bee9ba3d70b166a0f4bedbfe3720..9f1523aefdde203f10c33f3e2d52fa5433845f50 100644
--- a/typo3/sysext/extbase/Tests/Unit/Event/Configuration/BeforeFlexFormConfigurationOverrideEventTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Event/Configuration/BeforeFlexFormConfigurationOverrideEventTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Event\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Event\Configuration\BeforeFlexFormConfigurationOverrideEvent;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class BeforeFlexFormConfigurationOverrideEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function canAccessCurrentConfiguration(): void
     {
         $event = new BeforeFlexFormConfigurationOverrideEvent(
@@ -38,9 +37,7 @@ final class BeforeFlexFormConfigurationOverrideEventTest extends UnitTestCase
         self::assertSame(['foo' => 'bar'], $event->getFlexFormConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canOverrideFlexFormConfiguration(): void
     {
         $event = new BeforeFlexFormConfigurationOverrideEvent(
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentTest.php
index 5ceaf22f4c6101870c78b9a0ecfdd05b20e058ed..6baa79ed638c10cb27b8dca81e444c900fe159c8 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Mvc\Controller;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Mvc\Controller\Argument;
 use TYPO3\CMS\Extbase\Property\TypeConverter\PersistentObjectConverter;
 use TYPO3\CMS\Extbase\Validation\Validator\ValidatorInterface;
@@ -34,9 +36,7 @@ final class ArgumentTest extends UnitTestCase
         $this->objectArgument = new Argument('someName', 'DateTime');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructingArgumentWithoutNameThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -44,9 +44,7 @@ final class ArgumentTest extends UnitTestCase
         new Argument('', 'Text');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructingArgumentWithInvalidNameThrowsException(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -54,18 +52,14 @@ final class ArgumentTest extends UnitTestCase
         new Argument(new \ArrayObject(), 'Text');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function passingDataTypeToConstructorReallySetsTheDataType(): void
     {
         self::assertEquals('string', $this->simpleValueArgument->getDataType(), 'The specified data type has not been set correctly.');
         self::assertEquals('someName', $this->simpleValueArgument->getName(), 'The specified name has not been set correctly.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setShortNameProvidesFluentInterface(): void
     {
         $returnedArgument = $this->simpleValueArgument->setShortName('x');
@@ -82,10 +76,10 @@ final class ArgumentTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider invalidShortNames
      * @param string|int $invalidShortName
      */
+    #[DataProvider('invalidShortNames')]
+    #[Test]
     public function shortNameShouldThrowExceptionIfInvalid($invalidShortName): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -93,18 +87,14 @@ final class ArgumentTest extends UnitTestCase
         $this->simpleValueArgument->setShortName($invalidShortName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function shortNameCanBeRetrievedAgain(): void
     {
         $this->simpleValueArgument->setShortName('x');
         self::assertEquals('x', $this->simpleValueArgument->getShortName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRequiredShouldProvideFluentInterfaceAndReallySetRequiredState(): void
     {
         $returnedArgument = $this->simpleValueArgument->setRequired(true);
@@ -112,9 +102,7 @@ final class ArgumentTest extends UnitTestCase
         self::assertTrue($this->simpleValueArgument->isRequired());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDefaultValueShouldProvideFluentInterfaceAndReallySetDefaultValue(): void
     {
         $returnedArgument = $this->simpleValueArgument->setDefaultValue('default');
@@ -122,9 +110,7 @@ final class ArgumentTest extends UnitTestCase
         self::assertSame('default', $this->simpleValueArgument->getDefaultValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValidatorShouldProvideFluentInterfaceAndReallySetValidator(): void
     {
         $mockValidator = $this->createMock(ValidatorInterface::class);
@@ -133,18 +119,14 @@ final class ArgumentTest extends UnitTestCase
         self::assertSame($mockValidator, $this->simpleValueArgument->getValidator());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueProvidesFluentInterface(): void
     {
         $returnedArgument = $this->simpleValueArgument->setValue(null);
         self::assertSame($this->simpleValueArgument, $returnedArgument, 'The returned argument is not the original argument.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setValueUsesNullAsIs(): void
     {
         $this->simpleValueArgument = new Argument('dummy', 'string');
@@ -152,9 +134,7 @@ final class ArgumentTest extends UnitTestCase
         self::assertNull($this->simpleValueArgument->getValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultPropertyMappingConfigurationDoesNotAllowCreationOrModificationOfObjects(): void
     {
         self::assertNull($this->simpleValueArgument->getPropertyMappingConfiguration()->getConfigurationValue(PersistentObjectConverter::class, PersistentObjectConverter::CONFIGURATION_CREATION_ALLOWED));
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentsTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentsTest.php
index 96b2e70ba3713b786535230f9aceefcf6173ff4d..9e0f9108affee727228472b4b9336e22e4deb931 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentsTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ArgumentsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Mvc\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Mvc\Controller\Argument;
 use TYPO3\CMS\Extbase\Mvc\Controller\Arguments;
 use TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ArgumentsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function argumentsObjectIsOfScopePrototype(): void
     {
         $arguments1 = new Arguments();
@@ -34,9 +33,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertNotSame($arguments1, $arguments2, 'The arguments object is not of scope prototype!');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addingAnArgumentManuallyWorks(): void
     {
         $arguments = new Arguments();
@@ -45,9 +42,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertSame($newArgument, $arguments->getArgument('argumentName1234'), 'The added and retrieved argument is not the same.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addingAnArgumentReplacesArgumentWithSameName(): void
     {
         $arguments = new Arguments();
@@ -66,9 +61,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertSame($mockSecondArgument, $arguments->getArgument('argumentName1234'), 'The added and retrieved argument is not the same.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addNewArgumentProvidesFluentInterface(): void
     {
         $arguments = new Arguments();
@@ -76,9 +69,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertInstanceOf(Argument::class, $newArgument);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addingArgumentThroughArrayAccessWorks(): void
     {
         $mockArgument = $this->getMockBuilder(Argument::class)
@@ -92,9 +83,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertSame($mockArgument, $arguments->getArgument('argumentName1234'), 'Added and retrieved arguments are not the same.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function retrievingArgumentThroughArrayAccessWorks(): void
     {
         $mockArgument = $this->getMockBuilder(Argument::class)
@@ -107,9 +96,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertSame($mockArgument, $arguments['argumentName1234'], 'Argument retrieved by array access is not the one we added.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getArgumentWithNonExistingArgumentNameThrowsException(): void
     {
         $arguments = new Arguments();
@@ -120,9 +107,7 @@ final class ArgumentsTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function issetReturnsCorrectResult(): void
     {
         $mockArgument = $this->getMockBuilder(Argument::class)
@@ -136,9 +121,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertTrue(isset($arguments['argumentName1234']), 'isset() did not return TRUE.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getArgumentNamesReturnsNamesOfAddedArguments(): void
     {
         $mockArgument1 = $this->getMockBuilder(Argument::class)
@@ -164,9 +147,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertEquals($expectedArgumentNames, $arguments->getArgumentNames(), 'Returned argument names were not as expected.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getArgumentShortNamesReturnsShortNamesOfAddedArguments(): void
     {
         $mockArgument1 = $this->getMockBuilder(Argument::class)
@@ -195,9 +176,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertEquals($expectedShortNames, $arguments->getArgumentShortNames(), 'Returned argument short names were not as expected.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addNewArgumentCreatesAndAddsNewArgument(): void
     {
         $mockArgument = $this->getMockBuilder(Argument::class)
@@ -212,9 +191,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertSame($addedArgument, $retrievedArgument, 'The added and the retrieved argument are not the same.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addNewArgumentAssumesTextDataTypeByDefault(): void
     {
         $mockArgument = $this->getMockBuilder(Argument::class)
@@ -226,9 +203,7 @@ final class ArgumentsTest extends UnitTestCase
         $arguments->addNewArgument('dummyName');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addNewArgumentCanAddArgumentsMarkedAsRequired(): void
     {
         $arguments = new Arguments();
@@ -236,9 +211,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertTrue($argument->isRequired());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addNewArgumentCanAddArgumentsMarkedAsOptionalWithDefaultValues(): void
     {
         $arguments = new Arguments();
@@ -246,9 +219,7 @@ final class ArgumentsTest extends UnitTestCase
         self::assertFalse($argument->isRequired());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function callingInvalidMethodThrowsException(): void
     {
         $this->expectException(\LogicException::class);
@@ -257,9 +228,7 @@ final class ArgumentsTest extends UnitTestCase
         $arguments->nonExistingMethod();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeAllClearsAllArguments(): void
     {
         $mockArgument1 = $this->getMockBuilder(Argument::class)
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/MvcPropertyMappingConfigurationServiceTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/MvcPropertyMappingConfigurationServiceTest.php
index 72c7383963a6a747a5130e3288a8ebff4d9a8780..17ec979a7de8d7e6fb56cbcbb73860bdacdf2b0b 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/MvcPropertyMappingConfigurationServiceTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/MvcPropertyMappingConfigurationServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Mvc\Controller;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Error\Http\BadRequestException;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Extbase\Mvc\Controller\Argument;
@@ -120,10 +122,8 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider dataProviderForGenerateTrustedPropertiesToken
-     */
+    #[DataProvider('dataProviderForGenerateTrustedPropertiesToken')]
+    #[Test]
     public function generateTrustedPropertiesTokenGeneratesTheCorrectHashesInNormalOperation($input, $expected): void
     {
         $requestHashService = $this->getMockBuilder(MvcPropertyMappingConfigurationService::class)
@@ -133,10 +133,8 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         $requestHashService->generateTrustedPropertiesToken($input);
     }
 
-    /**
-     * @test
-     * @dataProvider dataProviderForGenerateTrustedPropertiesTokenWithUnallowedValues
-     */
+    #[DataProvider('dataProviderForGenerateTrustedPropertiesTokenWithUnallowedValues')]
+    #[Test]
     public function generateTrustedPropertiesTokenThrowsExceptionInWrongCases(array $input, int $expectExceptionCode): void
     {
         $this->expectException(InvalidArgumentForHashGenerationException::class);
@@ -147,9 +145,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         $requestHashService->generateTrustedPropertiesToken($input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function serializeAndHashFormFieldArrayWorks(): void
     {
         $formFieldArray = [
@@ -173,9 +169,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         self::assertEquals($expected, $actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationDoesNothingIfTrustedPropertiesAreNotSet(): void
     {
         $extbaseAttribute = (new ExtbaseRequestParameters())->setArgument('__trustedProperties', null);
@@ -187,9 +181,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         $requestHashService->initializePropertyMappingConfigurationFromRequest($extbaseRequest, $arguments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationThrowsBadRequestExceptionOnInvalidHmac(): void
     {
         $this->expectException(BadRequestException::class);
@@ -206,9 +198,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         $requestHashService->initializePropertyMappingConfigurationFromRequest($extbaseRequest, $arguments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationWithNonDecodableTrustedPropertiesThrowsException(): void
     {
         $hashService = new HashService();
@@ -228,9 +218,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         $requestHashService->initializePropertyMappingConfigurationFromRequest($extbaseRequest, $arguments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationWithOutdatedTrustedPropertiesThrowsException(): void
     {
         $hashService = new HashService();
@@ -250,9 +238,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         $requestHashService->initializePropertyMappingConfigurationFromRequest($extbaseRequest, $arguments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationReturnsEarlyIfNoTrustedPropertiesAreSet(): void
     {
         $trustedProperties = [
@@ -261,9 +247,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         $this->initializePropertyMappingConfiguration($trustedProperties);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationReturnsEarlyIfArgumentIsUnknown(): void
     {
         $trustedProperties = [
@@ -273,9 +257,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         self::assertFalse($arguments->hasArgument('nonExistingArgument'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationSetsModificationAllowedIfIdentityPropertyIsSet(): void
     {
         $trustedProperties = [
@@ -297,9 +279,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         self::assertFalse($propertyMappingConfiguration->forProperty('nested')->shouldMap('someProperty'), 'Value is not FALSE at line ' . __LINE__);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationSetsCreationAllowedIfIdentityPropertyIsNotSet(): void
     {
         $trustedProperties = [
@@ -318,9 +298,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         self::assertFalse($propertyMappingConfiguration->forProperty('bar')->shouldMap('someProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationSetsAllowedFields(): void
     {
         $trustedProperties = [
@@ -334,9 +312,7 @@ final class MvcPropertyMappingConfigurationServiceTest extends UnitTestCase
         self::assertTrue($propertyMappingConfiguration->shouldMap('bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializePropertyMappingConfigurationSetsAllowedFieldsRecursively(): void
     {
         $trustedProperties = [
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/RequestTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/RequestTest.php
index 89e3b406d7b2dfaa0d48c72c79e609636779d6e0..b62789d2af3d3a3cc373b3b5c4e5352e376ef54a 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/RequestTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/RequestTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Mvc;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentNameException;
 use TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RequestTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function aSingleArgumentCanBeSetWithWithArgumentAndRetrievedWithGetArgument(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -36,9 +36,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals('theValue', $request->getArgument('someArgumentName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withArgumentThrowsExceptionIfTheGivenArgumentNameIsAnEmptyString(): void
     {
         $this->expectException(InvalidArgumentNameException::class);
@@ -48,9 +46,7 @@ final class RequestTest extends UnitTestCase
         $request->withArgument('', 'theValue');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withArgumentsOverridesAllExistingArguments(): void
     {
         $arguments = ['key1' => 'value1', 'key2' => 'value2'];
@@ -62,9 +58,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals($arguments, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withArgumentCanNotSetAtExtension(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -73,9 +67,7 @@ final class RequestTest extends UnitTestCase
         self::assertFalse($request->hasArgument('@extension'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withArgumentCanNotSetAtController(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -84,9 +76,7 @@ final class RequestTest extends UnitTestCase
         self::assertFalse($request->hasArgument('@controller'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withArgumentCanNotSetAtAction(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -95,9 +85,7 @@ final class RequestTest extends UnitTestCase
         self::assertFalse($request->hasArgument('@action'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withArgumentCanNotSetAtFormat(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -106,9 +94,7 @@ final class RequestTest extends UnitTestCase
         self::assertFalse($request->hasArgument('@format'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function internalArgumentsIsNotReturnedAsNormalArgument(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -117,9 +103,7 @@ final class RequestTest extends UnitTestCase
         self::assertFalse($request->hasArgument('__referrer'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function multipleArgumentsCanBeSetWithWithArgumentsAndRetrievedWithGetArguments(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -133,9 +117,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals($arguments, $request->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasArgumentTellsIfAnArgumentExists(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -145,9 +127,7 @@ final class RequestTest extends UnitTestCase
         self::assertFalse($request->hasArgument('notExistingArgument'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theActionNameCanBeSetAndRetrieved(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -156,9 +136,7 @@ final class RequestTest extends UnitTestCase
         self::assertEquals('theAction', $request->getControllerActionName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function theRepresentationFormatCanBeSetAndRetrieved(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -204,10 +182,8 @@ final class RequestTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider controllerArgumentsAndExpectedObjectName
-     * @test
-     */
+    #[DataProvider('controllerArgumentsAndExpectedObjectName')]
+    #[Test]
     public function withControllerObjectNameResolvesControllerObjectNameArgumentsCorrectly(array $controllerArguments, string $controllerObjectName): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/View/JsonViewTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/View/JsonViewTest.php
index 59a7a34bb5e81fb0bb615b43be1264d511f6fb0e..2ba2fa066c5f6b2c4f89ba1cda290ed3e5239b82 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/View/JsonViewTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/View/JsonViewTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Mvc\View;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Core\Utility\StringUtility;
@@ -168,11 +170,11 @@ final class JsonViewTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @param object|array $object
      * @param array|string $expected
-     * @dataProvider jsonViewTestData
      */
+    #[DataProvider('jsonViewTestData')]
+    #[Test]
     public function transformValue($object, array $configuration, $expected, string $description): void
     {
         GeneralUtility::setSingletonInstance(ReflectionService::class, new ReflectionService(new NullFrontend('extbase'), 'ClassSchemata'));
@@ -340,11 +342,11 @@ final class JsonViewTest extends UnitTestCase
     }
 
     /**
-     * @test
      * @param object|array $object
      * @param array|string $expected
-     * @dataProvider jsonViewTestDataRecursive
      */
+    #[DataProvider('jsonViewTestDataRecursive')]
+    #[Test]
     public function recursive($object, array $configuration, $expected, string $variableToRender, string $description): void
     {
         GeneralUtility::setSingletonInstance(ReflectionService::class, new ReflectionService(new NullFrontend('extbase'), 'ClassSchemata'));
@@ -387,10 +389,8 @@ final class JsonViewTest extends UnitTestCase
         return $output;
     }
 
-    /**
-     * @test
-     * @dataProvider objectIdentifierExposureTestData
-     */
+    #[DataProvider('objectIdentifierExposureTestData')]
+    #[Test]
     public function transformValueWithObjectIdentifierExposure(
         object $object,
         array $configuration,
@@ -441,10 +441,8 @@ final class JsonViewTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider exposeClassNameSettingsAndResults
-     */
+    #[DataProvider('exposeClassNameSettingsAndResults')]
+    #[Test]
     public function viewExposesClassNameFullyIfConfiguredSo(
         ?int $exposeClassNameSetting,
         string $className,
@@ -473,9 +471,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expected, $actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsJsonRepresentationOfAssignedObject(): void
     {
         $object = new \stdClass();
@@ -487,9 +483,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsJsonRepresentationOfAssignedArray(): void
     {
         $array = ['foo' => 'Foo', 'bar' => 'Bar'];
@@ -500,9 +494,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsJsonRepresentationOfAssignedSimpleValue(): void
     {
         $value = 'Foo';
@@ -513,9 +505,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderKeepsUtf8CharactersUnescaped(): void
     {
         $value = 'Gürkchen';
@@ -538,10 +528,8 @@ final class JsonViewTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider escapeCharacterDataProvider
-     */
+    #[DataProvider('escapeCharacterDataProvider')]
+    #[Test]
     public function renderEscapesEscapeCharacters(string $character): void
     {
         $this->view->assign('value', $character);
@@ -552,9 +540,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsNullIfNameOfAssignedVariableIsNotEqualToValue(): void
     {
         $value = 'Foo';
@@ -565,9 +551,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderOnlyRendersVariableWithTheNameValue(): void
     {
         $this->view
@@ -579,9 +563,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setVariablesToRenderOverridesValueToRender(): void
     {
         $value = 'Foo';
@@ -593,9 +575,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderRendersMultipleValuesIfTheyAreSpecifiedAsVariablesToRender(): void
     {
         $this->view
@@ -609,9 +589,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCanRenderMultipleComplexObjects(): void
     {
         $array = ['foo' => ['bar' => 'Baz']];
@@ -629,9 +607,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCanRenderPlainArray(): void
     {
         $array = [['name' => 'Foo', 'secret' => true], ['name' => 'Bar', 'secret' => true]];
@@ -650,9 +626,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderCanRenderPlainArrayWithNumericKeys(): void
     {
         $array = [
@@ -677,9 +651,7 @@ final class JsonViewTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function descendAllKeepsArrayIndexes(): void
     {
         $array = [['name' => 'Foo', 'secret' => true], ['name' => 'Bar', 'secret' => true]];
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/Web/RequestBuilderDefaultValuesTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/Web/RequestBuilderDefaultValuesTest.php
index e779b0d74c044fb7deda36fdec676feddbee1dab..2cf972f82b4051f1a47caa9f0d36009b3b3d7222 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/Web/RequestBuilderDefaultValuesTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/Web/RequestBuilderDefaultValuesTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Mvc\Web;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
 use TYPO3\CMS\Extbase\Mvc\Web\RequestBuilderDefaultValues;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -38,18 +39,14 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         ],
     ];
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationThrowsExceptionIfConfigurationMissesExtensionName(): void
     {
         self::expectExceptionCode(1289843275);
         RequestBuilderDefaultValues::fromConfiguration([]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationThrowsExceptionIfConfigurationMissesPluginName(): void
     {
         self::expectExceptionCode(1289843277);
@@ -58,9 +55,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         ]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationThrowsExceptionIfConfigurationMissesControllerConfigurations(): void
     {
         self::expectExceptionCode(1316104317);
@@ -70,9 +65,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         ]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationSetsExtensionName(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -80,9 +73,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame('news', $defaultValues->getExtensionName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationSetsPluginName(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -90,9 +81,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame('list', $defaultValues->getPluginName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationFallsBackToDefaultFormat(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -100,9 +89,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame('html', $defaultValues->getDefaultFormat());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationSetsFormat(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(
@@ -114,9 +101,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame('json', $defaultValues->getDefaultFormat());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationSetsDefaultControllerClassName(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -124,9 +109,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame(ActionController::class, $defaultValues->getDefaultControllerClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fromConfigurationSetsDefaultControllerAlias(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -134,9 +117,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame('ActionController', $defaultValues->getDefaultControllerAlias());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getControllerAliasForControllerClassName(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -144,9 +125,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame('ActionController', $defaultValues->getControllerAliasForControllerClassName(ActionController::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getControllerClassNameForAlias(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -154,9 +133,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame(ActionController::class, $defaultValues->getControllerClassNameForAlias('ActionController'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllowedControllerActions(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -164,9 +141,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame([ActionController::class => ['list', 'show']], $defaultValues->getAllowedControllerActions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getControllerAliasToClassMapping(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
@@ -174,9 +149,7 @@ final class RequestBuilderDefaultValuesTest extends UnitTestCase
         self::assertSame(['ActionController' => ActionController::class], $defaultValues->getControllerAliasToClassMapping());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getControllerClassToAliasMapping(): void
     {
         $defaultValues = RequestBuilderDefaultValues::fromConfiguration(self::MINIMAL_WORKING_CONFIGURATION);
diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php
index 459e9e09a6bce51c68df4d633e6833a7f3cbd27f..ff771acbc4e6543fb45318186e22deca80d46529 100644
--- a/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Mvc/Web/Routing/UriBuilderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Mvc\Web\Routing;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\Exception;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Http\Message\ServerRequestInterface;
@@ -91,9 +93,7 @@ final class UriBuilderTest extends UnitTestCase
         return (new ServerRequest(new Uri($baseUri)))->withAttribute('route', new Route('/test/Path', ['_identifier' => $routeIdentifier]));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function settersAndGettersWorkAsExpected(): void
     {
         $this->subject
@@ -124,9 +124,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertTrue($this->subject->getNoCache());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uriForPrefixesArgumentsWithExtensionAndPluginNameAndSetsControllerArgument(): void
     {
         $expectedArguments = ['foo' => 'bar', 'baz' => ['extbase' => 'fluid'], 'controller' => 'SomeController'];
@@ -136,9 +134,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedArguments, $this->subject->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uriForRecursivelyMergesAndOverrulesControllerArgumentsWithArguments(): void
     {
         $arguments = ['foo' => 'bar', 'additionalParam' => 'additionalValue'];
@@ -150,9 +146,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedArguments, $this->subject->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uriForOnlySetsActionArgumentIfSpecified(): void
     {
         $expectedArguments = ['controller' => 'SomeController'];
@@ -161,9 +155,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedArguments, $this->subject->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uriForSetsControllerFromRequestIfControllerIsNotSet(): void
     {
         $this->mockRequest->expects(self::once())->method('getControllerName')->willReturn('SomeControllerFromRequest');
@@ -173,9 +165,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedArguments, $this->subject->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uriForSetsExtensionNameFromRequestIfExtensionNameIsNotSet(): void
     {
         $this->mockRequest->expects(self::once())->method('getControllerExtensionName')->willReturn('SomeExtensionNameFromRequest');
@@ -185,9 +175,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedArguments, $this->subject->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function uriForSetsPluginNameFromRequestIfPluginNameIsNotSetInFrontend(): void
     {
         $this->mockExtensionService->expects(self::once())->method('getPluginNamespace')->willReturn('tx_someextension_somepluginnamefromrequest');
@@ -197,9 +185,7 @@ final class UriBuilderTest extends UnitTestCase
         $this->subject->uriFor(null, [], 'SomeController', 'SomeExtension');
         self::assertEquals($expectedArguments, $this->subject->getArguments());
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function uriForSetsPluginNameFromRequestIfPluginNameIsNotSet(): void
     {
         $this->mockRequest->expects(self::once())->method('getPluginName')->willReturn('SomePluginNameFromRequest');
@@ -209,9 +195,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedArguments, $this->subject->getArguments());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendUriKeepsQueryParametersIfAddQueryStringIsSet(): void
     {
         $extbaseParameters = new ExtbaseRequestParameters();
@@ -230,9 +214,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendUriRouteAttributeOverrulesGetParameterIfAddQueryStringIsSet(): void
     {
         $extbaseParameters = new ExtbaseRequestParameters();
@@ -314,10 +296,8 @@ final class UriBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildBackendUriRemovesSpecifiedQueryParametersIfArgumentsToBeExcludedFromQueryStringIsSetDataProvider
-     */
+    #[DataProvider('buildBackendUriRemovesSpecifiedQueryParametersIfArgumentsToBeExcludedFromQueryStringIsSetDataProvider')]
+    #[Test]
     public function buildBackendUriRemovesSpecifiedQueryParametersIfArgumentsToBeExcludedFromQueryStringIsSet(array $parameters, array $excluded, string $expected): void
     {
         $serverRequest = $this->getRequestWithRouteAttribute()
@@ -336,9 +316,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expected, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendUriKeepsModuleQueryParametersIfAddQueryStringIsNotSet(): void
     {
         $serverRequest = $this->getRequestWithRouteAttribute()
@@ -352,9 +330,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendUriMergesAndOverrulesQueryParametersWithArguments(): void
     {
         $serverRequest = $this->getRequestWithRouteAttribute()
@@ -368,9 +344,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendUriConvertsDomainObjectsAfterArgumentsHaveBeenMerged(): void
     {
         $serverRequest = $this->getRequestWithRouteAttribute()
@@ -385,9 +359,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendUriRespectsSection(): void
     {
         $serverRequest = $this->getRequestWithRouteAttribute()
@@ -400,9 +372,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendUriCreatesAbsoluteUrisIfSpecified(): void
     {
         $request = $this->getRequestWithRouteAttribute(baseUri: 'http://baseuri/typo3/')
@@ -420,9 +390,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendRespectsGivenControllerActionArguments(): void
     {
         $serverRequest = $this
@@ -436,9 +404,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildBackendOverwritesSubRouteIdentifierControllerActionArguments(): void
     {
         $serverRequest = $this
@@ -452,9 +418,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildFrontendUriCreatesTypoLink(): void
     {
         $uriBuilder = $this->getAccessibleMock(UriBuilder::class, ['buildTypolinkConfiguration']);
@@ -464,9 +428,7 @@ final class UriBuilderTest extends UnitTestCase
         $uriBuilder->buildFrontendUri();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildFrontendUriCreatesRelativeUrisByDefault(): void
     {
         $this->mockContentObject->expects(self::once())->method('createUrl')->willReturn('relative/uri');
@@ -475,9 +437,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildFrontendUriDoesNotStripLeadingSlashesFromRelativeUris(): void
     {
         $this->mockContentObject->expects(self::once())->method('createUrl')->willReturn('/relative/uri');
@@ -486,9 +446,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildFrontendUriCreatesAbsoluteUrisIfSpecified(): void
     {
         $uriBuilder = $this->getAccessibleMock(UriBuilder::class, ['buildTypolinkConfiguration']);
@@ -501,9 +459,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildFrontendUriSetsAbsoluteUriSchemeIfSpecified(): void
     {
         $uriBuilder = $this->getAccessibleMock(UriBuilder::class, ['buildTypolinkConfiguration']);
@@ -517,9 +473,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildFrontendUriDoesNotSetAbsoluteUriSchemeIfCreateAbsoluteUriIsFalse(): void
     {
         $uriBuilder = $this->getAccessibleMock(UriBuilder::class, ['buildTypolinkConfiguration']);
@@ -533,9 +487,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resetSetsAllOptionsToTheirDefaultValue(): void
     {
         $this->subject
@@ -569,9 +521,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertNull($this->subject->getAbsoluteUriScheme());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationRespectsSpecifiedTargetPageUid(): void
     {
         $GLOBALS['TSFE']->id = 123;
@@ -581,9 +531,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationUsesCurrentPageUidIfTargetPageUidIsNotSet(): void
     {
         $GLOBALS['TSFE']->id = 123;
@@ -592,9 +540,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationProperlySetsAdditionalArguments(): void
     {
         $this->subject->setTargetPageUid(123);
@@ -648,10 +594,8 @@ final class UriBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider buildTypolinkConfigurationProperlySetsAddQueryStringDataProvider
-     */
+    #[DataProvider('buildTypolinkConfigurationProperlySetsAddQueryStringDataProvider')]
+    #[Test]
     public function buildTypolinkConfigurationProperlySetsAddQueryString(
         bool|string|int|null $addQueryString,
         array $expectedConfiguration
@@ -664,9 +608,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationConvertsDomainObjects(): void
     {
         $mockDomainObject1 = $this->getAccessibleMock(AbstractEntity::class, null);
@@ -680,9 +622,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationResolvesPageTypeFromFormat(): void
     {
         $this->subject->setTargetPageUid(123);
@@ -703,9 +643,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationResolvesDefaultPageTypeFromFormatIfNoMappingIsConfigured(): void
     {
         $this->subject->setTargetPageUid(123);
@@ -725,9 +663,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationResolvesDefaultPageTypeFromFormatIfFormatIsNotMapped(): void
     {
         $this->subject->setTargetPageUid(123);
@@ -748,9 +684,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationDisablesCacheHashIfNoCacheIsSet(): void
     {
         $this->subject->setTargetPageUid(123);
@@ -760,9 +694,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationConsidersSection(): void
     {
         $this->subject->setTargetPageUid(123);
@@ -772,9 +704,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function buildTypolinkConfigurationLinkAccessRestrictedPagesSetting(): void
     {
         $this->subject->setTargetPageUid(123);
@@ -784,9 +714,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedConfiguration, $actualConfiguration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertDomainObjectsToIdentityArraysConvertsDomainObjects(): void
     {
         $mockDomainObject1 = $this->getAccessibleMock(AbstractEntity::class, null);
@@ -798,9 +726,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertDomainObjectsToIdentityArraysConvertsObjectStoragesWithDomainObjects(): void
     {
         $objectStorage  = new ObjectStorage();
@@ -812,9 +738,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function conversionOfTransientObjectsIsInvoked(): void
     {
         $mockValueObject = new ValueObjectFixture();
@@ -826,9 +750,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function conversionOfTransientObjectsThrowsExceptionForOtherThanValueObjects(): void
     {
         $this->expectException(InvalidArgumentValueException::class);
@@ -839,9 +761,7 @@ final class UriBuilderTest extends UnitTestCase
         $mockUriBuilder->_call('convertDomainObjectsToIdentityArrays', ['object' => $mockEntity]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function transientObjectsAreConvertedToAnArrayOfProperties(): void
     {
         $mockValueObject = new ValueObjectFixture();
@@ -852,9 +772,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function transientObjectsWithObjectStorageAreConvertedToAnArrayOfProperties(): void
     {
         $mockValueObject = new ValueObjectFixture();
@@ -882,9 +800,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function transientObjectsAreRecursivelyConverted(): void
     {
         $mockInnerValueObject2 = new ValueObjectFixture();
@@ -919,10 +835,8 @@ final class UriBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider convertIteratorToArrayConvertsIteratorsToArrayProvider
-     * @test
-     */
+    #[DataProvider('convertIteratorToArrayConvertsIteratorsToArrayProvider')]
+    #[Test]
     public function convertIteratorToArrayConvertsIteratorsToArray($iterator): void
     {
         $result = $this->subject->_call('convertIteratorToArray', $iterator);
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationFactoryTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationFactoryTest.php
index 8193c13a07c3ab96297306318a1ea03ecd030cf6..51697cd1b14b08574f504052a74494013c7b43d9 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationFactoryTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Package\PackageManager;
 use TYPO3\CMS\Core\Service\DependencyOrderingService;
@@ -31,9 +32,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ClassesConfigurationFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function inheritPropertiesFromParentClasses(): void
     {
         $classesConfigurationFactory = new ClassesConfigurationFactory(new NullFrontend('extbase'), new PackageManager(new DependencyOrderingService()), 'PersistenceClasses');
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationTest.php
index a65d8ffe49bc93f7ca71d3bf8126bb07583f1715..1e20717b24e8b8132751f03b374853c252a6bf87 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/ClassesConfigurationTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Persistence\ClassesConfiguration;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ClassesConfigurationTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hasClassReturnsTrue(): void
     {
         $className = 'ClassName';
@@ -35,9 +35,7 @@ final class ClassesConfigurationTest extends UnitTestCase
         self::assertTrue($classesConfiguration->hasClass($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasClassReturnsFalse(): void
     {
         $className = 'ClassName';
@@ -45,9 +43,7 @@ final class ClassesConfigurationTest extends UnitTestCase
         self::assertFalse($classesConfiguration->hasClass($className));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationForReturnsArray(): void
     {
         $configuration = [
@@ -62,9 +58,7 @@ final class ClassesConfigurationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationForReturnsNull(): void
     {
         $classesConfiguration = new ClassesConfiguration([]);
@@ -154,10 +148,8 @@ final class ClassesConfigurationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider resolveSubclassesRecursiveDataProvider
-     * @test
-     */
+    #[DataProvider('resolveSubclassesRecursiveDataProvider')]
+    #[Test]
     public function getSubclasses(array $expected, array $configuration, string $className): void
     {
         $classesConfiguration = new ClassesConfiguration($configuration);
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/BackendTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/BackendTest.php
index 249d3e718155e8bc8071c0da618bbfaa0a5be30d..651f04c923c66ac194e55ecfbf60ec12e3b88bc9 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/BackendTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/BackendTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
 use TYPO3\CMS\Extbase\DomainObject\DomainObjectInterface;
@@ -37,9 +38,7 @@ final class BackendTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function insertRelationInRelationtableSetsMmMatchFieldsInRow(): void
     {
         $fixture = $this->getAccessibleMock(Backend::class, null, [], '', false);
@@ -85,9 +84,7 @@ final class BackendTest extends UnitTestCase
         $fixture->_call('insertRelationInRelationtable', $domainObject, $domainObject, '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierByObjectWithStringInsteadOfObjectReturnsNull(): void
     {
         $session = $this->createMock(Session::class);
@@ -99,9 +96,7 @@ final class BackendTest extends UnitTestCase
         self::assertNull($backend->getIdentifierByObject('invalidObject'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierByObjectReturnsIdentifierForNonLazyObject(): void
     {
         $fakeUuid = 'fakeUuid';
@@ -120,9 +115,7 @@ final class BackendTest extends UnitTestCase
         self::assertEquals($backend->getIdentifierByObject($object), $fakeUuid);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierByObjectReturnsIdentifierForLazyObject(): void
     {
         $fakeUuid = 'fakeUuid';
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapFactoryTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapFactoryTest.php
index 666f6cda4b4744b77f4bc115de88a3d38a993fe6..07205b84c0e2d1e62761c88d3fe55fda49999a51 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapFactoryTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapFactoryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\Mapper;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Belog\Domain\Model\LogEntry;
 use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
 use TYPO3\CMS\Extbase\Persistence\Generic\Exception\InvalidClassException;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DataMapFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function buildDataMapThrowsExceptionIfClassNameIsNotKnown(): void
     {
         $this->expectException(InvalidClassException::class);
@@ -53,10 +53,8 @@ final class DataMapFactoryTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider classNameTableNameMappings
-     */
+    #[DataProvider('classNameTableNameMappings')]
+    #[Test]
     public function resolveTableNameReturnsExpectedTablenames($className, $expected): void
     {
         $subject = $this->getAccessibleMock(DataMapFactory::class, null, [], '', false);
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapperTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapperTest.php
index ac0a4592eef091381f67b018076e5b14df84eb95..58e530646455ee091b61cf52e73e65c87f93356a 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapperTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Mapper/DataMapperTest.php
@@ -18,6 +18,7 @@ declare(strict_types=1);
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\Mapper;
 
 use Doctrine\Instantiator\InstantiatorInterface;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
@@ -71,9 +72,7 @@ final class DataMapperTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrderingsForColumnMapReturnsNullIfNeitherForeignSortByNorForeignDefaultSortByAreSet(): void
     {
         // Arrange
@@ -91,9 +90,7 @@ final class DataMapperTest extends UnitTestCase
         self::assertNull($orderings);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrderingsForColumnMapReturnsNullIfForeignDefaultSortByIsEmpty(): void
     {
         // Arrange
@@ -112,9 +109,7 @@ final class DataMapperTest extends UnitTestCase
         self::assertNull($orderings);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrderingsForColumnMapFallBackToAscendingOrdering(): void
     {
         // Arrange
@@ -136,9 +131,7 @@ final class DataMapperTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOneToManyRelationDetectsForeignSortBy(): void
     {
         // Arrange
@@ -160,9 +153,7 @@ final class DataMapperTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOneToManyRelationDetectsForeignSortByWithForeignDefaultSortBy(): void
     {
         // Arrange
@@ -185,9 +176,7 @@ final class DataMapperTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOneToManyRelationDetectsForeignDefaultSortByWithoutDirection(): void
     {
         // Arrange
@@ -209,9 +198,7 @@ final class DataMapperTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOneToManyRelationDetectsForeignDefaultSortByWithDirection(): void
     {
         // Arrange
@@ -233,9 +220,7 @@ final class DataMapperTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOneToManyRelationDetectsMultipleForeignDefaultSortByWithAndWithoutDirection(): void
     {
         // Arrange
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/PersistenceManagerTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/PersistenceManagerTest.php
index 607c914a8a9d78f73d150c6c5f7ea3a384b95c6e..21e84acf53d417f083769be18462739e95b90a4c 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/PersistenceManagerTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/PersistenceManagerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use TYPO3\CMS\Core\Utility\StringUtility;
 use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
@@ -32,9 +33,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PersistenceManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function persistAllPassesAddedObjectsToBackend(): void
     {
         $entity2 = new Entity2();
@@ -53,9 +52,7 @@ final class PersistenceManagerTest extends UnitTestCase
         $manager->persistAll();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function persistAllPassesRemovedObjectsToBackend(): void
     {
         $entity2 = new Entity2();
@@ -74,9 +71,7 @@ final class PersistenceManagerTest extends UnitTestCase
         $manager->persistAll();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierByObjectReturnsIdentifierFromBackend(): void
     {
         $fakeUuid = 'fakeUuid';
@@ -94,9 +89,7 @@ final class PersistenceManagerTest extends UnitTestCase
         self::assertEquals($manager->getIdentifierByObject($object), $fakeUuid);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getObjectByIdentifierReturnsObjectFromSessionIfAvailable(): void
     {
         $fakeUuid = 'fakeUuid';
@@ -115,9 +108,7 @@ final class PersistenceManagerTest extends UnitTestCase
         self::assertEquals($manager->getObjectByIdentifier($fakeUuid, $object::class), $object);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getObjectByIdentifierReturnsObjectFromPersistenceIfAvailable(): void
     {
         $fakeUuid = '42';
@@ -142,9 +133,7 @@ final class PersistenceManagerTest extends UnitTestCase
         self::assertEquals($manager->getObjectByIdentifier($fakeUuid, $fakeEntityType), $object);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getObjectByIdentifierReturnsNullForUnknownObject(): void
     {
         $fakeUuid = '42';
@@ -171,9 +160,7 @@ final class PersistenceManagerTest extends UnitTestCase
         self::assertNull($manager->getObjectByIdentifier($fakeUuid, $fakeEntityType));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addActuallyAddsAnObjectToTheInternalObjectsArray(): void
     {
         $someObject = new \stdClass();
@@ -197,9 +184,7 @@ final class PersistenceManagerTest extends UnitTestCase
         $persistenceManager->persistAll();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeActuallyRemovesAnObjectFromTheInternalObjectsArray(): void
     {
         $object1 = new \stdClass();
@@ -234,9 +219,7 @@ final class PersistenceManagerTest extends UnitTestCase
         $persistenceManager->persistAll();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeRemovesTheRightObjectEvenIfItHasBeenModifiedSinceItsAddition(): void
     {
         $object1 = new \ArrayObject(['val' => '1']);
@@ -277,9 +260,8 @@ final class PersistenceManagerTest extends UnitTestCase
     /**
      * Make sure we remember the objects that are not currently add()ed
      * but might be in persistent storage.
-     *
-     * @test
      */
+    #[Test]
     public function removeRetainsObjectForObjectsNotInCurrentSession(): void
     {
         $object = new \ArrayObject(['val' => '1']);
@@ -303,9 +285,7 @@ final class PersistenceManagerTest extends UnitTestCase
         $persistenceManager->persistAll();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updateSchedulesAnObjectForPersistence(): void
     {
         $className = StringUtility::getUniqueId('BazFixture');
@@ -356,9 +336,7 @@ final class PersistenceManagerTest extends UnitTestCase
         $persistenceManager->persistAll();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tearDownWithBackendSupportingTearDownDelegatesCallToBackend(): void
     {
         $mockBackend = $this->getMockBuilder(BackendInterface::class)
@@ -376,9 +354,7 @@ final class PersistenceManagerTest extends UnitTestCase
         $persistenceManager->tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function persistAllAddsNamespacedReconstitutedObjectFromSessionToBackendsAggregateRootObjects(): void
     {
         $className = StringUtility::getUniqueId('BazFixture');
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryFactoryTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryFactoryTest.php
index 13fbd4ec434f559d61b9ccb8468b91e6bd7bd195..c24923b5ff7afe8c36453fbff2fc16fc825be925 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryFactoryTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryFactoryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Container\ContainerInterface;
 use TYPO3\CMS\Core\Context\Context;
@@ -77,10 +79,9 @@ final class QueryFactoryTest extends UnitTestCase
      * @param bool $static
      * @param bool $rootLevel
      * @param bool $expectedResult
-     *
-     * @dataProvider getStaticAndRootLevelAndExpectedResult
-     * @test
      */
+    #[DataProvider('getStaticAndRootLevelAndExpectedResult')]
+    #[Test]
     public function createDoesNotRespectStoragePageIfStaticOrRootLevelIsTrue($static, $rootLevel, $expectedResult): void
     {
         $this->dataMap->method('getIsStatic')->willReturn($static);
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryResultTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryResultTest.php
index c72c80ac86691304d95607355103475e25c1d8de..0028ddc02d3feb85ad6cac62b44d7ef6cf2d46b5 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryResultTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryResultTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper;
 use TYPO3\CMS\Extbase\Persistence\Generic\QueryResult;
 use TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface;
@@ -65,27 +66,21 @@ final class QueryResultTest extends UnitTestCase
         $this->mockDataMapper->method('map')->willReturn($this->sampleResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getQueryReturnsQueryObject(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
         self::assertInstanceOf(QueryInterface::class, $this->queryResult->getQuery());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getQueryReturnsAClone(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
         self::assertNotSame($this->mockQuery, $this->queryResult->getQuery());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetExistsWorksAsExpected(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -94,9 +89,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertFalse($this->queryResult->offsetExists('foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetGetWorksAsExpected(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -105,9 +98,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertNull($this->queryResult->offsetGet('foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetSetWorksAsExpected(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -115,9 +106,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertInstanceOf(\stdClass::class, $this->queryResult->offsetGet(0));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetUnsetWorksAsExpected(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -125,9 +114,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertFalse($this->queryResult->offsetExists(0));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countDoesNotInitializeProxy(): void
     {
         $queryResult = $this->getAccessibleMock(QueryResult::class, ['initialize'], [], '', false);
@@ -138,9 +125,7 @@ final class QueryResultTest extends UnitTestCase
         $queryResult->count();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countCallsGetObjectCountByQueryOnPersistenceManager(): void
     {
         $queryResult = $this->getAccessibleMock(QueryResult::class, ['initialize'], [], '', false);
@@ -150,9 +135,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertEquals(2, $queryResult->count());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countCountsQueryResultDirectlyIfAlreadyInitialized(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -161,9 +144,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertEquals(2, $this->queryResult->count());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countOnlyCallsGetObjectCountByQueryOnPersistenceManagerOnce(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -172,9 +153,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertEquals(2, $this->queryResult->count());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countCallsGetObjectCountByQueryIfOffsetChanges(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -191,9 +170,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertSame(3, $thirdCount);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function iteratorMethodsAreCorrectlyImplemented(): void
     {
         $this->queryResult->setQuery($this->mockQuery);
@@ -214,9 +191,7 @@ final class QueryResultTest extends UnitTestCase
         self::assertEquals($array1, $this->queryResult->current());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeExecutesQueryWithArrayFetchMode(): void
     {
         $queryResult = $this->getAccessibleMock(QueryResult::class, null, [], '', false);
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryTest.php
index 860dc599721c013bdefad888687ba34360e90894..700fe0f6e84af47bde61b57e69dc43b05101edf4 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/QueryTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Container\ContainerInterface;
 use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapFactory;
@@ -59,9 +61,7 @@ final class QueryTest extends UnitTestCase
         $this->query->_set('container', $this->container);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function executeReturnsQueryResultInstanceAndInjectsItself(): void
     {
         $queryResult = $this->createMock(QueryResult::class);
@@ -70,9 +70,7 @@ final class QueryTest extends UnitTestCase
         self::assertSame($queryResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function executeReturnsRawObjectDataIfReturnRawQueryResultIsSet(): void
     {
         $this->persistenceManager->expects(self::once())->method('getObjectDataByQuery')->with($this->query)->willReturn('rawQueryResult');
@@ -81,9 +79,7 @@ final class QueryTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLimitAcceptsOnlyIntegers(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -91,9 +87,7 @@ final class QueryTest extends UnitTestCase
         $this->query->setLimit(1.5);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLimitRejectsIntegersLessThanOne(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -101,9 +95,7 @@ final class QueryTest extends UnitTestCase
         $this->query->setLimit(0);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLimitSetsLimit(): void
     {
         $this->query->setLimit(15);
@@ -114,9 +106,7 @@ final class QueryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unsetLimitWillResetLimitToNull(): void
     {
         $this->query->setLimit(15);
@@ -127,9 +117,7 @@ final class QueryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOffsetAcceptsOnlyIntegers(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -137,9 +125,7 @@ final class QueryTest extends UnitTestCase
         $this->query->setOffset(1.5);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setOffsetRejectsIntegersLessThanZero(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -160,11 +146,11 @@ final class QueryTest extends UnitTestCase
     /**
      * Checks if equals condition makes utf-8 argument lowercase correctly
      *
-     * @test
-     * @dataProvider equalsForCaseSensitiveFalseLowercasesOperandProvider
      * @param string $propertyName The name of the property to compare against
      * @param mixed $operand The value to compare with
      */
+    #[DataProvider('equalsForCaseSensitiveFalseLowercasesOperandProvider')]
+    #[Test]
     public function equalsForCaseSensitiveFalseLowercasesOperand(string $propertyName, $operand, string $expectedOperand): void
     {
         $qomFactory = $this->getAccessibleMock(QueryObjectModelFactory::class, ['comparison']);
@@ -174,9 +160,7 @@ final class QueryTest extends UnitTestCase
         $this->query->equals($propertyName, $operand, false);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logicalAndSupportsMultipleConstraintsAsMethodArguments(): void
     {
         $subject = new Query(
@@ -197,9 +181,7 @@ final class QueryTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function logicalOrSupportsMultipleConstraintsAsMethodArguments(): void
     {
         $subject = new Query(
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/SessionTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/SessionTest.php
index 1933ef8d01c84df3a33dbaa6f446f013209d0d8c..f6b2b1f1d3316c73cf7b415d055ca99ab67e4a7b 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/SessionTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/SessionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject;
 use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
 use TYPO3\CMS\Extbase\Persistence\Generic\Session;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SessionTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function objectRegisteredWithRegisterReconstitutedEntityCanBeRetrievedWithGetReconstitutedEntities(): void
     {
         $someObject = new class () extends AbstractDomainObject {};
@@ -37,9 +36,7 @@ final class SessionTest extends UnitTestCase
         self::assertTrue($ReconstitutedEntities->contains($someObject));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unregisterReconstitutedEntityRemovesObjectFromSession(): void
     {
         $someObject = new class () extends AbstractDomainObject {};
@@ -52,9 +49,7 @@ final class SessionTest extends UnitTestCase
         self::assertFalse($ReconstitutedEntities->contains($someObject));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasObjectReturnsTrueForRegisteredObject(): void
     {
         $object1 = new class () extends AbstractDomainObject {};
@@ -66,9 +61,7 @@ final class SessionTest extends UnitTestCase
         self::assertFalse($session->hasObject($object2), 'Session claims it does have unregistered object.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasIdentifierReturnsTrueForRegisteredObject(): void
     {
         $object = new class () extends AbstractDomainObject {};
@@ -79,9 +72,7 @@ final class SessionTest extends UnitTestCase
         self::assertFalse($session->hasIdentifier('67890', $object::class), 'Session claims it does have unregistered object.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getIdentifierByObjectReturnsRegisteredUUIDForObject(): void
     {
         $object = new class () extends AbstractDomainObject {};
@@ -91,9 +82,7 @@ final class SessionTest extends UnitTestCase
         self::assertEquals('12345', $session->getIdentifierByObject($object), 'Did not get UUID registered for object.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getObjectByIdentifierReturnsRegisteredObjectForUUID(): void
     {
         $object = new class () extends AbstractDomainObject {};
@@ -103,9 +92,7 @@ final class SessionTest extends UnitTestCase
         self::assertSame($session->getObjectByIdentifier('12345', $object::class), $object, 'Did not get object registered for UUID.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unregisterObjectRemovesRegisteredObject(): void
     {
         $object1 = new class () extends AbstractDomainObject {};
@@ -127,9 +114,7 @@ final class SessionTest extends UnitTestCase
         self::assertTrue($session->hasIdentifier('67890', $object2::class), 'Session claims it does not have registered object.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function newSessionIsEmpty(): void
     {
         $persistenceSession = new Session();
@@ -137,9 +122,7 @@ final class SessionTest extends UnitTestCase
         self::assertCount(0, $reconstitutedObjects, 'The reconstituted objects storage was not empty.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectCanBeRegisteredAsReconstituted(): void
     {
         $persistenceSession = new Session();
@@ -149,9 +132,7 @@ final class SessionTest extends UnitTestCase
         self::assertTrue($reconstitutedObjects->contains($entity), 'The object was not registered as reconstituted.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectCanBeUnregisteredAsReconstituted(): void
     {
         $persistenceSession = new Session();
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Typo3QuerySettingsTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Typo3QuerySettingsTest.php
index 453d86326b58e7a627c07620bb8579182fd6f50e..0d5a3833348b9a4fbbdfccb8cd683e049b3a0f3c 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Typo3QuerySettingsTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/Generic/Typo3QuerySettingsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Context\LanguageAspect;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
@@ -68,99 +70,77 @@ final class Typo3QuerySettingsTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider booleanValueProvider
-     */
+    #[DataProvider('booleanValueProvider')]
+    #[Test]
     public function setRespectStoragePageSetsRespectStoragePageCorrectly(bool $input): void
     {
         $this->subject->setRespectStoragePage($input);
         self::assertEquals($input, $this->subject->getRespectStoragePage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRespectStoragePageAllowsChaining(): void
     {
         self::assertInstanceOf(QuerySettingsInterface::class, $this->subject->setRespectStoragePage(true));
     }
 
-    /**
-     * @test
-     * @dataProvider arrayValueProvider
-     */
+    #[DataProvider('arrayValueProvider')]
+    #[Test]
     public function setStoragePageIdsSetsStoragePageIdsCorrectly(array $input): void
     {
         $this->subject->setStoragePageIds($input);
         self::assertEquals($input, $this->subject->getStoragePageIds());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setStoragePageIdsAllowsChaining(): void
     {
         self::assertInstanceOf(QuerySettingsInterface::class, $this->subject->setStoragePageIds([1, 2, 3]));
     }
 
-    /**
-     * @test
-     * @dataProvider booleanValueProvider
-     */
+    #[DataProvider('booleanValueProvider')]
+    #[Test]
     public function setRespectSysLanguageSetsRespectSysLanguageCorrectly(bool $input): void
     {
         $this->subject->setRespectSysLanguage($input);
         self::assertEquals($input, $this->subject->getRespectSysLanguage());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRespectSysLanguageAllowsChaining(): void
     {
         self::assertInstanceOf(QuerySettingsInterface::class, $this->subject->setRespectSysLanguage(true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setLanguageAspectHasFluentInterface(): void
     {
         self::assertSame($this->subject, $this->subject->setLanguageAspect(new LanguageAspect(1)));
     }
 
-    /**
-     * @test
-     * @dataProvider booleanValueProvider
-     */
+    #[DataProvider('booleanValueProvider')]
+    #[Test]
     public function setIgnoreEnableFieldsSetsIgnoreEnableFieldsCorrectly(bool $input): void
     {
         $this->subject->setIgnoreEnableFields($input);
         self::assertEquals($input, $this->subject->getIgnoreEnableFields());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIgnoreEnableFieldsAllowsChaining(): void
     {
         self::assertInstanceOf(QuerySettingsInterface::class, $this->subject->setIgnoreEnableFields(true));
     }
 
-    /**
-     * @test
-     * @dataProvider arrayValueProvider
-     */
+    #[DataProvider('arrayValueProvider')]
+    #[Test]
     public function setEnableFieldsToBeIgnoredSetsEnableFieldsToBeIgnoredCorrectly(array $input): void
     {
         $this->subject->setEnableFieldsToBeIgnored($input);
         self::assertEquals($input, $this->subject->getEnableFieldsToBeIgnored());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setEnableFieldsToBeIgnoredAllowsChaining(): void
     {
         self::assertInstanceOf(
@@ -169,19 +149,15 @@ final class Typo3QuerySettingsTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider booleanValueProvider
-     */
+    #[DataProvider('booleanValueProvider')]
+    #[Test]
     public function setIncludeDeletedSetsIncludeDeletedCorrectly(bool $input): void
     {
         $this->subject->setIncludeDeleted($input);
         self::assertEquals($input, $this->subject->getIncludeDeleted());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setIncludeDeletedAllowsChaining(): void
     {
         self::assertInstanceOf(QuerySettingsInterface::class, $this->subject->setIncludeDeleted(true));
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/ObjectStorageTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/ObjectStorageTest.php
index 707f4a54e47e116e389fae44d31b87747adb8693..8a4add108c38f9a3374e0dff84677e3225104bbb 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/ObjectStorageTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/ObjectStorageTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
 use TYPO3\CMS\Extbase\Tests\Unit\Persistence\Fixture\Domain\Model\Entity;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ObjectStorageTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function currentForEmptyStorageReturnsNull(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -36,9 +36,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertNull($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countForEmptyStorageIsZero(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -47,9 +45,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(0, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getInfoForEmptyStorageReturnsNull(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -60,9 +56,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertNull($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attachWithInformationMakesAttachedInformationAvailableUsingTheObjectAsKey(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -75,9 +69,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($information, $objectStorage[$object]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attachForEmptyStorageIncreasesCountByOne(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -89,9 +81,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(1, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attachForNonEmptyStorageIncreasesCountByOne(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -104,9 +94,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(2, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function attachingAnObjectUsingArrayAssignmentWithInformationIncreasesCountByOne(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -119,9 +107,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(2, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function detachForAttachedObjectReducesCountByOne(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -137,9 +123,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(1, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetSetIncreasesCountByOne(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -152,9 +136,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(2, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetUnsetWithObjectReducesCountByOne(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -169,9 +151,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(1, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetUnsetWithIntegerKeyReducesCountByOne(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -186,9 +166,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(1, $objectStorage);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetGetForNoneExistingIntegerEntryReturnsNull(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -197,9 +175,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertNull($objectStorage->offsetGet(1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetGetForNoneExistingObjectEntryReturnsNull(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -209,9 +185,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertNull($objectStorage->offsetGet($object));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetGetForObjectAttachedWithoutWithoutInformationReturnsNull(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -222,9 +196,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertNull($objectStorage->offsetGet($object));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetGetForObjectWithInformationAttachedUsingArrayAssignmentReturnsTheAssociatedInformation(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -236,9 +208,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($information, $objectStorage->offsetGet($object1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetGetForObjectWithInformationAttachedUsingAttachReturnsTheAssociatedInformation(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -250,9 +220,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($information, $objectStorage->offsetGet($object1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetGetWithIntegerKeyReturnsTheAssociatedObject(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -263,9 +231,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($object, $objectStorage->offsetGet(0));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetExistsWithObjectAddedToStorageReturnsTrue(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -276,9 +242,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertTrue($objectStorage->offsetExists($object));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetExistsWithObjectNotAddedToStorageReturnsFalse(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -287,9 +251,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertFalse($objectStorage->offsetExists(new Entity()));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetExistsWithIntegerKeyInStorageReturnsTrue(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -300,9 +262,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertTrue($objectStorage->offsetExists(0));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetExistsWithIntegerKeyNotInStorageReturnsFalse(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -311,9 +271,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertFalse($objectStorage->offsetExists(0));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function offsetExistsWithNumericStringKeyNotInStorageReturnsFalse(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -334,10 +292,8 @@ final class ObjectStorageTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider informationDataProvider
-     */
+    #[DataProvider('informationDataProvider')]
+    #[Test]
     public function getInfoReturnsTheInformationAssociatedWithTheCurrentIteratorEntry(mixed $information): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -349,10 +305,8 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($information, $objectStorage->getInfo());
     }
 
-    /**
-     * @test
-     * @dataProvider informationDataProvider
-     */
+    #[DataProvider('informationDataProvider')]
+    #[Test]
     public function setInfoSetsTheInformationAssociatedWithTheCurrentIteratorEntry(mixed $information): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -365,10 +319,8 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($information, $objectStorage[$object]);
     }
 
-    /**
-     * @test
-     * @dataProvider informationDataProvider
-     */
+    #[DataProvider('informationDataProvider')]
+    #[Test]
     public function setInfoOverwritesTheInformationAssociatedWithTheCurrentIteratorEntry(mixed $information): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -381,9 +333,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($information, $objectStorage[$object]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeAllRemovesObjectsContainedInAnotherStorageFromTheCurrentStorage(): void
     {
         $object1 = new Entity();
@@ -400,9 +350,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(0, $objectStorageToRemoveFrom);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeAllRemovesRemovesObjectWithDifferentInformationFromTheCurrentStorage(): void
     {
         $object1 = new Entity();
@@ -419,9 +367,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(0, $objectStorageToRemoveFrom);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeAllKeepsObjectsNotContainedInTheOtherStorage(): void
     {
         $object1 = new Entity();
@@ -439,9 +385,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(1, $objectStorageToRemoveFrom);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeAlIgnoresAdditionsObjectsContainedInOtherStorage(): void
     {
         $object1 = new Entity();
@@ -459,9 +403,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertCount(1, $objectStorageToRemoveFrom);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addAllAddsAllObjectsFromAnotherStorage(): void
     {
         $object = new Entity();
@@ -477,9 +419,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertTrue($storageToAddTo->contains($object));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addAllAlsoAddsInformationOfTheAddedObjects(): void
     {
         $object = new Entity();
@@ -496,9 +436,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame($information, $storageToAddTo[$object]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function toArrayReturnsObjectsInStorageUsingIntegerKeys(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -511,9 +449,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame([0 => $object1, 1 => $object2], $objectStorage->toArray());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getArrayReturnsObjectsInStorageUsingIntegerKeys(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -526,9 +462,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertSame([0 => $object1, 1 => $object2], $objectStorage->getArray());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function relationsAreNotDirtyOnAttaching(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -540,9 +474,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertFalse($objectStorage->isRelationDirty($object));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function relationsAreNotDirtyOnAttachingAndRemoving(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -555,9 +487,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertFalse($objectStorage->isRelationDirty($object1));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function relationsAreNotDirtyOnReAddingAtSamePosition(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
@@ -576,9 +506,7 @@ final class ObjectStorageTest extends UnitTestCase
         self::assertFalse($objectStorage->isRelationDirty($object2));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function relationsAreDirtyOnReAddingAtOtherPosition(): void
     {
         /** @var ObjectStorage<Entity> $objectStorage */
diff --git a/typo3/sysext/extbase/Tests/Unit/Persistence/RepositoryTest.php b/typo3/sysext/extbase/Tests/Unit/Persistence/RepositoryTest.php
index 9cd391f7e896a0ee4f878c1877d4e96bb33c34b5..fe91d66aa2f80bb618d222ed315c3a0ce942ed90 100644
--- a/typo3/sysext/extbase/Tests/Unit/Persistence/RepositoryTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Persistence/RepositoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Persistence;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
 use TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException;
@@ -104,17 +105,13 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->injectPersistenceManager($this->mockPersistenceManager);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function abstractRepositoryImplementsRepositoryInterface(): void
     {
         self::assertInstanceOf(RepositoryInterface::class, $this->repository);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createQueryCallsPersistenceManagerWithExpectedClassName(): void
     {
         $mockPersistenceManager = $this->createMock(PersistenceManager::class);
@@ -126,9 +123,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->createQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createQuerySetsDefaultOrderingIfDefined(): void
     {
         $orderings = ['foo' => QueryInterface::ORDER_ASCENDING];
@@ -146,9 +141,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->createQuery();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findAllCreatesQueryAndReturnsResultOfExecuteCall(): void
     {
         $expectedResult = $this->createMock(QueryResultInterface::class);
@@ -164,9 +157,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertSame($expectedResult, $repository->findAll());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findByIdentifierReturnsResultOfGetObjectByIdentifierCallFromBackend(): void
     {
         $identifier = '42';
@@ -184,9 +175,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertSame($object, $this->repository->findByIdentifier($identifier));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDelegatesToPersistenceManager(): void
     {
         $object = new \stdClass();
@@ -197,9 +186,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->add($object);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDelegatesToPersistenceManager(): void
     {
         $object = new \stdClass();
@@ -210,9 +197,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->remove($object);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updateDelegatesToPersistenceManager(): void
     {
         $object = new \stdClass();
@@ -223,9 +208,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->update($object);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function magicCallMethodTriggersAnErrorIfUnknownMethodsAreCalled(): void
     {
         $this->expectException(UnsupportedMethodException::class);
@@ -236,9 +219,7 @@ final class RepositoryTest extends UnitTestCase
         $repository->__call('foo', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addChecksObjectType(): void
     {
         $this->expectException(IllegalObjectTypeException::class);
@@ -247,9 +228,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->add(new \stdClass());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeChecksObjectType(): void
     {
         $this->expectException(IllegalObjectTypeException::class);
@@ -258,9 +237,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->remove(new \stdClass());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updateChecksObjectType(): void
     {
         $this->expectException(IllegalObjectTypeException::class);
@@ -271,9 +248,7 @@ final class RepositoryTest extends UnitTestCase
         $repository->update(new \stdClass());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructSetsObjectTypeFromClassName(): void
     {
         $repository = new EntityRepository();
@@ -284,9 +259,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertEquals(Entity::class, $objectType);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createQueryReturnsQueryWithUnmodifiedDefaultQuerySettings(): void
     {
         $this->mockQuery = $this->createMock(Query::class);
@@ -298,9 +271,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertNotSame($mockDefaultQuerySettings, $instanceQuerySettings);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findByUidReturnsResultOfGetObjectByIdentifierCall(): void
     {
         $fakeUid = '123';
@@ -314,9 +285,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updateRejectsObjectsOfWrongType(): void
     {
         $this->expectException(IllegalObjectTypeException::class);
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationBuilderTest.php b/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationBuilderTest.php
index 1bdd2ea02ebc6c0f4c068ef25cc616514be681e1..bf003a6afa540ef439f73a922c1a1ea67efb1ef1 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationBuilderTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationBuilderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationBuilder;
 use TYPO3\CMS\Extbase\Property\TypeConverter\PersistentObjectConverter;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -31,9 +32,7 @@ final class PropertyMappingConfigurationBuilderTest extends UnitTestCase
         $this->propertyMappingConfigurationBuilder = new PropertyMappingConfigurationBuilder();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPropertyNameShouldReturnTheUnmodifiedPropertyNameWithoutConfiguration(): void
     {
         $defaultConfiguration = $this->propertyMappingConfigurationBuilder->build();
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationTest.php b/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationTest.php
index 7f644e2dd144261a37a9698f6d5bb2a401dcc943..3cfd24f156147feb5110fa639620f69b63f7c4fd 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/PropertyMappingConfigurationTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration;
 use TYPO3\CMS\Extbase\Property\TypeConverterInterface;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PropertyMappingConfigurationTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPropertyNameShouldReturnTheUnmodifiedPropertyNameWithoutConfiguration(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -33,9 +33,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertEquals('someOtherSourceProperty', $subject->getTargetPropertyName('someOtherSourceProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function shouldMapReturnsFalseByDefault(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -43,9 +41,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertFalse($subject->shouldMap('someOtherSourceProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function shouldMapReturnsTrueIfConfigured(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -54,9 +50,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertTrue($subject->shouldMap('someOtherSourceProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function shouldMapReturnsTrueForAllowedProperties(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -65,9 +59,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertTrue($subject->shouldMap('someOtherProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function shouldMapReturnsFalseForBlacklistedProperties(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -77,9 +69,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertTrue($subject->shouldMap('someOtherPropertyWhichHasNotBeenConfigured'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function shouldSkipReturnsFalseByDefault(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -87,9 +77,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertFalse($subject->shouldSkip('someOtherSourceProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function shouldSkipReturnsTrueIfConfigured(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -98,9 +86,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertTrue($subject->shouldSkip('someOtherSourceProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setTypeConverterOptionsCanBeRetrievedAgain(): void
     {
         $mockTypeConverterClass = get_class($this->createMock(TypeConverterInterface::class));
@@ -110,17 +96,13 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertEquals('v2', $subject->getConfigurationValue($mockTypeConverterClass, 'k2'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nonexistentTypeConverterOptionsReturnNull(): void
     {
         self::assertNull((new PropertyMappingConfiguration())->getConfigurationValue('foo', 'bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setTypeConverterOptionsShouldOverrideAlreadySetOptions(): void
     {
         $mockTypeConverterClass = get_class($this->createMock(TypeConverterInterface::class));
@@ -131,9 +113,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertNull($subject->getConfigurationValue($mockTypeConverterClass, 'k2'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setTypeConverterOptionShouldOverrideAlreadySetOptions(): void
     {
         $mockTypeConverterClass = get_class($this->createMock(TypeConverterInterface::class));
@@ -144,17 +124,13 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertEquals('v2', $subject->getConfigurationValue($mockTypeConverterClass, 'k2'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTypeConverterReturnsNullIfNoTypeConverterSet(): void
     {
         self::assertNull((new PropertyMappingConfiguration())->getTypeConverter());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTypeConverterReturnsTypeConverterIfItHasBeenSet(): void
     {
         $mockTypeConverter = $this->createMock(TypeConverterInterface::class);
@@ -163,9 +139,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertSame($mockTypeConverter, $subject->getTypeConverter());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPropertyNameShouldRespectMapping(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -184,19 +158,15 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider fluentInterfaceMethodsDataProvider
-     */
+    #[DataProvider('fluentInterfaceMethodsDataProvider')]
+    #[Test]
     public function respectiveMethodsProvideFluentInterface($methodToTestForFluentInterface, array $argumentsForMethod = []): void
     {
         $subject = new PropertyMappingConfiguration();
         self::assertSame($subject, $subject->$methodToTestForFluentInterface(...$argumentsForMethod));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setTypeConverterOptionReturnsThis(): void
     {
         $mockTypeConverter = $this->createMock(TypeConverterInterface::class);
@@ -205,9 +175,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertSame($subject, $subject->setTypeConverterOption($mockTypeConverterClass, 'key', 'value'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setTypeConverterOptionsReturnsThis(): void
     {
         $mockTypeConverter = $this->createMock(TypeConverterInterface::class);
@@ -216,9 +184,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertSame($subject, $subject->setTypeConverterOptions($mockTypeConverterClass, []));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setTypeConverterReturnsThis(): void
     {
         $mockTypeConverter = $this->createMock(TypeConverterInterface::class);
@@ -226,9 +192,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertSame($subject, $subject->setTypeConverter($mockTypeConverter));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forPropertyWithAsteriskAllowsArbitraryPropertyNamesWithGetConfigurationFor(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -238,9 +202,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertSame('v1', $configuration->getConfigurationValue(\stdClass::class, 'k1'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forPropertyWithAsteriskAllowsArbitraryPropertyNamesWithForProperty(): void
     {
         $subject = new PropertyMappingConfiguration();
@@ -250,9 +212,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         self::assertSame('v1', $configuration->getConfigurationValue(\stdClass::class, 'k1'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forPropertyWithAsteriskAllowsArbitraryPropertyNamesWithShouldMap(): void
     {
         $subject = new PropertyMappingConfiguration();
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/ArrayConverterTest.php b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/ArrayConverterTest.php
index 2cd53266d3141bd69e6d5b5ad3d82a51d4070638..cc5988b4326523e95ad7154e7b2bd4d0091e4c08 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/ArrayConverterTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/ArrayConverterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Property\Exception\TypeConverterException;
 use TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration;
 use TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface;
@@ -25,18 +27,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ArrayConverterTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromDoesNotModifyTheSourceArray(): void
     {
         $sourceArray = ['Foo' => 'Bar', 'Baz'];
         self::assertEquals($sourceArray, (new ArrayConverter())->convertFrom($sourceArray, 'array'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function canConvertFromEmptyStringToArray(): void
     {
         self::assertEquals([], (new ArrayConverter())->convertFrom('', 'array'));
@@ -93,18 +91,14 @@ final class ArrayConverterTest extends UnitTestCase
         return $configuration;
     }
 
-    /**
-     * @test
-     * @dataProvider stringToArrayWithConfigurationDataProvider
-     */
+    #[DataProvider('stringToArrayWithConfigurationDataProvider')]
+    #[Test]
     public function canConvertWithConfigurationFromString(string $source, PropertyMappingConfigurationInterface $configuration, array $expectedResult): void
     {
         self::assertEquals($expectedResult, (new ArrayConverter())->convertFrom($source, 'array', [], $configuration));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsTypeConverterExceptionIfDelimiterIsNotGiven(): void
     {
         $this->expectException(TypeConverterException::class);
@@ -112,9 +106,7 @@ final class ArrayConverterTest extends UnitTestCase
         (new ArrayConverter())->convertFrom('foo', 'array', [], new PropertyMappingConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function returnsSourceUnchangedIfNonEmptyValueWithNoConfigurationIsGiven(): void
     {
         self::assertSame('foo', (new ArrayConverter())->convertFrom('foo', 'array', []));
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/BooleanConverterTest.php b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/BooleanConverterTest.php
index be9fb210542f480226c25adbf9476bcb0da9e4da..1a9e70bbf3028d920cced1c708757ad10aa4dde8 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/BooleanConverterTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/BooleanConverterTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Property\TypeConverter\BooleanConverter;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -30,27 +31,21 @@ final class BooleanConverterTest extends UnitTestCase
         $this->converter = new BooleanConverter();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromDoesNotModifyTheBooleanSource(): void
     {
         $source = true;
         self::assertEquals($source, $this->converter->convertFrom($source, 'boolean'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromCastsSourceStringToBoolean(): void
     {
         $source = 'true';
         self::assertTrue($this->converter->convertFrom($source, 'boolean'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromCastsNumericSourceStringToBoolean(): void
     {
         $source = '1';
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/DateTimeConverterTest.php b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/DateTimeConverterTest.php
index 99469c2ab24c09411fa7a749f317063faf6bc708..600262c9c82d6936ec9624d1997410fe99cf0027 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/DateTimeConverterTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/DateTimeConverterTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Error\Error;
 use TYPO3\CMS\Extbase\Property\Exception\TypeConverterException;
 use TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration;
@@ -35,20 +37,14 @@ final class DateTimeConverterTest extends UnitTestCase
         $this->converter = new DateTimeConverter();
     }
 
-    /** String to DateTime testcases  **/
-
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromReturnsErrorIfGivenStringCantBeConverted(): void
     {
         $error = $this->converter->convertFrom('1980-12-13', 'DateTime');
         self::assertInstanceOf(Error::class, $error);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromProperlyConvertsStringWithDefaultDateFormat(): void
     {
         $expectedResult = '1980-12-13T20:15:07+01:23';
@@ -57,9 +53,7 @@ final class DateTimeConverterTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromUsesDefaultDateFormatIfItIsNotConfigured(): void
     {
         $expectedResult = '1980-12-13T20:15:07+01:23';
@@ -75,9 +69,7 @@ final class DateTimeConverterTest extends UnitTestCase
         self::assertSame($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromEmptyStringReturnsNull(): void
     {
         $date = $this->converter->convertFrom('', 'DateTime', [], null);
@@ -105,9 +97,9 @@ final class DateTimeConverterTest extends UnitTestCase
      * @param string $source the string to be converted
      * @param string|null $dateFormat the expected date format
      * @param bool $isValid TRUE if the conversion is expected to be successful, otherwise FALSE
-     * @test
-     * @dataProvider convertFromStringDataProvider
      */
+    #[DataProvider('convertFromStringDataProvider')]
+    #[Test]
     public function convertFromStringTests(string $source, ?string $dateFormat, bool $isValid): void
     {
         if ($dateFormat !== null) {
@@ -145,10 +137,8 @@ final class DateTimeConverterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider
-     */
+    #[DataProvider('convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider')]
+    #[Test]
     public function convertFromIntegerOrDigitStringWithoutConfigurationTests(string|int $source): void
     {
         $date = $this->converter->convertFrom($source, 'DateTime', [], null);
@@ -156,12 +146,8 @@ final class DateTimeConverterTest extends UnitTestCase
         self::assertSame((string)$source, $date->format('U'));
     }
 
-    /** Array to DateTime testcases  **/
-
-    /**
-     * @test
-     * @dataProvider convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider
-     */
+    #[DataProvider('convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider')]
+    #[Test]
     public function convertFromIntegerOrDigitStringInArrayWithoutConfigurationTests(string|int $source): void
     {
         $date = $this->converter->convertFrom(['date' => $source], 'DateTime', [], null);
@@ -169,18 +155,14 @@ final class DateTimeConverterTest extends UnitTestCase
         self::assertSame((string)$source, $date->format('U'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromReturnsErrorIfGivenArrayCantBeConverted(): void
     {
         $error = $this->converter->convertFrom(['date' => '1980-12-13'], 'DateTime');
         self::assertInstanceOf(Error::class, $error);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromThrowsExceptionIfGivenArrayDoesNotSpecifyTheDate(): void
     {
         $this->expectException(TypeConverterException::class);
@@ -188,9 +170,7 @@ final class DateTimeConverterTest extends UnitTestCase
         $this->converter->convertFrom(['hour' => '12', 'minute' => '30'], 'DateTime');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromProperlyConvertsArrayWithDefaultDateFormat(): void
     {
         $expectedResult = '1980-12-13T20:15:07+01:23';
@@ -214,10 +194,8 @@ final class DateTimeConverterTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidDatePartKeyValuesDataProvider
-     */
+    #[DataProvider('invalidDatePartKeyValuesDataProvider')]
+    #[Test]
     public function convertFromThrowsExceptionIfDatePartKeysHaveInvalidValuesSpecified($source): void
     {
         $this->expectException(TypeConverterException::class);
@@ -225,9 +203,7 @@ final class DateTimeConverterTest extends UnitTestCase
         $this->converter->convertFrom($source, 'DateTime');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromProperlyConvertsArrayWithDateAsArray(): void
     {
         $source = ['day' => '13', 'month' => '10', 'year' => '2010'];
@@ -243,9 +219,7 @@ final class DateTimeConverterTest extends UnitTestCase
         self::assertSame('2010-10-13', $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromAllowsToOverrideTheTime(): void
     {
         $source = [
@@ -262,9 +236,7 @@ final class DateTimeConverterTest extends UnitTestCase
         self::assertSame('59', $date->format('s'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromAllowsToOverrideTheTimezone(): void
     {
         $source = [
@@ -280,9 +252,7 @@ final class DateTimeConverterTest extends UnitTestCase
         self::assertSame('Atlantic/Reykjavik', $date->getTimezone()->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromThrowsExceptionIfSpecifiedTimezoneIsInvalid(): void
     {
         $this->expectException(TypeConverterException::class);
@@ -295,9 +265,7 @@ final class DateTimeConverterTest extends UnitTestCase
         $this->converter->convertFrom($source, 'DateTime');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromArrayThrowsExceptionForEmptyArray(): void
     {
         $this->expectException(TypeConverterException::class);
@@ -305,9 +273,7 @@ final class DateTimeConverterTest extends UnitTestCase
         $this->converter->convertFrom([], 'DateTime', [], null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromArrayReturnsNullForEmptyDate(): void
     {
         self::assertNull($this->converter->convertFrom(['date' => ''], 'DateTime', [], null));
@@ -336,9 +302,9 @@ final class DateTimeConverterTest extends UnitTestCase
     /**
      * @param array $source the array to be converted
      * @param bool $isValid TRUE if the conversion is expected to be successful, otherwise FALSE
-     * @test
-     * @dataProvider convertFromArrayDataProvider
      */
+    #[DataProvider('convertFromArrayDataProvider')]
+    #[Test]
     public function convertFromArrayTests(array $source, $isValid, ?string $expectedResult): void
     {
         $dateFormat = isset($source['dateFormat']) && $source['dateFormat'] !== '' ? $source['dateFormat'] : null;
@@ -370,9 +336,7 @@ final class DateTimeConverterTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromSupportsDateTimeSubClasses(): void
     {
         $className = DateTimeSubFixture::class;
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/FloatConverterTest.php b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/FloatConverterTest.php
index b075208e6a06548e9d02ea35474cf600c8f5059b..b8334562dabda6ee97c97beda4130b2052341e5b 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/FloatConverterTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/FloatConverterTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Error\Error;
 use TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface;
 use TYPO3\CMS\Extbase\Property\TypeConverter\FloatConverter;
@@ -24,33 +25,25 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FloatConverterTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromShouldCastTheStringToFloat(): void
     {
         self::assertSame(1.5, (new FloatConverter())->convertFrom('1.5', 'float'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromReturnsNullIfEmptyStringSpecified(): void
     {
         self::assertNull((new FloatConverter())->convertFrom('', 'float'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromShouldAcceptIntegers(): void
     {
         self::assertSame((float)123, (new FloatConverter())->convertFrom(123, 'float'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromShouldRespectConfiguration(): void
     {
         $mockMappingConfiguration = $this->createMock(PropertyMappingConfigurationInterface::class);
@@ -70,17 +63,13 @@ final class FloatConverterTest extends UnitTestCase
         self::assertSame(1024.42, (new FloatConverter())->convertFrom('1.024,42', 'float', [], $mockMappingConfiguration));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromReturnsAnErrorIfSpecifiedStringIsNotNumeric(): void
     {
         self::assertInstanceOf(Error::class, (new FloatConverter())->convertFrom('not numeric', 'float'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSourceChildPropertiesToBeConvertedShouldReturnEmptyArray(): void
     {
         self::assertEquals([], (new FloatConverter())->getSourceChildPropertiesToBeConverted('myString'));
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/IntegerConverterTest.php b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/IntegerConverterTest.php
index 3465aa2c4fb0dc2fd3e79edf4273f93669d46cbe..f9c3f5dada74525def76f1131980f8e487052502 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/IntegerConverterTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/IntegerConverterTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Error\Error;
 use TYPO3\CMS\Extbase\Property\TypeConverter\IntegerConverter;
 use TYPO3\CMS\Extbase\Property\TypeConverterInterface;
@@ -35,42 +36,32 @@ final class IntegerConverterTest extends UnitTestCase
         $this->converter = new IntegerConverter();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromShouldCastTheStringToInteger(): void
     {
         self::assertSame(15, $this->converter->convertFrom('15', 'integer'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromDoesNotModifyIntegers(): void
     {
         $source = 123;
         self::assertSame($source, $this->converter->convertFrom($source, 'integer'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromReturnsNullIfEmptyStringSpecified(): void
     {
         self::assertNull($this->converter->convertFrom('', 'integer'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromReturnsAnErrorIfSpecifiedStringIsNotNumeric(): void
     {
         self::assertInstanceOf(Error::class, $this->converter->convertFrom('not numeric', 'integer'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSourceChildPropertiesToBeConvertedShouldReturnEmptyArray(): void
     {
         self::assertEquals([], $this->converter->getSourceChildPropertiesToBeConverted('myString'));
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/StringConverterTest.php b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/StringConverterTest.php
index ebdea36e5994aa469375aed095502854044f8eb8..80babdc2d3e67697d924de9440f7417bf4276ac2 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/StringConverterTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverter/StringConverterTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Property\TypeConverter\StringConverter;
 use TYPO3\CMS\Extbase\Property\TypeConverterInterface;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -34,17 +35,13 @@ final class StringConverterTest extends UnitTestCase
         $this->converter = new StringConverter();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromShouldReturnSourceString(): void
     {
         self::assertEquals('myString', $this->converter->convertFrom('myString', 'string'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSourceChildPropertiesToBeConvertedShouldReturnEmptyArray(): void
     {
         self::assertEquals([], $this->converter->getSourceChildPropertiesToBeConverted('myString'));
diff --git a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverterRegistryTest.php b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverterRegistryTest.php
index eb21922c8a12743e36f82a041b44104ae2920756..68f5f2902954aefa199c2a0162db87629cc3b862 100644
--- a/typo3/sysext/extbase/Tests/Unit/Property/TypeConverterRegistryTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Property/TypeConverterRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Property;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Authentication\LoginType;
 use TYPO3\CMS\Core\Type\TypeInterface;
 use TYPO3\CMS\Extbase\Domain\Model\FileReference;
@@ -45,9 +46,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         $this->subject->add(new BooleanConverter(), 10, ['boolean', 'integer'], 'boolean');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addThrowsDuplicateTypeConverterException(): void
     {
         $extendedBooleanConverter = new class () extends BooleanConverter {};
@@ -66,18 +65,14 @@ final class TypeConverterRegistryTest extends UnitTestCase
         $this->subject->add($extendedBooleanConverter, 10, ['boolean', 'integer'], 'boolean');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterFindsConverterForSimpleTypes(): void
     {
         $converter = $this->subject->findTypeConverter('boolean', 'boolean');
         self::assertInstanceOf(BooleanConverter::class, $converter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterFindsConverterForSimpleTargetTypesWithHighestPriority(): void
     {
         $extendedBooleanConverter = new class () extends BooleanConverter {};
@@ -88,9 +83,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         self::assertInstanceOf($extendedBooleanConverterClassName, $converter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterThrowsTypeConverterExceptionWhenConverterForSimpleTypeTargetCannotBeFound(): void
     {
         $this->expectException(TypeConverterException::class);
@@ -100,9 +93,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         $this->subject->findTypeConverter('array', 'boolean');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterThrowsInvalidTargetException(): void
     {
         $this->expectException(InvalidTargetException::class);
@@ -112,9 +103,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         $this->subject->findTypeConverter('integer', 'NonExistingClass');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterThrowsTypeConverterExceptionWhenThereIsNoConverterRegisteredForGivenSourceTypeAndObjectTargetType(): void
     {
         $this->expectException(TypeConverterException::class);
@@ -124,9 +113,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         $this->subject->findTypeConverter('array', \stdClass::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterFindsTypeConverterForClassOrInterfaceTargetTypes(): void
     {
         $this->subject->add(new FileReferenceConverter(), 10, ['integer'], FileReference::class);
@@ -135,9 +122,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         self::assertInstanceOf(FileReferenceConverter::class, $converter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterFindsTypeConverterForClassOrInterfaceParentClassOfTargetType(): void
     {
         $this->subject->add(new FileReferenceConverter(), 10, ['integer'], FileReference::class);
@@ -149,9 +134,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         self::assertInstanceOf(FileReferenceConverter::class, $converter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterFindsTypeConverterForClassInterfaceOfTargetType(): void
     {
         $this->subject->add(new CoreTypeConverter(), 10, ['integer'], TypeInterface::class);
@@ -160,9 +143,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         self::assertInstanceOf(CoreTypeConverter::class, $converter);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterFindsLeastSpecificTypeConverterForClassOrInterfaceWithoutSpecificTypeConverterSet(): void
     {
         /*
@@ -190,10 +171,9 @@ final class TypeConverterRegistryTest extends UnitTestCase
     }
 
     /**
-     * @test
-     *
      * @see testFindConverterThrowsTypeConverterExceptionWhenThereIsNoConverterRegisteredForGivenSourceTypeAndObjectTargetType
      */
+    #[Test]
     public function findConverterThrowsExceptionIfNoConverterCanBeFoundToConvertSourceToAnObject(): void
     {
         /*
@@ -212,9 +192,7 @@ final class TypeConverterRegistryTest extends UnitTestCase
         $this->subject->findTypeConverter('array', LoginType::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function findConverterThrowsDuplicateTypeConverterException(): void
     {
         /*
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodParameterTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodParameterTest.php
index 42a39daf61edb29372a44bd0db0f1f47ac53bf55..53ec0b01a2df96e3a8170db97823a0a6842fd1d9 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodParameterTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodParameterTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection\ClassSchema;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Reflection\ClassSchema;
 use TYPO3\CMS\Extbase\Reflection\ClassSchema\Exception\NoSuchMethodParameterException;
 use TYPO3\CMS\Extbase\Tests\Unit\Reflection\Fixture\DummyClassWithAllTypesOfMethods;
@@ -35,9 +36,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class MethodParameterTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsMandatoryParams(): void
     {
         self::assertFalse(
@@ -48,9 +47,7 @@ final class MethodParameterTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsDefaultValueParams(): void
     {
         self::assertSame(
@@ -62,9 +59,7 @@ final class MethodParameterTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsParamTypeFromTypeHint(): void
     {
         self::assertSame(
@@ -76,9 +71,7 @@ final class MethodParameterTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsIgnoreValidationAnnotation(): void
     {
         $classSchemaMethod = (new ClassSchema(DummyControllerWithIgnoreValidationDoctrineAnnotation::class))
@@ -89,9 +82,7 @@ final class MethodParameterTest extends UnitTestCase
         $this->expectException(NoSuchMethodParameterException::class);
         $classSchemaMethod->getParameter('baz')->ignoreValidation();
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsIgnoreValidationAttribute(): void
     {
         $classSchemaMethod = (new ClassSchema(DummyControllerWithIgnoreValidationDoctrineAttribute::class))
@@ -103,9 +94,7 @@ final class MethodParameterTest extends UnitTestCase
         $classSchemaMethod->getParameter('baz')->ignoreValidation();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsConstructorArgumentsWithDependencies(): void
     {
         $classSchema = new ClassSchema(DummyClassWithConstructorAndConstructorArgumentsWithDependencies::class);
@@ -115,9 +104,7 @@ final class MethodParameterTest extends UnitTestCase
         self::assertSame(DummyClassWithGettersAndSetters::class, $method->getParameter('foo')->getDependency());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsValidateAnnotationsOfControllerActions(): void
     {
         $this->resetSingletonInstances = true;
@@ -162,9 +149,7 @@ final class MethodParameterTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsValidateAttributesOfControllerActions(): void
     {
         $this->resetSingletonInstances = true;
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodTest.php
index c744a68e4f89de517a7c9d98cfbf1ebdf766e319..04565842f23cc02515a1d9e48b3c490688d8046b 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/MethodTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection\ClassSchema;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Reflection\ClassSchema;
 use TYPO3\CMS\Extbase\Tests\Unit\Reflection\Fixture\DummyClassWithAllTypesOfMethods;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class MethodTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsMethodVisibility(): void
     {
         $classSchema = new ClassSchema(DummyClassWithAllTypesOfMethods::class);
@@ -49,9 +48,7 @@ final class MethodTest extends UnitTestCase
         self::assertTrue($methodDefinition->isPrivate());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsInjectMethods(): void
     {
         $classSchema = new ClassSchema(DummyClassWithAllTypesOfMethods::class);
@@ -73,9 +70,7 @@ final class MethodTest extends UnitTestCase
         self::assertArrayHasKey('injectFoo', $injectMethods);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsStaticMethods(): void
     {
         self::assertTrue(
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithTypeDeclarationsTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithTypeDeclarationsTest.php
index c6d021c10279de11e8822d5752f956e2a99f5153..ab0f92b054ec65ccccf9e4304c054033fede9e54 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithTypeDeclarationsTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithTypeDeclarationsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection\ClassSchema\Property;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy;
 use TYPO3\CMS\Extbase\Persistence\Generic\LazyObjectStorage;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PropertyWithTypeDeclarationsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function intProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -38,9 +37,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('int', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function floatProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -50,9 +47,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('float', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function boolProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -62,9 +57,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('bool', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -74,9 +67,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('object', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -86,9 +77,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('array', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mixedProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -97,9 +86,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertCount(0, $propertyTypes);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullableIntProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -111,10 +98,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
     }
 
     // Collection Type Properties
-
-    /**
-     * @test
-     */
+    #[Test]
     public function listWithSquareBracketsSyntaxProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -130,9 +114,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('string', $propertyTypes[0]->getCollectionValueTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function listWithArraySyntaxWithoutKeyValueTypeProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -149,9 +131,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('string', $propertyTypes[0]->getCollectionValueTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function listWithArraySyntaxWithKeyValueTypeProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -168,9 +148,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('string', $propertyTypes[0]->getCollectionValueTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectStorageWithArraySyntaxWithoutKeyValueTypeProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -191,10 +169,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
     }
 
     // Union Type Properties (as of PHP 8.0)
-
-    /**
-     * @test
-     */
+    #[Test]
     public function intOrStringProperty(): void
     {
         $property = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -210,9 +185,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame('string', $property->getPrimaryType()?->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullableIntOrStringProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -225,9 +198,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertTrue($propertyTypes[1]->isNullable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function concreteEntityOrLazyLoadingProxyProperty(): void
     {
         $property = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -240,9 +211,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame(DummyEntityWithTypeDeclarations::class, $property->getPrimaryType()?->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectStorageProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -253,9 +222,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
         self::assertSame(DummyEntityWithTypeDeclarations::class, $propertyTypes[0]->getCollectionValueTypes()[0]->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function lazyObjectStorage(): void
     {
         $property = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
@@ -269,10 +236,7 @@ final class PropertyWithTypeDeclarationsTest extends UnitTestCase
     }
 
     // Intersection Type Properties (as of PHP 8.1)
-
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayAccessAndTraversableProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithTypeDeclarations::class))
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithoutTypeDeclarationsTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithoutTypeDeclarationsTest.php
index 4f92e9a19fa7a80c20e8b4b9e4a0e96bed15bbdf..83aeb22cbbd3dd21f42282f3bb42fe67e0bcfe20 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithoutTypeDeclarationsTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/Property/PropertyWithoutTypeDeclarationsTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection\ClassSchema\Property;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy;
 use TYPO3\CMS\Extbase\Persistence\Generic\LazyObjectStorage;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function nullableMixedProperty(): void
     {
         $property = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -38,9 +37,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertTrue($property->isNullable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function intProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -50,9 +47,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('int', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function floatProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -62,9 +57,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('float', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function boolProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -74,9 +67,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('bool', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -86,9 +77,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('object', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -98,9 +87,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('array', $propertyTypes[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mixedProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -109,9 +96,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame([], $propertyTypes);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullableIntProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -123,10 +108,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
     }
 
     // Collection Type Properties
-
-    /**
-     * @test
-     */
+    #[Test]
     public function listWithSquareBracketsSyntaxProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -143,9 +125,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('string', $propertyTypes[0]->getCollectionValueTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function listWithArraySyntaxWithoutKeyValueTypeProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -162,9 +142,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('string', $propertyTypes[0]->getCollectionValueTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function listWithArraySyntaxWithKeyValueTypeProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -181,9 +159,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame('string', $propertyTypes[0]->getCollectionValueTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectStorageWithArraySyntaxWithoutKeyValueTypeProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -203,10 +179,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
     }
 
     // Union Type Properties (as of PHP 8.0)
-
-    /**
-     * @test
-     */
+    #[Test]
     public function intOrStringProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -219,9 +192,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertFalse($propertyTypes[1]->isNullable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullableIntOrStringProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -234,9 +205,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertTrue($propertyTypes[1]->isNullable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function concreteEntityOrLazyLoadingProxyProperty(): void
     {
         $property = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -249,9 +218,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame(DummyEntityWithoutTypeDeclarations::class, $property->getPrimaryType()?->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function objectStorageProperty(): void
     {
         $propertyTypes = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -262,9 +229,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
         self::assertSame(DummyEntityWithoutTypeDeclarations::class, $propertyTypes[0]->getCollectionValueTypes()[0]->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function lazyObjectStorage(): void
     {
         $property = (new ClassSchema(DummyEntityWithoutTypeDeclarations::class))
@@ -278,10 +243,7 @@ final class PropertyWithoutTypeDeclarationsTest extends UnitTestCase
     }
 
     // Intersection Type Properties (as of PHP 8.1)
-
-    /**
-     * @test
-     */
+    #[Test]
     public function arrayAccessAndTraversableProperty(): void
     {
         self::markTestSkipped('Current version of phpdoc reflection cannot detect intersection types');
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/PropertyTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/PropertyTest.php
index af0b4424313e7cdb9153395274bc34a273caccda..685bb7593b31b0cbcfe9d02da2c6697a6159f36d 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/PropertyTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchema/PropertyTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection\ClassSchema;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
 use TYPO3\CMS\Extbase\Reflection\ClassSchema;
 use TYPO3\CMS\Extbase\Tests\Unit\Reflection\Fixture\DummyClassWithAllTypesOfProperties;
@@ -32,27 +33,21 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class PropertyTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsPropertiesWithLazyAnnotation(): void
     {
         $classSchema = new ClassSchema(DummyClassWithLazyDoctrineAnnotation::class);
         self::assertTrue($classSchema->getProperty('propertyWithLazyAnnotation')->isLazy());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsPropertiesWithLazyAttribute(): void
     {
         $classSchema = new ClassSchema(DummyClassWithLazyDoctrineAnnotation::class);
         self::assertTrue($classSchema->getProperty('propertyWithLazyAttribute')->isLazy());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsPropertyVisibility(): void
     {
         $classSchema = new ClassSchema(DummyClassWithAllTypesOfProperties::class);
@@ -73,9 +68,7 @@ final class PropertyTest extends UnitTestCase
         self::assertTrue($property->isPrivate());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsTransientProperty(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -84,9 +77,7 @@ final class PropertyTest extends UnitTestCase
         self::assertTrue($property->isTransient());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsTransientPropertyFromAttribute(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -95,9 +86,7 @@ final class PropertyTest extends UnitTestCase
         self::assertTrue($property->isTransient());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsCascadeProperty(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -106,9 +95,7 @@ final class PropertyTest extends UnitTestCase
         self::assertSame('remove', $property->getCascadeValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsCascadePropertyFromAttribute(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -117,9 +104,7 @@ final class PropertyTest extends UnitTestCase
         self::assertSame('remove', $property->getCascadeValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsCascadePropertyOnlyWithVarAnnotation(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -128,9 +113,7 @@ final class PropertyTest extends UnitTestCase
         self::assertNull($property->getCascadeValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsTypeAndElementType(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -152,9 +135,7 @@ final class PropertyTest extends UnitTestCase
         self::assertSame(DummyClassWithAllTypesOfProperties::class, $propertyType->getCollectionValueTypes()[0]->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsTypeAndElementTypeWithoutFQCN(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -166,9 +147,7 @@ final class PropertyTest extends UnitTestCase
         self::assertSame(DummyClassWithAllTypesOfProperties::class, $property->getTypes()[0]->getCollectionValueTypes()[0]->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsValidateAnnotationsModelProperties(): void
     {
         $this->resetSingletonInstances = true;
@@ -214,9 +193,7 @@ final class PropertyTest extends UnitTestCase
             $property->getValidators()
         );
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsValidateAttributeModelProperties(): void
     {
         $this->resetSingletonInstances = true;
@@ -263,9 +240,7 @@ final class PropertyTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsValidateAttributeOnPromotedModelProperties(): void
     {
         $this->resetSingletonInstances = true;
@@ -312,9 +287,7 @@ final class PropertyTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsTypeFromPropertyWithStringTypeHint(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -324,9 +297,7 @@ final class PropertyTest extends UnitTestCase
         self::assertSame('string', $property->getTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsTypeFromPropertyWithNullableStringTypeHint(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -336,9 +307,7 @@ final class PropertyTest extends UnitTestCase
         self::assertSame('string', $property->getTypes()[0]->getBuiltinType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isObjectStorageTypeDetectsObjectStorage(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -347,9 +316,7 @@ final class PropertyTest extends UnitTestCase
         self::assertTrue($property->isObjectStorageType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isObjectStorageTypeDetectsLazyObjectStorage(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -358,9 +325,7 @@ final class PropertyTest extends UnitTestCase
         self::assertTrue($property->isObjectStorageType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function filterLazyLoadingProxyAndLazyObjectStorageFiltersLazyLoadingProxy(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
@@ -372,9 +337,7 @@ final class PropertyTest extends UnitTestCase
         self::assertSame(DummyClassWithAllTypesOfProperties::class, $types[0]->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function filterLazyLoadingProxyAndLazyObjectStorageFiltersLazyObjectStorage(): void
     {
         $property = (new ClassSchema(DummyClassWithAllTypesOfProperties::class))
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchemaTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchemaTest.php
index d183730aa1bdd54a8c6a14d9660afd443d72fc5e..a3cd9a345c9732955dc0020b4c090e364be137c1 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchemaTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ClassSchemaTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject;
 use TYPO3\CMS\Extbase\Reflection\ClassSchema;
@@ -38,9 +39,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ClassSchemaTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaForModelIsSetAggregateRootIfRepositoryClassIsFoundForNamespacedClasses(): void
     {
         $this->resetSingletonInstances = true;
@@ -49,18 +48,14 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertTrue($classSchema->isAggregateRoot());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaHasConstructor(): void
     {
         $classSchema = new ClassSchema(DummyClassWithConstructorAndConstructorArguments::class);
         self::assertTrue($classSchema->hasConstructor());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaGetProperties(): void
     {
         self::assertSame(
@@ -96,9 +91,7 @@ final class ClassSchemaTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaHasMethod(): void
     {
         $classSchema = new ClassSchema(DummyClassWithAllTypesOfMethods::class);
@@ -106,9 +99,7 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertFalse($classSchema->hasMethod('nonExistentMethod'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaGetMethods(): void
     {
         self::assertSame(
@@ -132,9 +123,7 @@ final class ClassSchemaTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsPropertyDefaultValue(): void
     {
         $classSchema = new ClassSchema(DummyClassWithAllTypesOfProperties::class);
@@ -143,9 +132,7 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertSame('foo', $propertyDefinition->getDefaultValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaSkipsDetectionOfDefaultValuesOfStaticClassProperties(): void
     {
         $classSchema = new ClassSchema(DummyClassWithAllTypesOfProperties::class);
@@ -154,51 +141,39 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertNull($propertyDefinition->getDefaultValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsSingletons(): void
     {
         self::assertTrue((new ClassSchema(DummySingleton::class))->isSingleton());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsModels(): void
     {
         self::assertTrue((new ClassSchema(DummyEntity::class))->isModel());
         self::assertTrue((new ClassSchema(DummyValueObject::class))->isModel());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsEntities(): void
     {
         self::assertTrue((new ClassSchema(DummyEntity::class))->isEntity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsValueObjects(): void
     {
         self::assertTrue((new ClassSchema(DummyValueObject::class))->isValueObject());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsClassName(): void
     {
         $this->resetSingletonInstances = true;
         self::assertSame(DummyModel::class, (new ClassSchema(DummyModel::class))->getClassName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsNonStaticProperties(): void
     {
         self::assertTrue((new ClassSchema(DummyClassWithAllTypesOfProperties::class))->hasProperty('publicProperty'));
@@ -206,9 +181,7 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertTrue((new ClassSchema(DummyClassWithAllTypesOfProperties::class))->hasProperty('privateProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsStaticProperties(): void
     {
         self::assertTrue((new ClassSchema(DummyClassWithAllTypesOfProperties::class))->hasProperty('publicStaticProperty'));
@@ -216,9 +189,7 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertTrue((new ClassSchema(DummyClassWithAllTypesOfProperties::class))->hasProperty('privateStaticProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaGenerationThrowsExceptionWithValidateDoctrineAnnotationsForParamWithoutTypeHint(): void
     {
         $this->resetSingletonInstances = true;
@@ -229,9 +200,7 @@ final class ClassSchemaTest extends UnitTestCase
         new ClassSchema(DummyControllerWithValidateAnnotationWithoutParamTypeHint::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaGenerationThrowsExceptionWithValidateDoctrineAnnotationsForMissingParam(): void
     {
         $this->resetSingletonInstances = true;
@@ -241,9 +210,7 @@ final class ClassSchemaTest extends UnitTestCase
 
         new ClassSchema(DummyControllerWithValidateAnnotationWithoutParam::class);
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaGenerationThrowsExceptionWithValidateDoctrineAttributesForParamWithoutTypeHint(): void
     {
         $this->resetSingletonInstances = true;
@@ -254,9 +221,7 @@ final class ClassSchemaTest extends UnitTestCase
         new ClassSchema(DummyControllerWithValidateAttributeWithoutParamTypeHint::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaGenerationThrowsExceptionWithValidateDoctrineAttributesForMissingParam(): void
     {
         $this->resetSingletonInstances = true;
@@ -267,9 +232,7 @@ final class ClassSchemaTest extends UnitTestCase
         new ClassSchema(DummyControllerWithValidateAttributeWithoutParam::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsMethodParameterTypeViaReflection(): void
     {
         $class = new class () {
@@ -283,9 +246,7 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertSame(ClassSchema::class, $classSchema->getMethod('bar')->getParameter('foo')->getType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaPrefersMethodParameterTypeDetectionViaReflection(): void
     {
         $class = new class () {
@@ -299,9 +260,7 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertSame('string', $classSchema->getMethod('foo')->getParameter('foo')->getType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaCanHandleSelfMethodReturnTypes(): void
     {
         $class = new class () {
@@ -319,9 +278,7 @@ final class ClassSchemaTest extends UnitTestCase
         self::assertSame(get_class($class), $classSchema->getMethod('bar')->getParameter('copy')->getType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function classSchemaDetectsMethodParameterTypeDetectionViaDocBlocksIfNoTypeHintIsGiven(): void
     {
         $classSchema = new ClassSchema(DummyClassWithAllTypesOfMethods::class);
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ObjectAccessTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ObjectAccessTest.php
index 0af67903fee3223b3fe1a9a7e469e843e324f066..ffc4cfd33ac0b871c5b9c81b875b9dc69bc87f0e 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ObjectAccessTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ObjectAccessTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
@@ -41,27 +43,21 @@ final class ObjectAccessTest extends UnitTestCase
         $this->dummyObject->setAnotherProperty(42);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyReturnsExpectedValueForGetterProperty(): void
     {
         $property = ObjectAccess::getProperty($this->dummyObject, 'property');
         self::assertEquals('string1', $property);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyReturnsExpectedValueForPublicProperty(): void
     {
         $property = ObjectAccess::getProperty($this->dummyObject, 'publicProperty2');
         self::assertEquals(42, $property, 'A property of a given object was not returned correctly.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyThrowsExceptionIfPropertyDoesNotExist(): void
     {
         $this->expectException(PropertyNotAccessibleException::class);
@@ -69,53 +65,41 @@ final class ObjectAccessTest extends UnitTestCase
         ObjectAccess::getProperty($this->dummyObject, 'notExistingProperty');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyReturnsNullIfArrayKeyDoesNotExist(): void
     {
         $result = ObjectAccess::getProperty([], 'notExistingProperty');
         self::assertNull($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyTriesToCallABooleanGetterMethodIfItExists(): void
     {
         $property = ObjectAccess::getProperty($this->dummyObject, 'booleanProperty');
         self::assertTrue($property);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyReturnsFalseIfPropertyIsNotAccessible(): void
     {
         self::assertFalse(ObjectAccess::setProperty($this->dummyObject, 'protectedProperty', 42));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyCallsASetterMethodToSetThePropertyValueIfOneIsAvailable(): void
     {
         ObjectAccess::setProperty($this->dummyObject, 'property', 4242);
         self::assertEquals(4242, $this->dummyObject->getProperty(), 'setProperty does not work with setter.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyWorksWithPublicProperty(): void
     {
         ObjectAccess::setProperty($this->dummyObject, 'publicProperty', 4242);
         self::assertEquals(4242, $this->dummyObject->publicProperty, 'setProperty does not work with public property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyCanDirectlySetValuesInAnArrayObjectOrArray(): void
     {
         $arrayObject = new \ArrayObject();
@@ -126,9 +110,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('value', $array['key']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCanAccessPropertiesOfAnArrayObject(): void
     {
         $arrayObject = new \ArrayObject(['key' => 'value']);
@@ -136,9 +118,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('value', $actual, 'getProperty does not work with ArrayObject property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCanAccessPropertiesOfAnObjectStorageObject(): void
     {
         $objectStorage = new ObjectStorage();
@@ -148,9 +128,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertSame($object, $actual, 'getProperty does not work with ObjectStorage property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCanAccessPropertiesOfAnObjectImplementingArrayAccess(): void
     {
         $arrayAccessInstance = new ArrayAccessClass(['key' => 'value']);
@@ -158,9 +136,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('value', $actual, 'getProperty does not work with Array Access property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCanAccessPropertiesOfArrayAccessWithGetterMethodWhenOffsetNotExists(): void
     {
         $arrayAccessInstance = new ArrayAccessClass([]);
@@ -168,9 +144,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('default-value', $actual, 'getProperty does not work with Array Access property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCanAccessPropertiesOfArrayAccessWithPriorityForOffsetIfOffsetExists(): void
     {
         $arrayAccessInstance = new ArrayAccessClass(['virtual' => 'overridden-value']);
@@ -178,9 +152,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('overridden-value', $actual, 'getProperty does not work with Array Access property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCanAccessPropertiesOfAnArray(): void
     {
         $array = ['key' => 'value'];
@@ -188,9 +160,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('value', $expected, 'getProperty does not work with Array property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathCanAccessPropertiesOfAnArray(): void
     {
         $array = ['parent' => ['key' => 'value']];
@@ -198,9 +168,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('value', $actual, 'getPropertyPath does not work with Array property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathCanAccessPropertiesOfAnObjectImplementingArrayAccess(): void
     {
         $array = ['parent' => new \ArrayObject(['key' => 'value'])];
@@ -208,9 +176,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals('value', $actual, 'getPropertyPath does not work with Array Access property.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathCanAccessPropertiesOfAnExtbaseObjectStorageObject(): void
     {
         $objectStorage = $this->setUpObjectStorageWithTwoItems();
@@ -221,9 +187,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertSame('value2', ObjectAccess::getPropertyPath($array, 'parent.1.key'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathOnObjectStorageDoesNotAffectOngoingLoop(): void
     {
         $objectStorage = $this->setUpObjectStorageWithTwoItems();
@@ -247,9 +211,7 @@ final class ObjectAccessTest extends UnitTestCase
         return $objectStorage;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathCanAccessPropertiesOfAnSplObjectStorageObject(): void
     {
         $objectStorage = $this->setUpSplObjectStorageWithTwoItems();
@@ -260,9 +222,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertSame('value2', ObjectAccess::getPropertyPath($array, 'parent.1.key'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathOnSplObjectStorageDoesNotAffectOngoingLoop(): void
     {
         $objectStorage = $this->setUpSplObjectStorageWithTwoItems();
@@ -286,9 +246,7 @@ final class ObjectAccessTest extends UnitTestCase
         return $objectStorage;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getGettablePropertyNamesReturnsAllPropertiesWhichAreAvailable(): void
     {
         GeneralUtility::setSingletonInstance(ReflectionService::class, new ReflectionService(new NullFrontend('extbase'), 'ClassSchemata'));
@@ -297,9 +255,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals($gettablePropertyNames, $expectedPropertyNames, 'getGettablePropertyNames returns not all gettable properties.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getGettablePropertyNamesRespectsMethodArguments(): void
     {
         $dateTimeZone = new \DateTimeZone('+2');
@@ -311,9 +267,7 @@ final class ObjectAccessTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSettablePropertyNamesReturnsAllPropertiesWhichAreAvailable(): void
     {
         GeneralUtility::setSingletonInstance(ReflectionService::class, new ReflectionService(new NullFrontend('extbase'), 'ClassSchemata'));
@@ -322,9 +276,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals($settablePropertyNames, $expectedPropertyNames, 'getSettablePropertyNames returns not all settable properties.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSettablePropertyNamesReturnsPropertyNamesOfStdClass(): void
     {
         $stdClassObject = new \stdClass();
@@ -335,9 +287,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals($expectedPropertyNames, $settablePropertyNames, 'getSettablePropertyNames returns not all settable properties.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getGettablePropertiesReturnsTheCorrectValuesForAllProperties(): void
     {
         GeneralUtility::setSingletonInstance(ReflectionService::class, new ReflectionService(new NullFrontend('extbase'), 'ClassSchemata'));
@@ -355,9 +305,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals($allProperties, $expectedProperties, 'expectedProperties did not return the right values for the properties.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getGettablePropertiesReturnsPropertiesOfStdClass(): void
     {
         $stdClassObject = new \stdClass();
@@ -373,9 +321,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals($expectedProperties, $allProperties, 'expectedProperties did not return the right values for the properties.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPropertySettableTellsIfAPropertyCanBeSet(): void
     {
         self::assertTrue(ObjectAccess::isPropertySettable($this->dummyObject, 'writeOnlyMagicProperty'));
@@ -384,9 +330,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertFalse(ObjectAccess::isPropertySettable($this->dummyObject, 'privateProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPropertySettableWorksOnStdClass(): void
     {
         $stdClassObject = new \stdClass();
@@ -396,12 +340,11 @@ final class ObjectAccessTest extends UnitTestCase
     }
 
     /**
-     * @dataProvider propertyGettableTestValues
-     * @test
-     *
      * @param string $property
      * @param bool $expected
      */
+    #[DataProvider('propertyGettableTestValues')]
+    #[Test]
     public function isPropertyGettableTellsIfAPropertyCanBeRetrieved($property, $expected): void
     {
         self::assertEquals($expected, ObjectAccess::isPropertyGettable($this->dummyObject, $property));
@@ -419,9 +362,7 @@ final class ObjectAccessTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPropertyGettableWorksOnArrayAccessObjects(): void
     {
         $arrayObject = new \ArrayObject();
@@ -430,9 +371,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertFalse(ObjectAccess::isPropertyGettable($arrayObject, 'undefinedKey'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPropertyGettableWorksOnObjectsMixingRegularPropertiesAndArrayAccess(): void
     {
         /** @var \ArrayAccess $object */
@@ -453,9 +392,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertSame('v', ObjectAccess::getProperty($object, 'key'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPropertyGettableWorksOnStdClass(): void
     {
         $stdClassObject = new \stdClass();
@@ -464,9 +401,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertFalse(ObjectAccess::isPropertyGettable($stdClassObject, 'undefinedProperty'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathCanRecursivelyGetPropertiesOfAnObject(): void
     {
         $alternativeObject = new DummyClassWithGettersAndSetters();
@@ -477,9 +412,7 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertEquals($expected, $actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathReturnsNullForNonExistingPropertyPath(): void
     {
         $alternativeObject = new DummyClassWithGettersAndSetters();
@@ -488,18 +421,14 @@ final class ObjectAccessTest extends UnitTestCase
         self::assertNull(ObjectAccess::getPropertyPath($this->dummyObject, 'property2.property.not.existing'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathReturnsNullIfSubjectIsNoObject(): void
     {
         $string = 'Hello world';
         self::assertNull(ObjectAccess::getPropertyPath($string, 'property2'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyPathReturnsNullIfSubjectOnPathIsNoObject(): void
     {
         $object = new \stdClass();
diff --git a/typo3/sysext/extbase/Tests/Unit/Reflection/ReflectionServiceTest.php b/typo3/sysext/extbase/Tests/Unit/Reflection/ReflectionServiceTest.php
index 4d04bb3253cec7422a60eaffa8f0486f02401d87..a30e38b7b3091fd21699b864734b8b561290464a 100644
--- a/typo3/sysext/extbase/Tests/Unit/Reflection/ReflectionServiceTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Reflection/ReflectionServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Reflection;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Extbase\Reflection\ClassSchema;
 use TYPO3\CMS\Extbase\Reflection\Exception\UnknownClassException;
@@ -31,9 +32,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ReflectionServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getClassSchemaThrowsExceptionIfClassIsNotFound(): void
     {
         $this->expectException(UnknownClassException::class);
@@ -43,9 +42,7 @@ final class ReflectionServiceTest extends UnitTestCase
         $reflectionService->getClassSchema('Foo\Bar\Not\Existing');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getClassSchemaThrowsExceptionIfTypeHintedClassWasNotFound(): void
     {
         $this->expectException(UnknownClassException::class);
@@ -55,9 +52,7 @@ final class ReflectionServiceTest extends UnitTestCase
         $reflectionService->getClassSchema(DummyClassWithInvalidTypeHint::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function reflectionServiceCanBeSerializedAndUnserialized(): void
     {
         $class = new class () {};
@@ -72,9 +67,7 @@ final class ReflectionServiceTest extends UnitTestCase
         self::assertInstanceOf(ClassSchema::class, $reflectionService->getClassSchema($class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function reflectionServiceCanBeSerializedAndUnserializedWithCacheManager(): void
     {
         $class = new class () {};
diff --git a/typo3/sysext/extbase/Tests/Unit/Routing/Aspect/StaticRangeMapperTest.php b/typo3/sysext/extbase/Tests/Unit/Routing/Aspect/StaticRangeMapperTest.php
index 48ded58d030d24e71c3877fd4c356e213ecae4ce..d614c1501fd7cd76404d83dc4a904ed1deca0274 100644
--- a/typo3/sysext/extbase/Tests/Unit/Routing/Aspect/StaticRangeMapperTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Routing/Aspect/StaticRangeMapperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Routing\Aspect;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
 use TYPO3\CMS\Core\Routing\Aspect\StaticRangeMapper;
 
@@ -177,10 +179,8 @@ final class StaticRangeMapperTest extends TestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider valueSettingsDataProvider
-     */
+    #[DataProvider('valueSettingsDataProvider')]
+    #[Test]
     public function resolveDeterminesValues(string $start, string $end, array $expectations): void
     {
         $subject = new StaticRangeMapper([
diff --git a/typo3/sysext/extbase/Tests/Unit/Security/Cryptography/HashServiceTest.php b/typo3/sysext/extbase/Tests/Unit/Security/Cryptography/HashServiceTest.php
index e98bae5c0312257cb605048944bb57f2bf397d78..6a46a43890cdba77096c23b0b7e339ce83709969 100644
--- a/typo3/sysext/extbase/Tests/Unit/Security/Cryptography/HashServiceTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Security/Cryptography/HashServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Security\Cryptography;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Security\Cryptography\HashService;
 use TYPO3\CMS\Extbase\Security\Exception\InvalidArgumentForHashGenerationException;
 use TYPO3\CMS\Extbase\Security\Exception\InvalidHashException;
@@ -33,27 +34,21 @@ final class HashServiceTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'Testing';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateHmacReturnsHashStringIfStringIsGiven(): void
     {
         $hash = $this->hashService->generateHmac('asdf');
         self::assertIsString($hash);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateHmacReturnsHashStringWhichContainsSomeSalt(): void
     {
         $hash = $this->hashService->generateHmac('asdf');
         self::assertNotEquals(sha1('asdf'), $hash);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateHmacReturnsDifferentHashStringsForDifferentInputStrings(): void
     {
         $hash1 = $this->hashService->generateHmac('asdf');
@@ -61,9 +56,7 @@ final class HashServiceTest extends UnitTestCase
         self::assertNotEquals($hash1, $hash2);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generatedHmacCanBeValidatedAgain(): void
     {
         $string = 'asdf';
@@ -71,9 +64,7 @@ final class HashServiceTest extends UnitTestCase
         self::assertTrue($this->hashService->validateHmac($string, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generatedHmacWillNotBeValidatedIfHashHasBeenChanged(): void
     {
         $string = 'asdf';
@@ -81,9 +72,7 @@ final class HashServiceTest extends UnitTestCase
         self::assertFalse($this->hashService->validateHmac($string, $hash));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function appendHmacAppendsHmacToGivenString(): void
     {
         $string = 'This is some arbitrary string ';
@@ -91,9 +80,7 @@ final class HashServiceTest extends UnitTestCase
         self::assertSame($string, substr($hashedString, 0, -40));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndStripHmacThrowsExceptionIfGivenStringIsTooShort(): void
     {
         $this->expectException(InvalidArgumentForHashGenerationException::class);
@@ -101,9 +88,7 @@ final class HashServiceTest extends UnitTestCase
         $this->hashService->validateAndStripHmac('string with less than 40 characters');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndStripHmacThrowsExceptionIfGivenStringHasNoHashAppended(): void
     {
         $this->expectException(InvalidHashException::class);
@@ -111,9 +96,7 @@ final class HashServiceTest extends UnitTestCase
         $this->hashService->validateAndStripHmac('string with exactly a length 40 of chars');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndStripHmacThrowsExceptionIfTheAppendedHashIsInvalid(): void
     {
         $this->expectException(InvalidHashException::class);
@@ -121,9 +104,7 @@ final class HashServiceTest extends UnitTestCase
         $this->hashService->validateAndStripHmac('some Stringac43682075d36592d4cb320e69ff0aa515886eab');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAndStripHmacReturnsTheStringWithoutHmac(): void
     {
         $string = ' Some arbitrary string with special characters: öäüß!"§$ ';
diff --git a/typo3/sysext/extbase/Tests/Unit/Service/CacheServiceTest.php b/typo3/sysext/extbase/Tests/Unit/Service/CacheServiceTest.php
index 5d9e8e3c9cf53cbd26b037574069447a629cd96b..c28cb88fc4a271891f09cdea901f5b3a383d39f0 100644
--- a/typo3/sysext/extbase/Tests/Unit/Service/CacheServiceTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Service/CacheServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
@@ -37,45 +38,35 @@ final class CacheServiceTest extends UnitTestCase
         $this->cacheService = new CacheService($configurationManager, $this->cacheManagerMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearPageCacheConvertsPageIdsToArray(): void
     {
         $this->cacheManagerMock->expects(self::once())->method('flushCachesInGroupByTags')->with('pages', ['pageId_123']);
         $this->cacheService->clearPageCache(123);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearPageCacheConvertsPageIdsToNumericArray(): void
     {
         $this->cacheManagerMock->expects(self::once())->method('flushCachesInGroupByTags')->with('pages', ['pageId_0']);
         $this->cacheService->clearPageCache('Foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearPageCacheDoesNotConvertPageIdsIfNoneAreSpecified(): void
     {
         $this->cacheManagerMock->expects(self::once())->method('flushCachesInGroup')->with('pages');
         $this->cacheService->clearPageCache();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearPageCacheUsesCacheManagerToFlushCacheOfSpecifiedPages(): void
     {
         $this->cacheManagerMock->expects(self::once())->method('flushCachesInGroupByTags')->with('pages', ['pageId_1', 'pageId_2', 'pageId_3']);
         $this->cacheService->clearPageCache([1, 2, 3]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearsCachesOfRegisteredPageIds(): void
     {
         $this->cacheManagerMock->expects(self::once())->method('flushCachesInGroupByTags')->with('pages', ['pageId_2', 'pageId_15', 'pageId_8']);
@@ -87,9 +78,7 @@ final class CacheServiceTest extends UnitTestCase
         $this->cacheService->clearCachesOfRegisteredPageIds();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearsCachesOfDuplicateRegisteredPageIdsOnlyOnce(): void
     {
         $this->cacheManagerMock->expects(self::once())->method('flushCachesInGroupByTags')->with('pages', ['pageId_2', 'pageId_15', 'pageId_8']);
diff --git a/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php b/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php
index a9e3ee12d5ea173acc2ef63a7296e84182fa68ca..ae71fb65f8e22a7298742ecf4d223d329fe2cf77 100644
--- a/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Service/ExtensionServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Database\ConnectionPool;
@@ -127,12 +129,12 @@ final class ExtensionServiceTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getPluginNamespaceDataProvider
      * @param string $extensionName
      * @param string $pluginName
      * @param mixed $expectedResult
      */
+    #[DataProvider('getPluginNamespaceDataProvider')]
+    #[Test]
     public function getPluginNamespaceTests($extensionName, $pluginName, $expectedResult): void
     {
         $this->mockConfigurationManager->expects(self::once())->method('getConfiguration')->willReturn([]);
@@ -140,9 +142,7 @@ final class ExtensionServiceTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult, 'Failing for extension: "' . $extensionName . '", plugin: "' . $pluginName . '"');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function pluginNamespaceCanBeOverridden(): void
     {
         $this->mockConfigurationManager->expects(self::once())->method('getConfiguration')->with(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK, 'SomeExtension', 'SomePlugin')->willReturn(['view' => ['pluginNamespace' => 'overridden_plugin_namespace']]);
@@ -167,10 +167,10 @@ final class ExtensionServiceTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getPluginNameByActionDataProvider
      * @param mixed $expectedResult
      */
+    #[DataProvider('getPluginNameByActionDataProvider')]
+    #[Test]
     public function getPluginNameByActionTests(string $extensionName, string $controllerName, string $actionName, $expectedResult): void
     {
         $this->mockConfigurationManager->expects(self::once())->method('getConfiguration')->with(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK)->willReturn(['view' => ['pluginNamespace' => 'overridden_plugin_namespace']]);
@@ -178,9 +178,7 @@ final class ExtensionServiceTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult, 'Failing for $extensionName: "' . $extensionName . '", $controllerName: "' . $controllerName . '", $actionName: "' . $actionName . '" - ');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPluginNameByActionThrowsExceptionIfMoreThanOnePluginMatches(): void
     {
         $this->expectException(Exception::class);
@@ -189,9 +187,7 @@ final class ExtensionServiceTest extends UnitTestCase
         $this->extensionService->getPluginNameByAction('ExtensionName', 'ControllerName', 'otherAction');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPluginNameByActionReturnsCurrentIfItCanHandleTheActionEvenIfMoreThanOnePluginMatches(): void
     {
         $frameworkConfiguration = [
@@ -216,27 +212,21 @@ final class ExtensionServiceTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPidByPluginSignatureReturnsNullIfConfigurationManagerIsNotInitialized(): void
     {
         $this->mockConfigurationManager->expects(self::once())->method('getConfiguration')->willReturn([]);
         self::assertNull($this->extensionService->getTargetPidByPlugin('ExtensionName', 'PluginName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPidByPluginSignatureReturnsNullIfDefaultPidIsZero(): void
     {
         $this->mockConfigurationManager->expects(self::once())->method('getConfiguration')->willReturn(['view' => ['defaultPid' => 0]]);
         self::assertNull($this->extensionService->getTargetPidByPlugin('ExtensionName', 'PluginName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPidByPluginSignatureReturnsTheConfiguredDefaultPid(): void
     {
         $this->mockConfigurationManager->expects(self::once())->method('getConfiguration')->willReturn(['view' => ['defaultPid' => 123]]);
@@ -245,25 +235,19 @@ final class ExtensionServiceTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultControllerNameByPluginReturnsNullIfGivenExtensionCantBeFound(): void
     {
         self::assertNull($this->extensionService->getDefaultControllerNameByPlugin('NonExistingExtensionName', 'SomePlugin'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultControllerNameByPluginReturnsNullIfGivenPluginCantBeFound(): void
     {
         self::assertNull($this->extensionService->getDefaultControllerNameByPlugin('ExtensionName', 'NonExistingPlugin'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultControllerNameByPluginReturnsFirstControllerNameOfGivenPlugin(): void
     {
         $expectedResult = 'ControllerName';
@@ -271,33 +255,25 @@ final class ExtensionServiceTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultActionNameByPluginAndControllerReturnsNullIfGivenExtensionCantBeFound(): void
     {
         self::assertNull($this->extensionService->getDefaultActionNameByPluginAndController('NonExistingExtensionName', 'SomePlugin', 'ControllerName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultActionNameByPluginAndControllerReturnsNullIfGivenPluginCantBeFound(): void
     {
         self::assertNull($this->extensionService->getDefaultActionNameByPluginAndController('ExtensionName', 'NonExistingPlugin', 'ControllerName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultActionNameByPluginAndControllerReturnsNullIfGivenControllerCantBeFound(): void
     {
         self::assertNull($this->extensionService->getDefaultActionNameByPluginAndController('ExtensionName', 'SomePlugin', 'NonExistingControllerName'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDefaultActionNameByPluginAndControllerReturnsFirstActionNameOfGivenController(): void
     {
         $expectedResult = 'someAction';
@@ -305,9 +281,7 @@ final class ExtensionServiceTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPageTypeByFormatReturnsZeroIfNoMappingIsSet(): void
     {
         $configurationManagerMock = $this->createMock(ConfigurationManager::class);
@@ -322,9 +296,7 @@ final class ExtensionServiceTest extends UnitTestCase
         self::assertSame(0, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPageTypeByFormatReturnsMappedPageTypeFromConfiguration(): void
     {
         $configurationManagerMock = $this->createMock(ConfigurationManager::class);
diff --git a/typo3/sysext/extbase/Tests/Unit/Service/ImageScriptServiceTest.php b/typo3/sysext/extbase/Tests/Unit/Service/ImageScriptServiceTest.php
index 9ce7a49080066a49d60c723da019a45763282643..cfbc9129dc49cb7f8fdca154d4f20a2a37788214 100644
--- a/typo3/sysext/extbase/Tests/Unit/Service/ImageScriptServiceTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Service/ImageScriptServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Resource\File;
@@ -43,9 +45,7 @@ final class ImageScriptServiceTest extends UnitTestCase
         $_SERVER['HTTP_HOST'] = 'foo.bar';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fileIsUnwrappedFromReferenceForProcessing(): void
     {
         $reference = $this->getMockBuilder(FileReference::class)->disableOriginalConstructor()->getMock();
@@ -68,10 +68,8 @@ final class ImageScriptServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider prefixIsCorrectlyAppliedToGetImageUriDataProvider
-     */
+    #[DataProvider('prefixIsCorrectlyAppliedToGetImageUriDataProvider')]
+    #[Test]
     public function prefixIsCorrectlyAppliedToGetImageUri($imageUri, $expected): void
     {
         $GLOBALS['TYPO3_REQUEST'] = (new ServerRequest())
@@ -94,10 +92,8 @@ final class ImageScriptServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider prefixIsCorrectlyAppliedToGetImageUriWithAbsolutePathDataProvider
-     */
+    #[DataProvider('prefixIsCorrectlyAppliedToGetImageUriWithAbsolutePathDataProvider')]
+    #[Test]
     public function prefixIsCorrectlyAppliedToGetImageUriWithForcedAbsoluteUrl($imageUri, $expected): void
     {
         $GLOBALS['TYPO3_REQUEST'] = (new ServerRequest())
diff --git a/typo3/sysext/extbase/Tests/Unit/Utility/DebuggerUtilityTest.php b/typo3/sysext/extbase/Tests/Unit/Utility/DebuggerUtilityTest.php
index a5300f0ee11052487fc1238969876f6e931b12d2..5b47a4b94c9ab67f3f52c3384c78d4e4310c0057 100644
--- a/typo3/sysext/extbase/Tests/Unit/Utility/DebuggerUtilityTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Utility/DebuggerUtilityTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
 use TYPO3\CMS\Extbase\Tests\Unit\Utility\Fixtures\DebuggerUtilityAccessibleProxy;
 use TYPO3\CMS\Extbase\Tests\Unit\Utility\Fixtures\DummyClass;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DebuggerUtilityTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function debuggerRewindsInstancesOfIterator(): void
     {
         $objectStorage = $this->getMockBuilder(ObjectStorage::class)
@@ -42,9 +41,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertTrue($objectStorage->valid());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function debuggerDoesNotRewindInstancesOfGenerator(): void
     {
         $generator = (static function () {
@@ -56,9 +53,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('Generator', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsPropertiesOfStdClassObjects(): void
     {
         $testObject = new \stdClass();
@@ -67,18 +62,14 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertMatchesRegularExpression('/foo.*bar/', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpHandlesVariadicArguments(): void
     {
         $result = DebuggerUtility::var_dump(static function (...$args) {}, null, 8, true, false, true);
         self::assertStringContainsString('function (...$args)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpRespectsBlacklistedProperties(): void
     {
         $testClass = new \stdClass();
@@ -89,9 +80,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringNotContainsString($testClass->secretData, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpRespectsBlacklistedClasses(): void
     {
         $testClass = new \stdClass();
@@ -101,9 +90,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringNotContainsString($testClass->data, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfDateTime(): void
     {
         $date = \DateTime::createFromFormat('Y-m-d H:i:s', '2018-11-26 09:27:28', new \DateTimeZone('UTC'));
@@ -112,9 +99,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('2018-11-26T09:27:28', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfDateTimeImmutable(): void
     {
         $date = \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', '2018-11-26 09:27:28', new \DateTimeZone('UTC'));
@@ -123,9 +108,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('2018-11-26T09:27:28', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfClosureWithArrayParameterType(): void
     {
         $closure = (static function (array $array) {});
@@ -134,9 +117,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('function (array $array)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfClosureWithNullableArrayParameterTypeShowingOnlyArray(): void
     {
         $closure = (static function (?array $array) {});
@@ -145,9 +126,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('function (array $array)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfClosureWithDummyClassParameterType(): void
     {
         $closure = (static function (DummyClass $class) {});
@@ -156,9 +135,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('function (TYPO3\CMS\Extbase\Tests\Unit\Utility\Fixtures\DummyClass $class)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfClosureWithIntClassParameterType(): void
     {
         $closure = (static function (int $int) {});
@@ -167,9 +144,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('function ($int)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfClosureWithStringClassParameterType(): void
     {
         $closure = (static function (string $string) {});
@@ -178,9 +153,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('function ($string)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsDumpOfClosureWithoutClassParameterType(): void
     {
         $closure = (static function ($typeless) {});
@@ -189,9 +162,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('function ($typeless)', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpShowsUninitializedVariable(): void
     {
         $class = new class () {
@@ -202,9 +173,7 @@ final class DebuggerUtilityTest extends UnitTestCase
         self::assertStringContainsString('test => protected uninitialized', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function varDumpUsesNonceValue(): void
     {
         DebuggerUtilityAccessibleProxy::setStylesheetEchoed(false);
diff --git a/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php b/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php
index 0eda20b5b74f56aa472002bb813afa548473c57e..94a895fee66b43054d51faf4d1ab2df9dfa26ab3 100644
--- a/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Utility/ExtensionUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Tests\Unit\Utility\Fixtures\ExtensionUtilityAccessibleProxy;
 use TYPO3\CMS\Extbase\Tests\Unit\Utility\Fixtures\MyExtension\Controller\FirstController;
 use TYPO3\CMS\Extbase\Tests\Unit\Utility\Fixtures\MyExtension\Controller\SecondController;
@@ -26,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ExtensionUtilityTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginWorksForMinimalisticSetup(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -41,9 +41,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         self::assertStringNotContainsString('USER_INT', $staticTypoScript);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginCreatesCorrectDefaultTypoScriptSetup(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -52,9 +50,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         self::assertStringContainsString('tt_content.list.20.myextension_pi1 = EXTBASEPLUGIN', $staticTypoScript);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginWorksForASingleControllerAction(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -79,9 +75,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['MyExtension']['plugins']['Pi1']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginThrowsExceptionIfExtensionNameIsEmpty(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -91,9 +85,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         ]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginThrowsExceptionIfPluginNameIsEmpty(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -103,9 +95,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         ]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginRespectsDefaultActionAsANonCacheableAction(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -133,9 +123,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['MyExtension']['plugins']['Pi1']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginRespectsNonDefaultActionAsANonCacheableAction(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -163,9 +151,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['MyExtension']['plugins']['Pi1']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginWorksForMultipleControllerActionsWithCacheableActionAsDefault(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -202,9 +188,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['MyExtension']['plugins']['Pi1']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginWorksForMultipleControllerActionsAsArrayWithCacheableActionAsDefault(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -241,9 +225,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         self::assertEquals($expectedResult, $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['MyExtension']['plugins']['Pi1']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function configurePluginWorksForMultipleControllerActionsWithNonCacheableActionAsDefault(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.'] = [];
@@ -285,9 +267,8 @@ final class ExtensionUtilityTest extends UnitTestCase
     /**
      * Tests method combination of registerPlugin() and its dependency addPlugin() to
      * verify plugin icon path resolving works.
-     *
-     * @test
      */
+    #[Test]
     public function registerPluginTriggersAddPluginWhichSetsPluginIconPathIfUsingUnderscoredExtensionNameAndIconPathNotGiven(): void
     {
         $GLOBALS['TCA']['tt_content']['columns']['list_type']['config']['items'] = [];
@@ -306,9 +287,7 @@ final class ExtensionUtilityTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registerPluginMethodReturnsPluginSignature(): void
     {
         $GLOBALS['TCA']['tt_content']['columns']['list_type']['config']['items'] = [];
@@ -323,9 +302,8 @@ final class ExtensionUtilityTest extends UnitTestCase
     /**
      * Tests method combination of registerPlugin() and its dependency addPlugin() to
      * verify plugin icon path resolving works.
-     *
-     * @test
      */
+    #[Test]
     public function registerPluginTriggersAddPluginWhichSetsPluginIconPathIfUsingUpperCameCasedExtensionNameAndIconPathNotGiven(): void
     {
         $GLOBALS['TCA']['tt_content']['columns']['list_type']['config']['items'] = [];
@@ -347,9 +325,8 @@ final class ExtensionUtilityTest extends UnitTestCase
     /**
      * Tests method combination of registerPlugin() and its dependency addPlugin() to
      * verify plugin icon path resolving works.
-     *
-     * @test
      */
+    #[Test]
     public function registerPluginTriggersAddPluginWhichSetsPluginIconPathIfIconPathIsGiven(): void
     {
         $GLOBALS['TCA']['tt_content']['columns']['list_type']['config']['items'] = [];
@@ -403,10 +380,8 @@ final class ExtensionUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider checkResolveControllerAliasFromControllerClassNameDataProvider
-     */
+    #[DataProvider('checkResolveControllerAliasFromControllerClassNameDataProvider')]
+    #[Test]
     public function checkResolveControllerAliasFromControllerClassName(string $expectedControllerAlias, string $controllerClassName): void
     {
         self::assertEquals(
diff --git a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractCompositeValidatorTest.php b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractCompositeValidatorTest.php
index 8855417815099505930ee2ca2dd602b0cbd46960..63ab750467cc75014b706c714e41335383ff68b5 100644
--- a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractCompositeValidatorTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractCompositeValidatorTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\Fixture\AbstractCompositeValidatorClass;
 use TYPO3\CMS\Extbase\Validation\Exception\InvalidValidationOptionsException;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractCompositeValidatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorAcceptsSupportedOptions(): void
     {
         $inputOptions = [
@@ -38,9 +37,7 @@ final class AbstractCompositeValidatorTest extends UnitTestCase
         self::assertSame($expectedOptions, $validator->getOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorHasDefaultOptions(): void
     {
         $inputOptions = ['requiredOption' => 666];
@@ -53,9 +50,7 @@ final class AbstractCompositeValidatorTest extends UnitTestCase
         self::assertSame($expectedOptions, $validator->getOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorThrowsExceptionOnNotSupportedOptions(): void
     {
         $inputOptions = ['invalidoption' => 42];
@@ -65,9 +60,7 @@ final class AbstractCompositeValidatorTest extends UnitTestCase
         $validator->setOptions($inputOptions);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorThrowsExceptionOnMissingRequiredOptions(): void
     {
         $inputOptions = [];
diff --git a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractValidatorTest.php b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractValidatorTest.php
index fe168bf1f2e6df56280bd115d58864e1cfdfac8a..5291cbc5bc78eceb3f7edfe810c3bea83e4ba632 100644
--- a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractValidatorTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/AbstractValidatorTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\Fixture\AbstractValidatorClass;
 use TYPO3\CMS\Extbase\Validation\Exception\InvalidValidationOptionsException;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractValidatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorAcceptsSupportedOptions(): void
     {
         $inputOptions = [
@@ -38,9 +37,7 @@ final class AbstractValidatorTest extends UnitTestCase
         self::assertSame($expectedOptions, $validator->getOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorHasDefaultOptions(): void
     {
         $inputOptions = ['requiredOption' => 666];
@@ -53,9 +50,7 @@ final class AbstractValidatorTest extends UnitTestCase
         self::assertSame($expectedOptions, $validator->getOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorThrowsExceptionOnNotSupportedOptions(): void
     {
         $inputOptions = ['invalidoption' => 42];
@@ -65,9 +60,7 @@ final class AbstractValidatorTest extends UnitTestCase
         $validator->setOptions($inputOptions);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorThrowsExceptionOnMissingRequiredOptions(): void
     {
         $inputOptions = [];
diff --git a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/DisjunctionValidatorTest.php b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/DisjunctionValidatorTest.php
index b7ba998a3d6c5c6e6631686c4706019530e838cc..b9180166db76d04e49b5c0c6a15854a484fe3828 100644
--- a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/DisjunctionValidatorTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/DisjunctionValidatorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Error\Error;
 use TYPO3\CMS\Extbase\Error\Result;
 use TYPO3\CMS\Extbase\Validation\Validator\DisjunctionValidator;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DisjunctionValidatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validateReturnsNoErrorsIfOneValidatorReturnsNoError(): void
     {
         $validatorDisjunction = new DisjunctionValidator();
@@ -47,9 +46,7 @@ final class DisjunctionValidatorTest extends UnitTestCase
         self::assertFalse($validatorDisjunction->validate('some subject')->hasErrors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateReturnsAllErrorsIfAllValidatorsReturnErrors(): void
     {
         $validatorDisjunction = new DisjunctionValidator();
diff --git a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/GenericObjectValidatorTest.php b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/GenericObjectValidatorTest.php
index 8067d58f100ad4057ed4daed1ea23406218633a1..24bc389add452ceb277f69d6b26bdc8f7c1cc945 100644
--- a/typo3/sysext/extbase/Tests/Unit/Validation/Validator/GenericObjectValidatorTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Validation/Validator/GenericObjectValidatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Error\Error;
 use TYPO3\CMS\Extbase\Error\Result;
 use TYPO3\CMS\Extbase\Validation\Validator\GenericObjectValidator;
@@ -25,17 +27,13 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class GenericObjectValidatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorShouldReturnErrorsIfTheValueIsNoObjectAndNotNull(): void
     {
         self::assertTrue((new GenericObjectValidator())->validate('foo')->hasErrors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatorShouldReturnNoErrorsIfTheValueIsNull(): void
     {
         self::assertFalse((new GenericObjectValidator())->validate(null)->hasErrors());
@@ -75,14 +73,13 @@ final class GenericObjectValidatorTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider dataProviderForValidator
-     *
      * @param mixed $objectToBeValidated
      * @param mixed $validationResultForFoo
      * @param mixed $validationResultForBar
      * @param mixed $errors
      */
+    #[DataProvider('dataProviderForValidator')]
+    #[Test]
     public function validateChecksAllPropertiesForWhichAPropertyValidatorExists($objectToBeValidated, $validationResultForFoo, $validationResultForBar, $errors): void
     {
         $validator = new GenericObjectValidator();
@@ -103,9 +100,7 @@ final class GenericObjectValidatorTest extends UnitTestCase
         self::assertEquals($errors, $validator->validate($objectToBeValidated)->getFlattenedErrors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateCanHandleRecursiveTargetsWithoutEndlessLooping(): void
     {
         $A = new class () {
@@ -128,9 +123,7 @@ final class GenericObjectValidatorTest extends UnitTestCase
         self::assertFalse($aValidator->validate($A)->hasErrors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateDetectsFailuresInRecursiveTargetsI(): void
     {
         $A = new class () {
@@ -162,9 +155,7 @@ final class GenericObjectValidatorTest extends UnitTestCase
         self::assertSame(['b.uuid' => [$error]], $aValidator->validate($A)->getFlattenedErrors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateDetectsFailuresInRecursiveTargetsII(): void
     {
         $A = new class () {
@@ -198,9 +189,7 @@ final class GenericObjectValidatorTest extends UnitTestCase
         self::assertSame(['b.uuid' => [$error1], 'uuid' => [$error1]], $aValidator->validate($A)->getFlattenedErrors());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateDetectsFailuresInRecursiveTargetsIII(): void
     {
         // Create to test-entities. Use the same uuid to make the same validator trigger on both objects
diff --git a/typo3/sysext/extbase/Tests/Unit/Validation/ValidatorClassNameResolverTest.php b/typo3/sysext/extbase/Tests/Unit/Validation/ValidatorClassNameResolverTest.php
index 161d5221a0f3b6dab1d8df067f6e540651895ee8..179ac09aefef32f2936a43e0fe42d08c23e4db3d 100644
--- a/typo3/sysext/extbase/Tests/Unit/Validation/ValidatorClassNameResolverTest.php
+++ b/typo3/sysext/extbase/Tests/Unit/Validation/ValidatorClassNameResolverTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\Unit\Validation;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Tests\Unit\Validation\Fixtures\Validation\Validator\CustomValidator;
 use TYPO3\CMS\Extbase\Tests\Unit\Validation\Fixtures\Validation\Validator\CustomValidatorThatDoesNotImplementValidatorInterfaceValidator;
 use TYPO3\CMS\Extbase\Validation\Exception\NoSuchValidatorException;
@@ -34,18 +36,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
  */
 final class ValidatorClassNameResolverTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveResolvesFullyQualifiedClassNames(): void
     {
         $validatorIdentifier = IntegerValidator::class;
         self::assertSame($validatorIdentifier, ValidatorClassNameResolver::resolve($validatorIdentifier));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveResolvesCoreShorthandIdentifiers(): void
     {
         self::assertSame(IntegerValidator::class, ValidatorClassNameResolver::resolve('int'));
@@ -55,17 +53,13 @@ final class ValidatorClassNameResolverTest extends UnitTestCase
         self::assertSame(FloatValidator::class, ValidatorClassNameResolver::resolve('float'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveResolvesExtensionShorthandIdentifiers(): void
     {
         self::assertSame(IntegerValidator::class, ValidatorClassNameResolver::resolve('TYPO3.CMS.Extbase:Integer'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveThrowsNoSuchValidatorExceptionDueToMissingClass(): void
     {
         $this->expectExceptionCode(1365799920);
@@ -88,10 +82,8 @@ final class ValidatorClassNameResolverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider namespacedShorthandValidatorNamesDataProvider
-     */
+    #[DataProvider('namespacedShorthandValidatorNamesDataProvider')]
+    #[Test]
     public function resolveWithShortHandNotationReturnsValidatorNameIfClassExists(string $validatorName, string $expectedClassName): void
     {
         self::assertSame(
@@ -100,9 +92,7 @@ final class ValidatorClassNameResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveWithShortHandNotationThrowsExceptionIfClassDoesNotExist(): void
     {
         $this->expectException(NoSuchValidatorException::class);
@@ -112,9 +102,7 @@ final class ValidatorClassNameResolverTest extends UnitTestCase
         ValidatorClassNameResolver::resolve($validatorName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveThrowsNoSuchValidatorExceptionDueToClassInheritance(): void
     {
         $this->expectExceptionCode(1365776838);
@@ -130,9 +118,7 @@ final class ValidatorClassNameResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveThrowsExceptionWithValidatorThatDoesNotImplementValidatorInterface(): void
     {
         $this->expectException(NoSuchValidatorException::class);
@@ -142,9 +128,7 @@ final class ValidatorClassNameResolverTest extends UnitTestCase
         ValidatorClassNameResolver::resolve($validatorName);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveReturnsValidatorNameForFullQualifiedValidatorName(): void
     {
         $validatorName = CustomValidator::class;
@@ -156,9 +140,7 @@ final class ValidatorClassNameResolverTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveReturnsValidatorNameForFullQualifiedValidatorNameWithLeadingBackslash(): void
     {
         $validatorName = '\\' . CustomValidator::class;
diff --git a/typo3/sysext/extbase/Tests/UnitDeprecated/Mvc/Web/Routing/UriBuilderTest.php b/typo3/sysext/extbase/Tests/UnitDeprecated/Mvc/Web/Routing/UriBuilderTest.php
index efaea1884cbabe4670877d1323b402e23f157ea7..0a0789f49741cf22dad79db51287aee632eec390 100644
--- a/typo3/sysext/extbase/Tests/UnitDeprecated/Mvc/Web/Routing/UriBuilderTest.php
+++ b/typo3/sysext/extbase/Tests/UnitDeprecated/Mvc/Web/Routing/UriBuilderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\UnitDeprecated\Mvc\Web\Routing;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
 use TYPO3\CMS\Extbase\Mvc\Request;
@@ -51,9 +52,7 @@ final class UriBuilderTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDefaultControllerAndActionDoesNotModifyArgumentsIfSpecifiedControllerAndActionIsNotEqualToDefaults(): void
     {
         $this->mockExtensionService->expects(self::atLeastOnce())->method('getDefaultControllerNameByPlugin')->with('ExtensionName', 'PluginName')->willReturn('DefaultController');
@@ -66,9 +65,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDefaultControllerAndActionRemovesControllerIfItIsEqualToTheDefault(): void
     {
         $this->mockExtensionService->expects(self::atLeastOnce())->method('getDefaultControllerNameByPlugin')->with('ExtensionName', 'PluginName')->willReturn('DefaultController');
@@ -81,9 +78,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDefaultControllerAndActionRemovesActionIfItIsEqualToTheDefault(): void
     {
         $this->mockExtensionService->expects(self::atLeastOnce())->method('getDefaultControllerNameByPlugin')->with('ExtensionName', 'PluginName')->willReturn('DefaultController');
@@ -96,9 +91,7 @@ final class UriBuilderTest extends UnitTestCase
         self::assertEquals($expectedResult, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDefaultControllerAndActionRemovesControllerAndActionIfBothAreEqualToTheDefault(): void
     {
         $this->mockExtensionService->expects(self::atLeastOnce())->method('getDefaultControllerNameByPlugin')->with('ExtensionName', 'PluginName')->willReturn('DefaultController');
diff --git a/typo3/sysext/extbase/Tests/UnitDeprecated/Persistence/RepositoryTest.php b/typo3/sysext/extbase/Tests/UnitDeprecated/Persistence/RepositoryTest.php
index c1ae789399c376686ed3f9590ba6937598f67adf..7e9ca5e1281ae688f7d4114d605fd26b420cb2bb 100644
--- a/typo3/sysext/extbase/Tests/UnitDeprecated/Persistence/RepositoryTest.php
+++ b/typo3/sysext/extbase/Tests/UnitDeprecated/Persistence/RepositoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\UnitDeprecated\Persistence;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
 use TYPO3\CMS\Extbase\Persistence\Generic\Backend;
@@ -98,9 +99,7 @@ final class RepositoryTest extends UnitTestCase
         $this->repository->injectPersistenceManager($this->mockPersistenceManager);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function magicCallMethodAcceptsFindBySomethingCallsAndExecutesAQueryWithThatCriteria(): void
     {
         $mockQueryResult = $this->createMock(QueryResultInterface::class);
@@ -117,9 +116,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertSame($mockQueryResult, $repository->findByFoo('bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function magicCallMethodAcceptsFindOneBySomethingCallsAndExecutesAQueryWithThatCriteria(): void
     {
         $object = new \stdClass();
@@ -139,9 +136,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertSame($object, $repository->findOneByFoo('bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function magicCallMethodAcceptsCountBySomethingCallsAndExecutesAQueryWithThatCriteria(): void
     {
         $mockQuery = $this->createMock(QueryInterface::class);
@@ -159,9 +154,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertSame(2, $repository->countByFoo('bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function magicCallMethodReturnsFirstArrayKeyInFindOneBySomethingIfQueryReturnsRawResult(): void
     {
         $queryResultArray = [
@@ -176,9 +169,7 @@ final class RepositoryTest extends UnitTestCase
         self::assertSame(['foo' => 'bar'], $this->repository->findOneByFoo('bar'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function magicCallMethodReturnsNullInFindOneBySomethingIfQueryReturnsEmptyRawResult(): void
     {
         $queryResultArray = [];
diff --git a/typo3/sysext/extbase/Tests/UnitDeprecated/Reflection/ReflectionServiceTest.php b/typo3/sysext/extbase/Tests/UnitDeprecated/Reflection/ReflectionServiceTest.php
index 121e4ccf7f65f4e4e073a11a257611a4702ebace..e1a732eebd613592e38393eacd8d06039a073f47 100644
--- a/typo3/sysext/extbase/Tests/UnitDeprecated/Reflection/ReflectionServiceTest.php
+++ b/typo3/sysext/extbase/Tests/UnitDeprecated/Reflection/ReflectionServiceTest.php
@@ -17,16 +17,12 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extbase\Tests\UnitDeprecated\Reflection;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ReflectionServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     *
-     * Note:    Starting with PHP8.2 unserializing dynamic properties (undefined properties) emits a deprecation
-     *          warning, which fails in normal tests. This moved here to avoid failing tests.
-     */
+    #[Test]
     public function reflectionServiceIsResetDuringWakeUp(): void
     {
         $insecureString = file_get_contents(__DIR__ . '/Fixture/InsecureSerializedReflectionService.txt');
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Controller/ActionControllerTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Controller/ActionControllerTest.php
index c6ac1964a7c366dc0cf142213609c4a8bd00a0ad..25c2c262c555d3ab93788c32dae4155850cbda6f 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Controller/ActionControllerTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Controller/ActionControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Registry;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -48,9 +49,8 @@ final class ActionControllerTest extends UnitTestCase
 
     /**
      * Warning: This test asserts multiple things at once to keep the setup short.
-     *
-     * @test
      */
+    #[Test]
     public function createZipFileFromExtensionGeneratesCorrectArchive(): void
     {
         // 42 second of first day in 1970 - used to have achieve stable file names
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Controller/DownloadControllerTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Controller/DownloadControllerTest.php
index 4dfd3c9c88e8ca6e47b5ee130e77105786b1076d..5c34e2333a291260e6e2c4958bfb313d3b884c12 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Controller/DownloadControllerTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Controller/DownloadControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
 use TYPO3\CMS\Extensionmanager\Controller\DownloadController;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Extension;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DownloadControllerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function installFromTerReturnsArrayWithBooleanResultAndErrorArrayWhenExtensionManagerExceptionIsThrown(): void
     {
         $dummyExceptionMessage = 'exception message';
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Controller/UploadExtensionFileControllerTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Controller/UploadExtensionFileControllerTest.php
index 2810f5520be44772be6eb00176b444984c594440..127f54521771ad68265576372f64b6e659072321 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Controller/UploadExtensionFileControllerTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Controller/UploadExtensionFileControllerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extensionmanager\Controller\UploadExtensionFileController;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -62,10 +64,8 @@ final class UploadExtensionFileControllerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getExtensionFromZipFileExtractsExtensionKeyDataProvider
-     */
+    #[DataProvider('getExtensionFromZipFileExtractsExtensionKeyDataProvider')]
+    #[Test]
     public function getExtensionKeyFromFileNameExtractsExtensionKey(string $filename, string $expectedKey): void
     {
         $subject = $this->getAccessibleMock(UploadExtensionFileController::class, null, [], '', false);
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DependencyTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DependencyTest.php
index 80f442828c98ed38e9f118468a163226fb3d301f..016e18874d01d5f12c61e6ecc1bedf7ed4fbdd01 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DependencyTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DependencyTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Dependency;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DependencyTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getLowestAndHighestIntegerVersionsReturnsArrayWithVersions(): void
     {
         $subject = Dependency::createFromEmConf('ter', '1.0.0-2.0.0');
@@ -32,9 +31,7 @@ final class DependencyTest extends UnitTestCase
         self::assertSame(2000000, $subject->getHighestVersionAsInteger());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isVersionCompatibleReturnsCorrectResult(): void
     {
         $dependency = Dependency::createFromEmConf('typo3', '9.5.0-10.4.99');
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DownloadQueueTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DownloadQueueTest.php
index eceefc725e15c209ee366c2a3c1525571a987cba..972062a82b50f415f2a2105db3b2404365f6f6c5 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DownloadQueueTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/DownloadQueueTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extensionmanager\Domain\Model\DownloadQueue;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Extension;
 use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException;
@@ -28,12 +29,12 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 final class DownloadQueueTest extends UnitTestCase
 {
     /**
-     * @var \TYPO3\CMS\Extensionmanager\Domain\Model\DownloadQueue
+     * @var DownloadQueue
      */
     protected $downloadQueue;
 
     /**
-     * @var \TYPO3\CMS\Extensionmanager\Domain\Model\Extension
+     * @var Extension
      */
     protected $extension;
 
@@ -46,9 +47,7 @@ final class DownloadQueueTest extends UnitTestCase
         $this->extension->setVersion('1.0.0');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addExtensionToQueueAddsExtensionToDownloadStorageArray(): void
     {
         $this->downloadQueue->addExtensionToQueue($this->extension);
@@ -57,9 +56,7 @@ final class DownloadQueueTest extends UnitTestCase
         self::assertArrayHasKey('foobar', $extensionStorage['download']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addExtensionToQueueAddsExtensionToUpdateStorageArray(): void
     {
         $this->downloadQueue->addExtensionToQueue($this->extension, 'update');
@@ -68,9 +65,7 @@ final class DownloadQueueTest extends UnitTestCase
         self::assertArrayHasKey('foobar', $extensionStorage['update']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addExtensionToQueueThrowsExceptionIfUnknownStackIsGiven(): void
     {
         $this->expectException(ExtensionManagerException::class);
@@ -78,9 +73,7 @@ final class DownloadQueueTest extends UnitTestCase
         $this->downloadQueue->addExtensionToQueue($this->extension, 'unknownStack');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addExtensionToQueueThrowsExceptionIfExtensionWithSameKeyAndDifferentValuesAlreadyExists(): void
     {
         $extension = new Extension();
@@ -93,9 +86,7 @@ final class DownloadQueueTest extends UnitTestCase
         $this->downloadQueue->addExtensionToQueue($this->extension);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeExtensionFromQueueRemovesExtension(): void
     {
         $extension = new Extension();
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/ExtensionTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/ExtensionTest.php
index 285c2c83f5dff2eeb7c717814cccb5e1955a7bfd..a9b89d067f90a762db96d9a93dbd7089e336e708 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/ExtensionTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Model/ExtensionTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Extension;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -79,19 +81,17 @@ final class ExtensionTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getCategoryIndexFromStringOrNumberReturnsIndexDataProvider
      * @param string|int $input Given input
      * @param int $expected Expected result
      */
+    #[DataProvider('getCategoryIndexFromStringOrNumberReturnsIndexDataProvider')]
+    #[Test]
     public function getCategoryIndexFromStringOrNumberReturnsIndex($input, $expected): void
     {
         $extension = new Extension();
         self::assertEquals($expected, $extension->getCategoryIndexFromStringOrNumber($input));
     }
-    /**
-     * @test
-     */
+    #[Test]
     public function convertDependenciesToObjectsCreatesObjectStorage(): void
     {
         $serializedDependencies = [
@@ -105,9 +105,7 @@ final class ExtensionTest extends UnitTestCase
         self::assertInstanceOf(\SplObjectStorage::class, $dependencyObjects);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertDependenciesToObjectsSetsIdentifier(): void
     {
         $serializedDependencies = [
@@ -176,10 +174,8 @@ final class ExtensionTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider convertDependenciesToObjectSetsVersionDataProvider
-     */
+    #[DataProvider('convertDependenciesToObjectSetsVersionDataProvider')]
+    #[Test]
     public function convertDependenciesToObjectSetsVersion(array $dependencies, array $returnValue): void
     {
         $serializedDependencies = serialize($dependencies);
@@ -190,9 +186,7 @@ final class ExtensionTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertDependenciesToObjectCanDealWithEmptyStringDependencyValues(): void
     {
         $dependencies = [
@@ -203,9 +197,7 @@ final class ExtensionTest extends UnitTestCase
         self::assertSame(0, $dependencyObjects->count());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDistributionImageTest(): void
     {
         $imageUrl = 'https://example.org/path/to/image.png';
@@ -219,9 +211,7 @@ final class ExtensionTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDistributionWelcomeImageTest(): void
     {
         $imageUrl = 'https://example.org/path/to/image.png';
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ExtensionRepositoryTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ExtensionRepositoryTest.php
index 57ce7d776d89546a796a318d77585126815bd310..e9c52b0f77614d5717686ef89ca8ec5441d460da 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ExtensionRepositoryTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ExtensionRepositoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Domain\Repository;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Dependency;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Extension;
 use TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ExtensionRepositoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function filterYoungestVersionOfExtensionListFiltersAListToLatestVersion(): void
     {
         // foo2 should be kept
@@ -53,9 +52,7 @@ final class ExtensionRepositoryTest extends UnitTestCase
         self::assertEquals(['foo' => $foo2, 'bar' => $bar1], $subject->_call('filterYoungestVersionOfExtensionList', $input, true));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function filterYoungestVersionOfExtensionListFiltersAListToLatestVersionWithOnlyCompatibleExtensions(): void
     {
         $suitableDependency = Dependency::createFromEmConf('typo3', '3.6.1');
@@ -94,9 +91,7 @@ final class ExtensionRepositoryTest extends UnitTestCase
         self::assertEquals(['foo' => $foo1, 'bar' => $bar2], $subject->_call('filterYoungestVersionOfExtensionList', $input, false));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getExtensionsSuitableForTypo3VersionReturnsOnlySuitableOnes(): void
     {
         $suitableDependency = Dependency::createFromEmConf('typo3', '10.4.0-99.99.99');
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Parser/ExtensionXmlParserTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Parser/ExtensionXmlParserTest.php
index 9294d752ed8c3121a668437500ab7c677ad78a3c..d66d34ed523e62b4a01775c4848044d7df668184 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Parser/ExtensionXmlParserTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Parser/ExtensionXmlParserTest.php
@@ -17,15 +17,15 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Parser;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extensionmanager\Parser\ExtensionXmlParser;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ExtensionXmlParserTest extends UnitTestCase
 {
-    /**
-     * @test
-     * @dataProvider isValidVersionNumberDataProvider
-     */
+    #[DataProvider('isValidVersionNumberDataProvider')]
+    #[Test]
     public function isValidVersionNumber(string $versionNumber, bool $isValid): void
     {
         $subject = $this->getAccessibleMock(ExtensionXmlParser::class, null);
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Report/ExtensionStatusTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Report/ExtensionStatusTest.php
index 8be4122b7a701d1c8da1d627ad6808d156b43a38..75eacc93a651249f4147ef1cf2c24ea36e012e0d 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Report/ExtensionStatusTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Report/ExtensionStatusTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Report;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Localization\LanguageService;
@@ -33,18 +34,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ExtensionStatusTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function extensionStatusImplementsStatusProviderInterface(): void
     {
         $reportMock = $this->createMock(ExtensionStatus::class);
         self::assertInstanceOf(StatusProviderInterface::class, $reportMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArray(): void
     {
         $report = $this->getMockBuilder(ExtensionStatus::class)
@@ -54,9 +51,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertIsArray($report->getStatus());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnArrayContainsFiveEntries(): void
     {
         $report = $this->getMockBuilder(ExtensionStatus::class)
@@ -66,9 +61,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertCount(5, $report->getStatus());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnArrayContainsInstancesOfReportsStatusStatus(): void
     {
         $statusObject = $this->getMockBuilder(Status::class)
@@ -87,9 +80,7 @@ final class ExtensionStatusTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusCallsMainRepositoryForMainRepositoryStatusResult(): void
     {
         $languageServiceFactoryMock = $this->createMock(LanguageServiceFactory::class);
@@ -109,9 +100,7 @@ final class ExtensionStatusTest extends UnitTestCase
         $subject->getStatus();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsErrorStatusIfRepositoryIsNotFound(): void
     {
         $languageServiceFactoryMock = $this->createMock(LanguageServiceFactory::class);
@@ -132,9 +121,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertEquals(ContextualFeedbackSeverity::ERROR, $statusObject->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsNoticeIfRepositoryUpdateIsLongerThanSevenDaysAgo(): void
     {
         $languageServiceFactoryMock = $this->createMock(LanguageServiceFactory::class);
@@ -169,9 +156,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertEquals(ContextualFeedbackSeverity::NOTICE, $statusObject->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsOkForLoadedExtensionIfNoInsecureExtensionIsLoaded(): void
     {
         $languageServiceFactoryMock = $this->createMock(LanguageServiceFactory::class);
@@ -192,9 +177,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertEquals(ContextualFeedbackSeverity::OK, $statusObject->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsErrorForLoadedExtensionIfInsecureExtensionIsLoaded(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -215,9 +198,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertEquals(ContextualFeedbackSeverity::ERROR, $statusObject->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsOkForExistingExtensionIfNoInsecureExtensionExists(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -239,9 +220,7 @@ final class ExtensionStatusTest extends UnitTestCase
         }
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsWarningForExistingExtensionIfInsecureExtensionExistsButIsNotLoaded(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -262,9 +241,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertEquals(ContextualFeedbackSeverity::WARNING, $statusObject->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsWarningForLoadedExtensionIfOutdatedExtensionIsLoaded(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -285,9 +262,7 @@ final class ExtensionStatusTest extends UnitTestCase
         self::assertEquals(ContextualFeedbackSeverity::WARNING, $statusObject->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsErrorForExistingExtensionIfOutdatedExtensionExists(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Service/ExtensionManagementServiceTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Service/ExtensionManagementServiceTest.php
index ad2fc708cbeb66be0d288bb55dd73b3ae07c6529..86134a22362af4b813bbcd8ffc8a6f0d552cf89b 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Service/ExtensionManagementServiceTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Service/ExtensionManagementServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Extensionmanager\Domain\Model\DownloadQueue;
@@ -65,9 +66,7 @@ final class ExtensionManagementServiceTest extends UnitTestCase
         $this->managementService->injectDownloadQueue($this->downloadQueue);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installDownloadsExtensionIfNecessary(): void
     {
         $extension = new Extension();
@@ -87,9 +86,7 @@ final class ExtensionManagementServiceTest extends UnitTestCase
         $this->managementService->installExtension($extension);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installExtensionReturnsFalseIfDependenciesCannotBeResolved(): void
     {
         $extension = new Extension();
@@ -101,9 +98,7 @@ final class ExtensionManagementServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installExtensionWillReturnInstalledExtensions(): void
     {
         $extension = new Extension();
@@ -113,9 +108,7 @@ final class ExtensionManagementServiceTest extends UnitTestCase
         self::assertSame(['installed' => ['foo' => 'foo']], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installExtensionWillReturnDownloadedExtensions(): void
     {
         $downloadQueue = new DownloadQueue();
@@ -135,9 +128,7 @@ final class ExtensionManagementServiceTest extends UnitTestCase
         self::assertSame(['downloaded' => ['foo' => $extension], 'installed' => ['foo' => 'foo']], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installExtensionWillReturnUpdatedExtensions(): void
     {
         $downloadQueue = new DownloadQueue();
@@ -161,9 +152,7 @@ final class ExtensionManagementServiceTest extends UnitTestCase
         self::assertSame(['updated' => ['foo' => $extension], 'installed' => ['foo' => 'foo']], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function markExtensionForDownloadAddsExtensionToDownloadQueueAndChecksDependencies(): void
     {
         $extension = new Extension();
@@ -176,9 +165,7 @@ final class ExtensionManagementServiceTest extends UnitTestCase
         self::assertSame(['download' => ['foo' => $extension]], $this->downloadQueue->getExtensionQueue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function markExtensionForUpdateAddsExtensionToUpdateQueueAndChecksDependencies(): void
     {
         $extension = new Extension();
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/DependencyUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/DependencyUtilityTest.php
index de7d3e4b84a721af7a93a2d4fcc33538147bfc47..5c90173d64406ae4b8df146b0cd5759f09ecadef 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/DependencyUtilityTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Utility/DependencyUtilityTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Dependency;
 use TYPO3\CMS\Extensionmanager\Domain\Model\Extension;
@@ -29,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DependencyUtilityTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function checkTypo3DependencyErrorsIfVersionNumberIsTooLow(): void
     {
         $dependency = Dependency::createFromEmConf('typo3', '15.0.0-0');
@@ -49,9 +48,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertSame(1399144499, $errors['foo'][0]['code']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkTypo3DependencyErrorsIfVersionNumberIsTooHigh(): void
     {
         $dependency = Dependency::createFromEmConf('typo3', '1.0.0-3.0.0');
@@ -69,9 +66,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertSame(1399144521, $errors['foo'][0]['code']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkTypo3DependencyReturnsTrueIfVersionNumberIsInRange(): void
     {
         $dependency = Dependency::createFromEmConf('typo3', '1.0.0-25.0.0');
@@ -88,9 +83,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertCount(0, $errors);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkTypo3DependencyCanHandleEmptyVersionHighestVersion(): void
     {
         $dependency = Dependency::createFromEmConf('typo3', '1.0.0');
@@ -107,9 +100,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertCount(0, $errors);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkTypo3DependencyCanHandleEmptyVersionLowestVersion(): void
     {
         $dependency = Dependency::createFromEmConf('typo3', '-15.0.0');
@@ -126,9 +117,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertCount(0, $errors);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPhpDependencyErrorsIfVersionNumberIsTooLow(): void
     {
         $dependency = Dependency::createFromEmConf('php', '15.0.0');
@@ -146,9 +135,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertSame(1377977857, $errors['foo'][0]['code']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPhpDependencyThrowsExceptionIfVersionNumberIsTooHigh(): void
     {
         $dependency = Dependency::createFromEmConf('php', '1.0.0-3.0.0');
@@ -166,9 +153,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertSame(1377977856, $errors['foo'][0]['code']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPhpDependencyReturnsTrueIfVersionNumberIsInRange(): void
     {
         $dependency = Dependency::createFromEmConf('php', '1.0.0-15.0.0');
@@ -186,9 +171,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertCount(0, $errors);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPhpDependencyCanHandleEmptyVersionHighestVersion(): void
     {
         $dependency = Dependency::createFromEmConf('php', '1.0.0');
@@ -206,9 +189,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertCount(0, $errors);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkPhpDependencyCanHandleEmptyVersionLowestVersion(): void
     {
         $dependency = Dependency::createFromEmConf('typo3', '-25.0.0');
@@ -225,9 +206,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertCount(0, $errors);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isDependentExtensionAvailableReturnsTrueIfExtensionIsAvailable(): void
     {
         $availableExtensions = [
@@ -247,9 +226,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertTrue($dependencyUtility->_call('isDependentExtensionAvailable', 'dummy'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isDependentExtensionAvailableReturnsFalseIfExtensionIsNotAvailable(): void
     {
         $availableExtensions = [
@@ -269,9 +246,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertFalse($dependencyUtility->_call('isDependentExtensionAvailable', '42'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isAvailableVersionCompatibleCallsIsVersionCompatibleWithExtensionVersion(): void
     {
         $emConfUtility = $this->getMockBuilder(EmConfUtility::class)
@@ -293,9 +268,7 @@ final class DependencyUtilityTest extends UnitTestCase
         $dependencyUtility->_call('isAvailableVersionCompatible', $dependency);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExtensionDownloadableFromRemoteReturnsTrueIfOneVersionExists(): void
     {
         $extensionRepositoryMock = $this->getMockBuilder(ExtensionRepository::class)
@@ -309,9 +282,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertTrue($count);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isExtensionDownloadableFromRemoteReturnsFalseIfNoVersionExists(): void
     {
         $extensionRepositoryMock = $this->getMockBuilder(ExtensionRepository::class)
@@ -325,9 +296,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertFalse($count);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isDownloadableVersionCompatibleReturnsTrueIfCompatibleVersionExists(): void
     {
         $dependency = Dependency::createFromEmConf('dummy', '1.0.0-10.0.0');
@@ -342,9 +311,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertTrue($count);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isDownloadableVersionCompatibleReturnsFalseIfIncompatibleVersionExists(): void
     {
         $dependency = Dependency::createFromEmConf('dummy', '1.0.0-2.0.0');
@@ -359,9 +326,7 @@ final class DependencyUtilityTest extends UnitTestCase
         self::assertFalse($count);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLatestCompatibleExtensionByDependencyWillReturnExtensionModelOfLatestExtension(): void
     {
         $suitableDependency = Dependency::createFromEmConf('typo3', '3.6.1');
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/EmConfUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/EmConfUtilityTest.php
index 9abdf498363b5befa00ed3effff7a699671e500c..ff8a4da0b5ec9790ba4173c4c009783e6700e6ed 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/EmConfUtilityTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Utility/EmConfUtilityTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extensionmanager\Utility\EmConfUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class EmConfUtilityTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructEmConfAddsCommentBlock(): void
     {
         $subject = new EmConfUtility();
@@ -32,9 +31,7 @@ final class EmConfUtilityTest extends UnitTestCase
         self::assertStringContainsString('Extension Manager/Repository config file for ext', $emConf);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixEmConfTransfersOldConflictSettingToNewFormatWithSingleConflictingExtension(): void
     {
         $input = [
@@ -59,9 +56,7 @@ final class EmConfUtilityTest extends UnitTestCase
         self::assertEquals($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixEmConfTransfersOldConflictSettingToNewFormatWithTwoConflictingExtensions(): void
     {
         $input = [
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php
index 5c63970800b405c7cd06c4695782dab76a958d58..9d7f5282e7d5a9511ee0c0da744c7093d7988c90 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Localization\LanguageService;
@@ -62,9 +63,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         return $extKey;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeAndClearExtensionDirRemovesExtensionDirIfAlreadyExists(): void
     {
         $extKey = $this->createFakeExtension();
@@ -79,9 +78,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         $fileHandlerMock->_call('makeAndClearExtensionDir', $extKey);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeAndClearExtensionDirAddsDir(): void
     {
         $extKey = $this->createFakeExtension();
@@ -95,9 +92,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         $fileHandlerMock->_call('makeAndClearExtensionDir', $extKey);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function makeAndClearExtensionDirThrowsExceptionOnInvalidPath(): void
     {
         $this->expectException(ExtensionManagerException::class);
@@ -112,9 +107,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         $fileHandlerMock->_call('makeAndClearExtensionDir', 'testing123', 'fakepath');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDirectoryAddsDirectory(): void
     {
         $extDirPath = $this->testRoot . StringUtility::getUniqueId('test-extensions-');
@@ -123,9 +116,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         self::assertDirectoryExists($extDirPath);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDirectoryRemovesDirectory(): void
     {
         $extDirPath = $this->testRoot . StringUtility::getUniqueId('test-extensions-');
@@ -135,9 +126,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         self::assertDirectoryDoesNotExist($extDirPath);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDirectoryRemovesSymlink(): void
     {
         $absoluteSymlinkPath = $this->testRoot . StringUtility::getUniqueId('test_symlink_');
@@ -149,9 +138,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         self::assertFalse(is_link($absoluteSymlinkPath));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeDirectoryDoesNotRemoveContentOfSymlinkedTargetDirectory(): void
     {
         $absoluteSymlinkPath = $this->testRoot . StringUtility::getUniqueId('test_symlink_');
@@ -168,9 +155,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         self::assertTrue(is_file($absoluteDirectoryPath . $relativeFilePath));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unpackExtensionFromExtensionDataArrayCreatesTheExtensionDirectory(): void
     {
         $extensionKey = 'test';
@@ -187,9 +172,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         $fileHandlerMock->unpackExtensionFromExtensionDataArray($extensionKey, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unpackExtensionFromExtensionDataArrayStripsDirectoriesFromFilesArray(): void
     {
         $extensionData = [
@@ -255,9 +238,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         $fileHandlerMock->unpackExtensionFromExtensionDataArray('test', $extensionData);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function writeExtensionFilesWritesFiles(): void
     {
         $files = [
@@ -282,9 +263,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         self::assertFileExists($rootPath . 'ChangeLog');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractDirectoriesFromExtensionDataExtractsDirectories(): void
     {
         $files = [
@@ -333,9 +312,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         self::assertSame($expected, array_values($extractedDirectories));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createDirectoriesForExtensionFilesCreatesDirectories(): void
     {
         $rootPath = $this->fakedExtensions[$this->createFakeExtension()]['packagePath'];
@@ -351,9 +328,7 @@ final class FileHandlingUtilityTest extends UnitTestCase
         self::assertDirectoryExists($rootPath . 'mod/doc/');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function writeEmConfWritesEmConfFile(): void
     {
         $extKey = $this->createFakeExtension();
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php
index 73f63b41a19547b980e472d4ce5f5cdf94ed3733..1514a044d493e9169c6023076063136f502ba4ff 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Container\ContainerInterface;
 use Psr\EventDispatcher\EventDispatcherInterface;
@@ -118,9 +120,7 @@ final class InstallUtilityTest extends UnitTestCase
         return $extKey;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installCallsUpdateDatabase(): void
     {
         $this->installMock->expects(self::once())->method('updateDatabase');
@@ -130,9 +130,7 @@ final class InstallUtilityTest extends UnitTestCase
         $this->installMock->install($this->extensionKey);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installCallsLoadExtension(): void
     {
         $cacheManagerMock = $this->getMockBuilder(CacheManager::class)->getMock();
@@ -141,9 +139,7 @@ final class InstallUtilityTest extends UnitTestCase
         $this->installMock->install($this->extensionKey);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installCallsFlushCaches(): void
     {
         $cacheManagerMock = $this->getMockBuilder(CacheManager::class)->getMock();
@@ -152,9 +148,7 @@ final class InstallUtilityTest extends UnitTestCase
         $this->installMock->install($this->extensionKey);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installCallsReloadCaches(): void
     {
         $cacheManagerMock = $this->getMockBuilder(CacheManager::class)->getMock();
@@ -163,9 +157,7 @@ final class InstallUtilityTest extends UnitTestCase
         $this->installMock->install($this->extensionKey);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function installCallsSaveDefaultConfigurationWithExtensionKey(): void
     {
         $cacheManagerMock = $this->getMockBuilder(CacheManager::class)->getMock();
@@ -200,10 +192,8 @@ final class InstallUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider importT3DFileDoesNotImportFileIfAlreadyImportedDataProvider
-     */
+    #[DataProvider('importT3DFileDoesNotImportFileIfAlreadyImportedDataProvider')]
+    #[Test]
     public function importT3DFileDoesNotImportFileIfAlreadyImported(string $fileName, string $registryNameReturnsFalse, string $registryNameReturnsTrue): void
     {
         $extKey = $this->createFakeExtension();
diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/ListUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/ListUtilityTest.php
index 8c9bd9f33edfeeab04a01c63cea4fcfc40a186ba..aa258aec0fbd85a99432c16ba2bbefa93fcd451f 100644
--- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/ListUtilityTest.php
+++ b/typo3/sysext/extensionmanager/Tests/Unit/Utility/ListUtilityTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
 use TYPO3\CMS\Core\Package\Package;
 use TYPO3\CMS\Core\Package\PackageManager;
@@ -107,10 +109,8 @@ final class ListUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getAvailableAndInstalledExtensionsDataProvider
-     */
+    #[DataProvider('getAvailableAndInstalledExtensionsDataProvider')]
+    #[Test]
     public function getAvailableAndInstalledExtensionsTest(array $availableExtensions, array $expectedResult): void
     {
         self::assertEquals($expectedResult, $this->subject->getAvailableAndInstalledExtensions($availableExtensions));
@@ -137,10 +137,8 @@ final class ListUtilityTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider enrichExtensionsWithEmConfInformationDataProvider
-     */
+    #[DataProvider('enrichExtensionsWithEmConfInformationDataProvider')]
+    #[Test]
     public function enrichExtensionsWithEmConfInformation(array $extensions, array $emConf, array $expectedResult): void
     {
         $this->subject->injectExtensionRepository($this->getAccessibleMock(ExtensionRepository::class, ['findOneByExtensionKeyAndVersion', 'findHighestAvailableVersion'], [], '', false));
diff --git a/typo3/sysext/felogin/Tests/Unit/Configuration/RecoveryConfigurationTest.php b/typo3/sysext/felogin/Tests/Unit/Configuration/RecoveryConfigurationTest.php
index d0bbb8af0afd943d3d6a3bf7ea5d49a82a1974bf..f472827a932dacce2dd26049acf8e5cfd64305ac 100644
--- a/typo3/sysext/felogin/Tests/Unit/Configuration/RecoveryConfigurationTest.php
+++ b/typo3/sysext/felogin/Tests/Unit/Configuration/RecoveryConfigurationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\FrontendLogin\Tests\Unit\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
@@ -79,9 +80,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         $this->subject->setLogger($this->logger);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSenderShouldReturnAddressWithFallbackFromGlobals(): void
     {
         $this->settings['email_from'] = null;
@@ -103,9 +102,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSenderShouldReturnAddressWithConfigFromTypoScript(): void
     {
         $this->setupSubject();
@@ -122,9 +119,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getEmailTemplateNameThrowsExceptionIfTemplateNameIsEmpty(): void
     {
         $this->settings['email']['templateName'] = '';
@@ -134,9 +129,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         $this->subject->getMailTemplateName();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLifeTimeTimestampShouldReturnTimestamp(): void
     {
         $timestamp = time();
@@ -150,9 +143,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         self::assertSame($expected, $actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForgotHashShouldReturnHashWithLifeTimeTimestamp(): void
     {
         $timestamp = time();
@@ -170,9 +161,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReplyToShouldReturnNullIfNoneAreSet(): void
     {
         $this->setupSubject();
@@ -180,9 +169,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         self::assertNull($this->subject->getReplyTo());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMailTemplatePathsReturnsAnInstanceOfTemplatePathsObjectWithConfigurationOfTypoScript(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['MAIL']['templateRootPaths'] = [
@@ -201,9 +188,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMailTemplatePathsReplacesTemplatePathsWithPathsConfiguredInTypoScript(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['MAIL']['templateRootPaths'] = [
@@ -222,18 +207,14 @@ final class RecoveryConfigurationTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMailTemplateNameWillReturnTemplateNameConfiguredInTypoScript(): void
     {
         $this->setupSubject();
         self::assertSame($this->settings['email']['templateName'], $this->subject->getMailTemplateName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function recoveryConfigurationWillCreateAnInstanceOfAddressIfDefaultMailReplyToAddressIsSet(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailReplyToAddress'] = 'typo3@example.com';
@@ -241,9 +222,7 @@ final class RecoveryConfigurationTest extends UnitTestCase
         self::assertInstanceOf(Address::class, $this->subject->getReplyTo());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function recoveryConfigurationWillCreateAnInstanceOfAddressWithName(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailReplyToName'] = 'TYPO3';
diff --git a/typo3/sysext/felogin/Tests/Unit/Redirect/RedirectHandlerTest.php b/typo3/sysext/felogin/Tests/Unit/Redirect/RedirectHandlerTest.php
index b81039b19a2ab5a084b432f7c64b496c261a1356..cd88321cbe22d3778b425fb5a2d9b09679843f31 100644
--- a/typo3/sysext/felogin/Tests/Unit/Redirect/RedirectHandlerTest.php
+++ b/typo3/sysext/felogin/Tests/Unit/Redirect/RedirectHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Core\Context\Context;
@@ -63,10 +65,8 @@ final class RedirectHandlerTest extends UnitTestCase
         yield 'empty string on redirect mode logout' => ['', 'logout'];
     }
 
-    /**
-     * @test
-     * @dataProvider loginTypeLogoutDataProvider
-     */
+    #[DataProvider('loginTypeLogoutDataProvider')]
+    #[Test]
     public function processShouldReturnStringForLoginTypeLogout(string $expect, string $redirectMode): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -95,10 +95,8 @@ final class RedirectHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getLogoutRedirectUrlDataProvider
-     */
+    #[DataProvider('getLogoutRedirectUrlDataProvider')]
+    #[Test]
     public function getLogoutRedirectUrlShouldReturnAlternativeRedirectUrl(
         string $expected,
         array $redirectModes,
@@ -122,9 +120,7 @@ final class RedirectHandlerTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->getLogoutFormRedirectUrl($request, $configuration, 13, false));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLogoutRedirectUrlShouldReturnAlternativeRedirectUrlForLoggedInUserAndRedirectPageLogoutSet(): void
     {
         $this->subject = new RedirectHandler(
@@ -180,10 +176,8 @@ final class RedirectHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getLoginFormRedirectUrlDataProvider
-     */
+    #[DataProvider('getLoginFormRedirectUrlDataProvider')]
+    #[Test]
     public function getLoginFormRedirectUrlReturnsExpectedValue(
         string $redirectUrl,
         string $redirectMode,
@@ -207,9 +201,7 @@ final class RedirectHandlerTest extends UnitTestCase
         self::assertEquals($expected, $this->subject->getLoginFormRedirectUrl($request, $configuration, $redirectDisabled));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReferrerForLoginFormReturnsEmptyStringIfRedirectModeReferrerDisabled(): void
     {
         $serverRequest = (new ServerRequest())->withAttribute('extbase', new ExtbaseRequestParameters());
@@ -218,9 +210,7 @@ final class RedirectHandlerTest extends UnitTestCase
         self::assertEquals('', $this->subject->getReferrerForLoginForm($request, $settings));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReferrerForLoginFormReturnsReferrerGetParameter(): void
     {
         $expectedReferrer = 'https://example.com/page-referrer';
@@ -232,9 +222,7 @@ final class RedirectHandlerTest extends UnitTestCase
         self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReferrerForLoginFormReturnsReferrerPostParameter(): void
     {
         $expectedReferrer = 'https://example.com/page-referrer';
@@ -246,9 +234,7 @@ final class RedirectHandlerTest extends UnitTestCase
         self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReferrerForLoginFormReturnsHttpReferrerParameter(): void
     {
         $expectedReferrer = 'https://example.com/page-referrer';
@@ -260,9 +246,7 @@ final class RedirectHandlerTest extends UnitTestCase
         self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReferrerForLoginFormReturnsOriginalRequestUrlIfCalledBySubRequest(): void
     {
         $expectedReferrer = 'https://example.com/original-page';
diff --git a/typo3/sysext/felogin/Tests/Unit/Service/RecoveryServiceTest.php b/typo3/sysext/felogin/Tests/Unit/Service/RecoveryServiceTest.php
index 77917b0dd50fd25010e47d51c9cf5f3c9a4f1948..94abd71aaa2b6d77fc4d1b732214df2e345ba9bf 100644
--- a/typo3/sysext/felogin/Tests/Unit/Service/RecoveryServiceTest.php
+++ b/typo3/sysext/felogin/Tests/Unit/Service/RecoveryServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\FrontendLogin\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\Mime\Address;
@@ -60,10 +62,8 @@ final class RecoveryServiceTest extends UnitTestCase
         $this->extbaseRequest = new Request($request);
     }
 
-    /**
-     * @test
-     * @dataProvider configurationDataProvider
-     */
+    #[DataProvider('configurationDataProvider')]
+    #[Test]
     public function sendRecoveryEmailShouldGenerateMailFromConfiguration(
         int $uid,
         array $recoveryConfiguration,
diff --git a/typo3/sysext/felogin/Tests/Unit/Service/ValidatorResolverServiceTest.php b/typo3/sysext/felogin/Tests/Unit/Service/ValidatorResolverServiceTest.php
index e9f6371eb7beca8f4fcad1114c277fc982873a4a..04f11570c3b83f0afcce0d68c252a0ec16a51efb 100644
--- a/typo3/sysext/felogin/Tests/Unit/Service/ValidatorResolverServiceTest.php
+++ b/typo3/sysext/felogin/Tests/Unit/Service/ValidatorResolverServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\FrontendLogin\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Validation\Validator\NotEmptyValidator;
 use TYPO3\CMS\Extbase\Validation\Validator\StringLengthValidator;
 use TYPO3\CMS\FrontendLogin\Service\ValidatorResolverService;
@@ -26,9 +28,7 @@ final class ValidatorResolverServiceTest extends UnitTestCase
 {
     protected ValidatorResolverService $subject;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveShouldReturnEmptyArrayIfEmptyConfigurationIsPassed(): void
     {
         $result = $this->subject->resolve([]);
@@ -36,10 +36,8 @@ final class ValidatorResolverServiceTest extends UnitTestCase
         self::assertEmpty($result->current());
     }
 
-    /**
-     * @test
-     * @dataProvider validatorConfigDataProvider
-     */
+    #[DataProvider('validatorConfigDataProvider')]
+    #[Test]
     public function resolveShouldReturnValidators(array $config): void
     {
         $validators = $this->subject->resolve($config);
diff --git a/typo3/sysext/felogin/Tests/Unit/Validation/RedirectUrlValidatorTest.php b/typo3/sysext/felogin/Tests/Unit/Validation/RedirectUrlValidatorTest.php
index 4607d7e8b18bfe5c4182a6c8aaaa5560622e8948..3e5a5ff5b750ac0c88e77608e5d8d239ce0a8a5f 100644
--- a/typo3/sysext/felogin/Tests/Unit/Validation/RedirectUrlValidatorTest.php
+++ b/typo3/sysext/felogin/Tests/Unit/Validation/RedirectUrlValidatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\FrontendLogin\Tests\Unit\Validation;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder;
@@ -97,10 +99,8 @@ final class RedirectUrlValidatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateRedirectUrlClearsUrlDataProvider
-     */
+    #[DataProvider('validateRedirectUrlClearsUrlDataProvider')]
+    #[Test]
     public function validateRedirectUrlClearsUrl(string $url): void
     {
         Environment::initialize(
@@ -135,10 +135,8 @@ final class RedirectUrlValidatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateRedirectUrlKeepsCleanUrlDataProvider
-     */
+    #[DataProvider('validateRedirectUrlKeepsCleanUrlDataProvider')]
+    #[Test]
     public function validateRedirectUrlKeepsCleanUrl(string $url): void
     {
         Environment::initialize(
@@ -170,10 +168,8 @@ final class RedirectUrlValidatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateRedirectUrlClearsInvalidUrlInSubdirectoryDataProvider
-     */
+    #[DataProvider('validateRedirectUrlClearsInvalidUrlInSubdirectoryDataProvider')]
+    #[Test]
     public function validateRedirectUrlClearsInvalidUrlInSubdirectory(string $url): void
     {
         GeneralUtility::flushInternalRuntimeCaches();
@@ -198,10 +194,8 @@ final class RedirectUrlValidatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateRedirectUrlKeepsCleanUrlInSubdirectoryDataProvider
-     */
+    #[DataProvider('validateRedirectUrlKeepsCleanUrlInSubdirectoryDataProvider')]
+    #[Test]
     public function validateRedirectUrlKeepsCleanUrlInSubdirectory(string $url): void
     {
         Environment::initialize(
@@ -223,7 +217,6 @@ final class RedirectUrlValidatorTest extends UnitTestCase
     /**************************************************
      * Tests concerning isInCurrentDomain
      **************************************************/
-
     /**
      * Dataprovider for isInCurrentDomainIgnoresScheme
      */
@@ -254,12 +247,12 @@ final class RedirectUrlValidatorTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider isInCurrentDomainIgnoresSchemeDataProvider
      * @param string $host $_SERVER['HTTP_HOST']
      * @param string $https $_SERVER['HTTPS']
      * @param string $url The url to test
      */
+    #[DataProvider('isInCurrentDomainIgnoresSchemeDataProvider')]
+    #[Test]
     public function isInCurrentDomainIgnoresScheme(string $host, string $https, string $url): void
     {
         Environment::initialize(
@@ -300,11 +293,11 @@ final class RedirectUrlValidatorTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider isInCurrentDomainReturnsFalseIfDomainsAreDifferentDataProvider
      * @param string $host $_SERVER['HTTP_HOST']
      * @param string $url The url to test
      */
+    #[DataProvider('isInCurrentDomainReturnsFalseIfDomainsAreDifferentDataProvider')]
+    #[Test]
     public function isInCurrentDomainReturnsFalseIfDomainsAreDifferent(string $host, string $url): void
     {
         $_SERVER['HTTP_HOST'] = $host;
@@ -321,10 +314,7 @@ final class RedirectUrlValidatorTest extends UnitTestCase
     /**************************************************
      * Tests concerning isInLocalDomain
      **************************************************/
-
-    /**
-     * @test
-     */
+    #[Test]
     public function isInLocalDomainValidatesSites(): void
     {
         $url = 'http://example.com';
diff --git a/typo3/sysext/filelist/Tests/Unit/Event/ModifyEditFileFormDataEventTest.php b/typo3/sysext/filelist/Tests/Unit/Event/ModifyEditFileFormDataEventTest.php
index 3a070c91ed1544227f38d2b46ca79fd88f8a22ad..d05a17b7f3e00aab9db8a2dcc267e47e199c802e 100644
--- a/typo3/sysext/filelist/Tests/Unit/Event/ModifyEditFileFormDataEventTest.php
+++ b/typo3/sysext/filelist/Tests/Unit/Event/ModifyEditFileFormDataEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Filelist\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Http\Uri;
 use TYPO3\CMS\Core\Resource\File;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ModifyEditFileFormDataEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $formData = [
diff --git a/typo3/sysext/filelist/Tests/Unit/FileListTest.php b/typo3/sysext/filelist/Tests/Unit/FileListTest.php
index 791708fc06ede4422947e55e8956cccefc2682b5..063b9b09b61f1ea5cf1d8fff957dd0eedf39e73d 100644
--- a/typo3/sysext/filelist/Tests/Unit/FileListTest.php
+++ b/typo3/sysext/filelist/Tests/Unit/FileListTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Filelist\Tests\Unit;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\Localization\Locale;
 use TYPO3\CMS\Core\Resource\File;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FileListTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function sortResourcesByNameSortsCorrectly(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
@@ -69,9 +68,7 @@ final class FileListTest extends UnitTestCase
         self::assertSame($expected, $fileList->_call('sortResources', $resources, 'name'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sortResourcesByFileextNameSortsCorrectly(): void
     {
         $languageServiceMock = $this->createMock(LanguageService::class);
diff --git a/typo3/sysext/filelist/Tests/Unit/Matcher/ResourceFileExtensionMatcherTest.php b/typo3/sysext/filelist/Tests/Unit/Matcher/ResourceFileExtensionMatcherTest.php
index 972de9a2685bd8a722c335af93ff2398c5cd877b..031a0427bdc1804c3e309f22077c9f3877c5b91a 100644
--- a/typo3/sysext/filelist/Tests/Unit/Matcher/ResourceFileExtensionMatcherTest.php
+++ b/typo3/sysext/filelist/Tests/Unit/Matcher/ResourceFileExtensionMatcherTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Filelist\Tests\Unit\Matcher;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\ResourceStorage;
 use TYPO3\CMS\Filelist\Matcher\ResourceFileExtensionMatcher;
@@ -32,9 +33,7 @@ final class ResourceFileExtensionMatcherTest extends UnitTestCase
         $this->storage = $this->getMockBuilder(ResourceStorage::class)->disableOriginalConstructor()->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fileExtensionsAreTransformedToLowercase(): void
     {
         $matcher = new ResourceFileExtensionMatcher();
@@ -50,9 +49,7 @@ final class ResourceFileExtensionMatcherTest extends UnitTestCase
         self::assertTrue($matcher->match($this->getFile('png')));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function ignoredFileExtensionsAreTransformedToLowercase(): void
     {
         $matcher = new ResourceFileExtensionMatcher();
diff --git a/typo3/sysext/fluid/Tests/Unit/Core/Cache/FluidTemplateCacheTest.php b/typo3/sysext/fluid/Tests/Unit/Core/Cache/FluidTemplateCacheTest.php
index 70c464c42f619b4149d8f9532ef291301e23b3e8..96b39bde894f725e0294d5d88f6671ddc23f3f06 100644
--- a/typo3/sysext/fluid/Tests/Unit/Core/Cache/FluidTemplateCacheTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/Core/Cache/FluidTemplateCacheTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Fluid\Tests\Unit\Core\Cache;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\PhpCapableBackendInterface;
 use TYPO3\CMS\Fluid\Core\Cache\FluidTemplateCache;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FluidTemplateCacheTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function flushCallsFlushOnBackend(): void
     {
         $backend = $this->createMock(PhpCapableBackendInterface::class);
@@ -34,9 +33,7 @@ final class FluidTemplateCacheTest extends UnitTestCase
         $instance->flush();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDelegatesToRequireOnce(): void
     {
         $instance = $this->getMockBuilder(FluidTemplateCache::class)
@@ -47,9 +44,7 @@ final class FluidTemplateCacheTest extends UnitTestCase
         $instance->get('foobar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setCallsSetOnBackend(): void
     {
         $backend = $this->createMock(PhpCapableBackendInterface::class);
@@ -63,9 +58,7 @@ final class FluidTemplateCacheTest extends UnitTestCase
         $instance->set('test', 'test', ['foobar']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRemovesLeadingPhpTagBeforeCallingParentWhichAddsLeadingPhpTag(): void
     {
         $backend = $this->createMock(PhpCapableBackendInterface::class);
diff --git a/typo3/sysext/fluid/Tests/Unit/Core/Rendering/RenderingContextTest.php b/typo3/sysext/fluid/Tests/Unit/Core/Rendering/RenderingContextTest.php
index 9181e67ec38b26423280b7164081e174442a9876..064587d73a6cf678cb2ffb579c8d244f87fe7cff 100644
--- a/typo3/sysext/fluid/Tests/Unit/Core/Rendering/RenderingContextTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/Core/Rendering/RenderingContextTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Fluid\Tests\Unit\Core\Rendering;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters;
 use TYPO3\CMS\Extbase\Mvc\Request;
@@ -43,9 +45,7 @@ final class RenderingContextTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function templateVariableContainerCanBeReadCorrectly(): void
     {
         $templateVariableContainer = $this->createMock(StandardVariableProvider::class);
@@ -53,9 +53,7 @@ final class RenderingContextTest extends UnitTestCase
         self::assertSame($this->renderingContext->getVariableProvider(), $templateVariableContainer, 'Template Variable Container could not be read out again.');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function viewHelperVariableContainerCanBeReadCorrectly(): void
     {
         $viewHelperVariableContainer = $this->createMock(ViewHelperVariableContainer::class);
@@ -64,11 +62,11 @@ final class RenderingContextTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getControllerActionTestValues
      * @param string $input
      * @param string $expected
      */
+    #[DataProvider('getControllerActionTestValues')]
+    #[Test]
     public function setControllerActionProcessesInputCorrectly($input, $expected): void
     {
         $subject = $this->getMockBuilder(RenderingContext::class)
diff --git a/typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/ViewHelperResolverTest.php b/typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/ViewHelperResolverTest.php
index 7dac7dc7cd6e80e1489b49df608a23063f4d2147..9ddaf68721e9eddb465778e880eb0d67391e5f47 100644
--- a/typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/ViewHelperResolverTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/ViewHelperResolverTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Fluid\Tests\Unit\Core\ViewHelper;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\DependencyInjection\Container;
 use TYPO3\CMS\Fluid\Core\ViewHelper\ViewHelperResolver;
 use TYPO3\CMS\Fluid\ViewHelpers\CObjectViewHelper;
@@ -27,12 +29,12 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 final class ViewHelperResolverTest extends UnitTestCase
 {
     /**
-     * @test
-     * @dataProvider getResolveViewHelperNameTestValues
      * @param string $namespace
      * @param string $method
      * @param string $expected
      */
+    #[DataProvider('getResolveViewHelperNameTestValues')]
+    #[Test]
     public function resolveViewHelperClassNameResolvesExpectedViewHelperClassName($namespace, $method, $expected): void
     {
         $viewHelperResolver = new ViewHelperResolver(
diff --git a/typo3/sysext/fluid/Tests/Unit/View/AbstractTemplateViewTest.php b/typo3/sysext/fluid/Tests/Unit/View/AbstractTemplateViewTest.php
index d9103d5b43d2af8eb1dbb6e3d3750908c628fa2a..12e340c3e5295e03c3a548d70801a6f9e5f504a1 100644
--- a/typo3/sysext/fluid/Tests/Unit/View/AbstractTemplateViewTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/View/AbstractTemplateViewTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Fluid\Tests\Unit\View;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Fluid\Core\Rendering\RenderingContext;
 use TYPO3\CMS\Fluid\View\AbstractTemplateView;
@@ -50,9 +51,7 @@ final class AbstractTemplateViewTest extends UnitTestCase
         $this->view->setRenderingContext($this->renderingContext);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function viewIsPlacedInViewHelperVariableContainer(): void
     {
         $this->viewHelperVariableContainer->expects(self::once())->method('setView')->with($this->view);
diff --git a/typo3/sysext/fluid/Tests/Unit/View/TemplatePathsTest.php b/typo3/sysext/fluid/Tests/Unit/View/TemplatePathsTest.php
index 717339658d3a37ec2c0aa7e07b1a9e7011b9e31d..090ac1c4fb02839a831eaec540df9fa2c7d106e3 100644
--- a/typo3/sysext/fluid/Tests/Unit/View/TemplatePathsTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/View/TemplatePathsTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Fluid\Tests\Unit\View;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
 use TYPO3\CMS\Fluid\View\TemplatePaths;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -83,10 +85,10 @@ final class TemplatePathsTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider getPathSetterMethodTestValues
      * @param string $method
      */
+    #[DataProvider('getPathSetterMethodTestValues')]
+    #[Test]
     public function pathSetterMethodSortsPathsByKeyDescending($method, array $paths, array $expected): void
     {
         $setter = 'set' . ucfirst($method);
@@ -97,9 +99,7 @@ final class TemplatePathsTest extends UnitTestCase
         self::assertEquals($expected, $subject->$getter());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContextSpecificViewConfigurationSortsTypoScriptConfiguredPathsCorrectlyInFrontendMode(): void
     {
         $configurationManager = $this->createMock(ConfigurationManagerInterface::class);
@@ -154,9 +154,7 @@ final class TemplatePathsTest extends UnitTestCase
         ], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContextSpecificViewConfigurationSortsTypoScriptConfiguredPathsCorrectlyInBackendMode(): void
     {
         $configurationManager = $this->createMock(ConfigurationManagerInterface::class);
@@ -211,9 +209,7 @@ final class TemplatePathsTest extends UnitTestCase
         ], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContextSpecificViewConfigurationDoesNotResolveFromTypoScriptAndDoesNotSortInUnspecifiedMode(): void
     {
         $configurationManager = $this->createMock(ConfigurationManagerInterface::class);
@@ -259,9 +255,7 @@ final class TemplatePathsTest extends UnitTestCase
         ], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getContextSpecificViewConfigurationRespectsTypoScriptConfiguredPaths(): void
     {
         $configurationManager = $this->createMock(ConfigurationManagerInterface::class);
diff --git a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php
index 5ddbd0342f06d7c57b16dd9606c75ddac6ca8c29..e5e77635006bad3a1ef5122e8422958b2bf88bc1 100644
--- a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/TypolinkViewHelperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Fluid\Tests\Unit\ViewHelpers\Link;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Fluid\ViewHelpers\Link\TypolinkViewHelper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -214,10 +216,8 @@ final class TypolinkViewHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodedConfigurationAndFluidArgumentDataProvider
-     */
+    #[DataProvider('decodedConfigurationAndFluidArgumentDataProvider')]
+    #[Test]
     public function mergeTypoLinkConfigurationMergesData(array $decodedConfiguration, array $viewHelperArguments, array $expectation): void
     {
         $mock = \Closure::bind(static function (TypolinkViewHelper $typolinkViewHelper) use ($decodedConfiguration, $viewHelperArguments, &$result) {
diff --git a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Uri/TypolinkViewHelperTest.php b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Uri/TypolinkViewHelperTest.php
index 67116bb17049bbdfbaf09b073f5a1074cbc039ac..4f1106cfae648df30c9a42c4ad2eb8ce3bff3c7b 100644
--- a/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Uri/TypolinkViewHelperTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/ViewHelpers/Uri/TypolinkViewHelperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Fluid\Tests\Unit\ViewHelpers\Uri;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Fluid\ViewHelpers\Uri\TypolinkViewHelper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -76,10 +78,8 @@ final class TypolinkViewHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider plainDecodedConfigurationDataProvider
-     */
+    #[DataProvider('plainDecodedConfigurationDataProvider')]
+    #[Test]
     public function mergeTypoLinkConfigurationDoesNotModifyData(array $decodedConfiguration): void
     {
         $mock = \Closure::bind(static function (TypolinkViewHelper $typolinkViewHelper) use ($decodedConfiguration, &$result) {
@@ -176,10 +176,8 @@ final class TypolinkViewHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider decodedConfigurationAndFluidArgumentDataProvider
-     */
+    #[DataProvider('decodedConfigurationAndFluidArgumentDataProvider')]
+    #[Test]
     public function mergeTypoLinkConfigurationMergesData(array $decodedConfiguration, array $viewHelperArguments, array $expectation): void
     {
         $mock = \Closure::bind(static function (TypolinkViewHelper $typolinkViewHelper) use ($decodedConfiguration, $viewHelperArguments, &$result) {
diff --git a/typo3/sysext/form/Tests/Unit/Controller/FormEditorControllerTest.php b/typo3/sysext/form/Tests/Unit/Controller/FormEditorControllerTest.php
index 65ade2ec19f70f3469a16d9e627c1b2a99df3926..b8cdf182b52568821191c292dee7d9734cd8a9e9 100644
--- a/typo3/sysext/form/Tests/Unit/Controller/FormEditorControllerTest.php
+++ b/typo3/sysext/form/Tests/Unit/Controller/FormEditorControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Form\Controller\FormEditorController;
 use TYPO3\CMS\Form\Domain\Exception\RenderingException;
@@ -33,9 +34,7 @@ final class FormEditorControllerTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getInsertRenderablesPanelConfigurationReturnsGroupedAndSortedConfiguration(): void
     {
         $mockTranslationService = $this->getAccessibleMock(TranslationService::class, ['translate'], [], '', false);
@@ -118,9 +117,7 @@ final class FormEditorControllerTest extends UnitTestCase
         self::assertSame($expected, $subject->_call('getInsertRenderablesPanelConfiguration', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFormEditorDefinitionsReturnReducedConfiguration(): void
     {
         $mockTranslationService = $this->getAccessibleMock(TranslationService::class, ['translateValuesRecursive'], [], '', false);
@@ -239,9 +236,7 @@ final class FormEditorControllerTest extends UnitTestCase
         self::assertSame($expected, $subject->_call('getFormEditorDefinitions'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderFormEditorTemplatesThrowsExceptionIfLayoutRootPathsNotSet(): void
     {
         $this->expectException(RenderingException::class);
@@ -260,9 +255,7 @@ final class FormEditorControllerTest extends UnitTestCase
         $mockController->_call('renderFormEditorTemplates', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderFormEditorTemplatesThrowsExceptionIfLayoutRootPathsNotArray(): void
     {
         $this->expectException(RenderingException::class);
@@ -282,9 +275,7 @@ final class FormEditorControllerTest extends UnitTestCase
         $mockController->_call('renderFormEditorTemplates', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderFormEditorTemplatesThrowsExceptionIfPartialRootPathsNotSet(): void
     {
         $this->expectException(RenderingException::class);
@@ -304,9 +295,7 @@ final class FormEditorControllerTest extends UnitTestCase
         $mockController->_call('renderFormEditorTemplates', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderFormEditorTemplatesThrowsExceptionIfPartialRootPathsNotArray(): void
     {
         $this->expectException(RenderingException::class);
@@ -326,9 +315,7 @@ final class FormEditorControllerTest extends UnitTestCase
         $mockController->_call('renderFormEditorTemplates', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderFormEditorTemplatesThrowsExceptionIfTemplatePathAndFilenameNotSet(): void
     {
         $this->expectException(RenderingException::class);
@@ -345,9 +332,7 @@ final class FormEditorControllerTest extends UnitTestCase
         $mockController->_call('renderFormEditorTemplates', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function transformMultiValuePropertiesForFormEditorConvertMultiValueDataIntoMetaData(): void
     {
         $mockController = $this->getAccessibleMock(FormEditorController::class, null, [], '', false);
@@ -425,9 +410,7 @@ final class FormEditorControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('transformMultiValuePropertiesForFormEditor', $input, 'type', $multiValueProperties));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function filterEmptyArraysRemovesEmptyArrayKeys(): void
     {
         $mockController = $this->getAccessibleMock(FormEditorController::class, null, [], '', false);
diff --git a/typo3/sysext/form/Tests/Unit/Controller/FormFrontendControllerTest.php b/typo3/sysext/form/Tests/Unit/Controller/FormFrontendControllerTest.php
index 939b2372ba35db375147d8f06ab8fca300df2abf..94ec9a42f0264068fc32928ec341ac5120d63f38 100644
--- a/typo3/sysext/form/Tests/Unit/Controller/FormFrontendControllerTest.php
+++ b/typo3/sysext/form/Tests/Unit/Controller/FormFrontendControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\EventDispatcher\EventDispatcherInterface;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
@@ -47,9 +48,7 @@ final class FormFrontendControllerTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideByFlexFormSettingsReturnsNoOverriddenConfigurationIfFlexformOverridesDisabled(): void
     {
         $mockController = $this->getAccessibleMock(FormFrontendController::class, null, [], '', false);
@@ -176,9 +175,7 @@ final class FormFrontendControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('overrideByFlexFormSettings', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideByFlexFormSettingsReturnsOverriddenConfigurationIfFlexformOverridesEnabled(): void
     {
         $mockController = $this->getAccessibleMock(FormFrontendController::class, null, [], '', false);
@@ -328,9 +325,7 @@ final class FormFrontendControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('overrideByFlexFormSettings', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideByFlexFormSettingsReturnsNotOverriddenConfigurationKeyIfFlexformOverridesAreNotRepresentedInFormEngineConfiguration(): void
     {
         $mockController = $this->getAccessibleMock(FormFrontendController::class, null, [], '', false);
diff --git a/typo3/sysext/form/Tests/Unit/Controller/FormManagerControllerTest.php b/typo3/sysext/form/Tests/Unit/Controller/FormManagerControllerTest.php
index 8133f507f3c9d762a9a5f9186a86778a10611ed9..49c1f3947b4a4f0a8439eb01ccb38ab93eb7d62f 100644
--- a/typo3/sysext/form/Tests/Unit/Controller/FormManagerControllerTest.php
+++ b/typo3/sysext/form/Tests/Unit/Controller/FormManagerControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
 use TYPO3\CMS\Core\Resource\Folder;
@@ -33,9 +34,7 @@ final class FormManagerControllerTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAccessibleFormStorageFoldersReturnsProcessedArray(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -94,9 +93,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('getAccessibleFormStorageFolders'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFormManagerAppInitialDataReturnsProcessedArray(): void
     {
         $mockTranslationService = $this->getAccessibleMock(TranslationService::class, ['translateValuesRecursive'], [], '', false);
@@ -148,9 +145,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertSame($expected, $subject->_call('getFormManagerAppInitialData'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAvailableFormDefinitionsReturnsProcessedArray(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -197,9 +192,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('getAvailableFormDefinitions'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedReferencesRowsThrowsExceptionIfPersistenceIdentifierIsEmpty(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -210,9 +203,7 @@ final class FormManagerControllerTest extends UnitTestCase
         $mockController->_call('getProcessedReferencesRows', '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getProcessedReferencesRowsReturnsProcessedArray(): void
     {
         $iconFactoryMock = $this->createMock(IconFactory::class);
@@ -262,9 +253,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('getProcessedReferencesRows', 'fake'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidTemplatePathReturnsTrueIfTemplateIsDefinedAndExists(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -293,9 +282,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertTrue($mockController->_call('isValidTemplatePath', 'standard', 'EXT:form/Tests/Unit/Controller/Fixtures/SimpleContactForm.yaml'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidTemplatePathReturnsFalseIfTemplateIsDefinedButNotExists(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -324,9 +311,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertFalse($mockController->_call('isValidTemplatePath', 'standard', 'EXT:form/Tests/Unit/Controller/Fixtures/NonExistingForm.yaml'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidTemplatePathReturnsFalseIfTemplateIsNotDefinedAndExists(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -365,9 +350,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertFalse($mockController->_call('isValidTemplatePath', 'other', 'EXT:form/Tests/Unit/Controller/Fixtures/SimpleContactForm.yaml'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFormNameToIdentifierRemoveSpaces(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -377,9 +360,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('convertFormNameToIdentifier', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFormNameToIdentifierConvertAccentedCharacters(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -389,9 +370,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('convertFormNameToIdentifier', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFormNameToIdentifierConvertAccentedCharactersNotInNFC(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
@@ -401,9 +380,7 @@ final class FormManagerControllerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('convertFormNameToIdentifier', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFormNameToIdentifierRemoveSpecialChars(): void
     {
         $mockController = $this->getAccessibleMock(FormManagerController::class, null, [], '', false);
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Configuration/ConfigurationServiceTest.php b/typo3/sysext/form/Tests/Unit/Domain/Configuration/ConfigurationServiceTest.php
index 1bcf22c9bb2830319807f0b10f147400e5120c9b..c60049450dc368fe7f13d296820929abf2c6d1be 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Configuration/ConfigurationServiceTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Configuration/ConfigurationServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Configuration;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Configuration\ConfigurationService;
 use TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException;
 use TYPO3\CMS\Form\Domain\Configuration\Exception\PrototypeNotFoundException;
@@ -29,9 +31,7 @@ final class ConfigurationServiceTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPrototypeConfigurationReturnsPrototypeConfiguration(): void
     {
         $configurationManagerMock = $this->createMock(ConfigurationManagerInterface::class);
@@ -52,9 +52,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         self::assertSame($expected, $configurationService->getPrototypeConfiguration('standard'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPrototypeConfigurationThrowsExceptionIfNoPrototypeFound(): void
     {
         $configurationManagerMock = $this->createMock(ConfigurationManagerInterface::class);
@@ -72,9 +70,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->getPrototypeConfiguration('standard');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSelectablePrototypeNamesDefinedInFormEditorSetupReturnsPrototypes(): void
     {
         $configurationManagerMock = $this->createMock(ConfigurationManagerInterface::class);
@@ -104,10 +100,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         self::assertSame($expected, $configurationService->getSelectablePrototypeNamesDefinedInFormEditorSetup());
     }
 
-    /**
-     * @test
-     * @dataProvider isFormElementPropertyDefinedInFormEditorSetupDataProvider
-     */
+    #[DataProvider('isFormElementPropertyDefinedInFormEditorSetupDataProvider')]
+    #[Test]
     public function isFormElementPropertyDefinedInFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
@@ -130,10 +124,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider isPropertyCollectionPropertyDefinedInFormEditorSetupDataProvider
-     */
+    #[DataProvider('isPropertyCollectionPropertyDefinedInFormEditorSetupDataProvider')]
+    #[Test]
     public function isPropertyCollectionPropertyDefinedInFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
@@ -156,10 +148,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider isFormElementPropertyDefinedInPredefinedDefaultsInFormEditorSetupDataProvider
-     */
+    #[DataProvider('isFormElementPropertyDefinedInPredefinedDefaultsInFormEditorSetupDataProvider')]
+    #[Test]
     public function isFormElementPropertyDefinedInPredefinedDefaultsInFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
@@ -182,10 +172,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider isPropertyCollectionPropertyDefinedInPredefinedDefaultsInFormEditorSetupDataProvider
-     */
+    #[DataProvider('isPropertyCollectionPropertyDefinedInPredefinedDefaultsInFormEditorSetupDataProvider')]
+    #[Test]
     public function isPropertyCollectionPropertyDefinedInPredefinedDefaultsInFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
@@ -210,9 +198,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFormElementPredefinedDefaultValueFromFormEditorSetupThrowsExceptionIfNoPredefinedDefaultIsAvailable(
     ): void {
         $this->expectException(PropertyException::class);
@@ -233,9 +219,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->getFormElementPredefinedDefaultValueFromFormEditorSetup($validationDto);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getFormElementPredefinedDefaultValueFromFormEditorSetupReturnsDefaultValue(): void
     {
         $expected = 'foo';
@@ -266,9 +250,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCollectionPredefinedDefaultValueFromFormEditorSetupThrowsExceptionIfNoPredefinedDefaultIsAvailable(
     ): void {
         $this->expectException(PropertyException::class);
@@ -296,9 +278,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->getPropertyCollectionPredefinedDefaultValueFromFormEditorSetup($validationDto);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getPropertyCollectionPredefinedDefaultValueFromFormEditorSetupReturnsDefaultValue(): void
     {
         $expected = 'foo';
@@ -336,10 +316,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider isFormElementTypeCreatableByFormEditorDataProvider
-     */
+    #[DataProvider('isFormElementTypeCreatableByFormEditorDataProvider')]
+    #[Test]
     public function isFormElementTypeCreatableByFormEditor(
         array $configuration,
         ValidationDto $validationDto,
@@ -362,10 +340,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider isPropertyCollectionElementIdentifierCreatableByFormEditorDataProvider
-     */
+    #[DataProvider('isPropertyCollectionElementIdentifierCreatableByFormEditorDataProvider')]
+    #[Test]
     public function isPropertyCollectionElementIdentifierCreatableByFormEditor(
         array $configuration,
         ValidationDto $validationDto,
@@ -388,9 +364,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFormElementTypeDefinedInFormSetup(): void
     {
         $configuration = [
@@ -415,9 +389,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         self::assertFalse($configurationService->isFormElementTypeDefinedInFormSetup($validationDto));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addAdditionalPropertyPathsFromHookThrowsExceptionIfHookResultIsNoFormDefinitionValidation(): void
     {
         $this->expectException(PropertyException::class);
@@ -429,9 +401,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->_call('addAdditionalPropertyPathsFromHook', '', '', $input, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addAdditionalPropertyPathsFromHookThrowsExceptionIfPrototypeDoesNotMatch(): void
     {
         $this->expectException(PropertyException::class);
@@ -444,9 +414,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->_call('addAdditionalPropertyPathsFromHook', '', 'standard', $input, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addAdditionalPropertyPathsFromHookThrowsExceptionIfFormElementTypeDoesNotMatch(): void
     {
         $this->expectException(PropertyException::class);
@@ -466,9 +434,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->_call('addAdditionalPropertyPathsFromHook', '', 'standard', $input, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addAdditionalPropertyPathsFromHookThrowsExceptionIfPropertyCollectionNameIsInvalid(): void
     {
         $this->expectException(PropertyException::class);
@@ -488,9 +454,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         $configurationService->_call('addAdditionalPropertyPathsFromHook', '', 'standard', $input, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addAdditionalPropertyPathsFromHookAddPaths(): void
     {
         $configurationService = $this->getAccessibleMock(
@@ -547,10 +511,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     * @dataProvider buildFormDefinitionValidationConfigurationFromFormEditorSetupDataProvider
-     */
+    #[DataProvider('buildFormDefinitionValidationConfigurationFromFormEditorSetupDataProvider')]
+    #[Test]
     public function buildFormDefinitionValidationConfigurationFromFormEditorSetup(array $configuration, array $expected): void
     {
         $configurationService = $this->getAccessibleMock(
@@ -621,10 +583,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider formElementPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetupDataProvider
-     */
+    #[DataProvider('formElementPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetupDataProvider')]
+    #[Test]
     public function formElementPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
@@ -647,9 +607,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllowedValuesForFormElementPropertyFromFormEditorSetupThrowsExceptionIfNoLimitedAllowedValuesAreAvailable(): void
     {
         $this->expectException(PropertyException::class);
@@ -696,10 +654,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getAllowedValuesForFormElementPropertyFromFormEditorSetupDataProvider
-     */
+    #[DataProvider('getAllowedValuesForFormElementPropertyFromFormEditorSetupDataProvider')]
+    #[Test]
     public function getAllowedValuesForFormElementPropertyFromFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
@@ -753,10 +709,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider propertyCollectionPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetupDataProvider
-     */
+    #[DataProvider('propertyCollectionPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetupDataProvider')]
+    #[Test]
     public function propertyCollectionPropertyHasLimitedAllowedValuesDefinedWithinFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
@@ -779,9 +733,7 @@ final class ConfigurationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAllowedValuesForPropertyCollectionPropertyFromFormEditorSetupThrowsExceptionIfNoLimitedAllowedValuesAreAvailable(): void
     {
         $this->expectException(PropertyException::class);
@@ -828,10 +780,8 @@ final class ConfigurationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getAllowedValuesForPropertyCollectionPropertyFromFormEditorSetupDataProvider
-     */
+    #[DataProvider('getAllowedValuesForPropertyCollectionPropertyFromFormEditorSetupDataProvider')]
+    #[Test]
     public function getAllowedValuesForPropertyCollectionPropertyFromFormEditorSetup(
         array $configuration,
         ValidationDto $validationDto,
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidatorTest.php b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidatorTest.php
index 172944c955f9ae4576fbce6eadde04f741863d5b..44e913d669840783415dd99bd4a4e73774834a15 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidatorTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatableFormElementPropertiesValidatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Configuration\FormDefinition\Validators;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Configuration\ConfigurationService;
 use TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException;
 use TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\CreatableFormElementPropertiesValidator;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CreatableFormElementPropertiesValidatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validateFormElementPredefinedDefaultValueThrowsExceptionIfValueDoesNotMatch(): void
     {
         $this->expectException(PropertyException::class);
@@ -52,9 +52,7 @@ final class CreatableFormElementPropertiesValidatorTest extends UnitTestCase
         $typeConverter($input, '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateFormElementPredefinedDefaultValueThrowsNoExceptionIfValueMatches(): void
     {
         $validationDto = new ValidationDto(null, null, 'test-1', 'label');
@@ -107,10 +105,8 @@ final class CreatableFormElementPropertiesValidatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateFormElementValueThrowsExceptionIfValueDoesNotMatchDataProvider
-     */
+    #[DataProvider('validateFormElementValueThrowsExceptionIfValueDoesNotMatchDataProvider')]
+    #[Test]
     public function validateFormElementValueThrowsExceptionIfValueDoesNotMatch($input, array $allowedValues, array $untranslatedAllowedValues): void
     {
         $this->expectException(PropertyException::class);
@@ -171,10 +167,8 @@ final class CreatableFormElementPropertiesValidatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateFormElementValueThrowsNoExceptionIfValueMatchesDataProvider
-     */
+    #[DataProvider('validateFormElementValueThrowsNoExceptionIfValueMatchesDataProvider')]
+    #[Test]
     public function validateFormElementValueThrowsNoExceptionIfValueMatches($input, array $allowedValues, array $untranslatedAllowedValues, array $allPossibleAllowedValuesTranslations): void
     {
         $validationDto = new ValidationDto('standard', null, 'test-1', 'label');
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidatorTest.php b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidatorTest.php
index 7e10e6202eb81eb9ad5ceddb564fb659b8a7468a..0d02e41030207ebcc7007ce92acc774eb515a70d 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidatorTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinition/Validators/CreatablePropertyCollectionElementPropertiesValidatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Configuration\FormDefinition\Validators;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Configuration\ConfigurationService;
 use TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException;
 use TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Validators\CreatablePropertyCollectionElementPropertiesValidator;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CreatablePropertyCollectionElementPropertiesValidatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validatePropertyCollectionElementPredefinedDefaultValueThrowsExceptionIfValueDoesNotMatch(): void
     {
         $this->expectException(PropertyException::class);
@@ -49,9 +49,7 @@ final class CreatablePropertyCollectionElementPropertiesValidatorTest extends Un
         $typeConverter->_call('validatePropertyCollectionElementPredefinedDefaultValue', $input, $validationDto);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validatePropertyCollectionElementPredefinedDefaultValueThrowsNoExceptionIfValueMatches(): void
     {
         $validationDto = new ValidationDto(null, null, 'test-1', 'label', 'validators', 'StringLength');
@@ -98,10 +96,8 @@ final class CreatablePropertyCollectionElementPropertiesValidatorTest extends Un
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validatePropertyCollectionPropertyValueThrowsExceptionIfValueDoesNotMatchDataProvider
-     */
+    #[DataProvider('validatePropertyCollectionPropertyValueThrowsExceptionIfValueDoesNotMatchDataProvider')]
+    #[Test]
     public function validatePropertyCollectionPropertyValueThrowsExceptionIfValueDoesNotMatch($input, array $allowedValues, array $untranslatedAllowedValues): void
     {
         $this->expectException(PropertyException::class);
@@ -162,10 +158,8 @@ final class CreatablePropertyCollectionElementPropertiesValidatorTest extends Un
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validatePropertyCollectionPropertyValueThrowsNoExceptionIfValueMatchesDataProvider
-     */
+    #[DataProvider('validatePropertyCollectionPropertyValueThrowsNoExceptionIfValueMatchesDataProvider')]
+    #[Test]
     public function validatePropertyCollectionPropertyValueThrowsNoExceptionIfValueMatches($input, array $allowedValues, array $untranslatedAllowedValues, array $allPossibleAllowedValuesTranslations): void
     {
         $validationDto = new ValidationDto('standard', null, 'test-1', 'label', 'validators', 'StringLength');
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionConversionServiceTest.php b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionConversionServiceTest.php
index f45864c60463223103e2e918ed3e742141718652..e285a576cd530d2447cc18cb20334a2ca8519c1a 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionConversionServiceTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionConversionServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Form\Domain\Configuration\FormDefinitionConversionService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -25,9 +26,7 @@ final class FormDefinitionConversionServiceTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addHmacDataAddsHmacHashes(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
@@ -130,9 +129,7 @@ final class FormDefinitionConversionServiceTest extends UnitTestCase
         self::assertSame($expected, $data);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeHmacDataRemoveHmacs(): void
     {
         $formDefinitionConversionService = new FormDefinitionConversionService();
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionValidationServiceTest.php b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionValidationServiceTest.php
index 3554fa39e7d5ccb4f6c06af61bf1d03bd1f3074e..00d5cb672dc660761403d816e9ad0830f15e7027 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionValidationServiceTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Configuration/FormDefinitionValidationServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Configuration;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Form\Domain\Configuration\ConfigurationService;
 use TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException;
@@ -38,9 +40,7 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAllFormElementPropertyValuesByHmacThrowsExceptionIfHmacIsInvalid(): void
     {
         $this->expectException(PropertyException::class);
@@ -66,9 +66,7 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         $typeConverter->_call('validateAllFormElementPropertyValuesByHmac', $input, $sessionToken, $validationDto);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAllFormElementPropertyValuesByHmacThrowsExceptionIfHmacDoesNotExists(): void
     {
         $this->expectException(PropertyException::class);
@@ -90,9 +88,7 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         $typeConverter->_call('validateAllFormElementPropertyValuesByHmac', $input, $sessionToken, $validationDto);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAllFormElementPropertyValuesByHmacThrowsNoExceptionIfHmacIsValid(): void
     {
         $typeConverter = $this->getAccessibleMock(FormDefinitionValidationService::class, null, [], '', false);
@@ -126,9 +122,7 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         self::assertFalse($failed);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAllPropertyCollectionElementValuesByHmacThrowsExceptionIfHmacIsInvalid(): void
     {
         $this->expectException(PropertyException::class);
@@ -166,9 +160,7 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAllPropertyCollectionElementValuesByHmacThrowsExceptionIfHmacDoesNotExists(): void
     {
         $this->expectException(PropertyException::class);
@@ -202,9 +194,7 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateAllPropertyCollectionElementValuesByHmacThrowsNoExceptionIfHmacIsValid(): void
     {
         $typeConverter = $this->getAccessibleMock(FormDefinitionValidationService::class, null, [], '', false);
@@ -382,10 +372,8 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateAllPropertyValuesFromCreatableFormElementDataProvider
-     */
+    #[DataProvider('validateAllPropertyValuesFromCreatableFormElementDataProvider')]
+    #[Test]
     public function validateAllPropertyValuesFromCreatableFormElement(
         array $mockConfiguration,
         array $formElement,
@@ -560,10 +548,8 @@ final class FormDefinitionValidationServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider validateAllPropertyValuesFromCreatablePropertyCollectionElementDataProvider
-     */
+    #[DataProvider('validateAllPropertyValuesFromCreatablePropertyCollectionElementDataProvider')]
+    #[Test]
     public function validateAllPropertyValuesFromCreatablePropertyCollectionElement(
         array $mockConfiguration,
         array $formElement,
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Factory/ArrayFormFactoryTest.php b/typo3/sysext/form/Tests/Unit/Domain/Factory/ArrayFormFactoryTest.php
index f8b8673367aacc93c45cfbcc43f126cb6c7317e8..7b6f0ba768545a16e78b2ae84dd91019bce0c681 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Factory/ArrayFormFactoryTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Factory/ArrayFormFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Factory;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Exception\IdentifierNotValidException;
 use TYPO3\CMS\Form\Domain\Factory\ArrayFormFactory;
 use TYPO3\CMS\Form\Domain\Model\FormElements\Section;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ArrayFormFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addNestedRenderableThrowsExceptionIfIdentifierIsMissing(): void
     {
         $this->expectException(IdentifierNotValidException::class);
@@ -39,9 +38,7 @@ final class ArrayFormFactoryTest extends UnitTestCase
         $arrayFormFactory->_call('addNestedRenderable', [], $section);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addNestedRenderableSkipChildElementRenderingIfCompositeElementIsUnknown(): void
     {
         $unknownElement = new UnknownFormElement('test-2', 'test');
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Finishers/AbstractFinisherTest.php b/typo3/sysext/form/Tests/Unit/Domain/Finishers/AbstractFinisherTest.php
index f4dc488fccfd0b7751a717cec7fd1059218c223d..03fa36d93633cc803bf31d1ea4f6c9dada9d3c77 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Finishers/AbstractFinisherTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Finishers/AbstractFinisherTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Finishers;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher;
 use TYPO3\CMS\Form\Domain\Finishers\Exception\FinisherException;
 use TYPO3\CMS\Form\Domain\Finishers\FinisherContext;
@@ -28,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractFinisherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function parseOptionReturnsNullIfOptionNameIsTranslation(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -43,9 +42,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertNull($mockAbstractFinisher->_call('parseOption', 'translation'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseOptionReturnsNullIfOptionNameNotExistsWithinOptions(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -60,9 +57,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertNull($mockAbstractFinisher->_call('parseOption', 'foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseOptionReturnsNullIfOptionNameNotExistsWithinDefaultOptions(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -77,9 +72,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertNull($mockAbstractFinisher->_call('parseOption', 'foo'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseOptionReturnsBoolOptionValuesAsBool(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -96,9 +89,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertFalse($mockAbstractFinisher->_call('parseOption', 'foo1'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseOptionReturnsDefaultOptionValueIfOptionNameNotExistsWithinOptionsButWithinDefaultOptions(): void
     {
         $expected = 'defaultValue';
@@ -139,9 +130,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('parseOption', 'subject'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseOptionReturnsDefaultOptionValueIfOptionValueIsAFormElementReferenceAndTheFormElementValueIsEmpty(): void
     {
         $elementIdentifier = 'element-identifier-1';
@@ -183,9 +172,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('parseOption', 'subject'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function parseOptionResolvesFormElementReferenceFromTranslation(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -228,9 +215,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('parseOption', 'subject'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsArrayIfInputIsArray(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -248,9 +233,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsStringIfInputIsString(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -268,9 +251,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsValueFromFormRuntimeIfInputReferenceAFormElementIdentifierWhoseValueIsAString(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -291,9 +272,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsValueFromFormRuntimeIfInputReferenceMultipleFormElementIdentifierWhoseValueIsAString(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -324,9 +303,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsValueFromFormRuntimeIfInputReferenceAFormElementIdentifierWhoseValueIsAnArray(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -347,9 +324,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsValueFromFormRuntimeIfInputIsArrayAndSomeItemsReferenceAFormElementIdentifierWhoseValueIsAnArray(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -396,9 +371,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsNoReplacedValueIfInputReferenceANonExistingFormElement(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -423,9 +396,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsTimestampIfInputIsATimestampRequestTrigger(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -446,9 +417,7 @@ final class AbstractFinisherTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesReturnsResolvesElementIdentifiersInArrayKeys(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
@@ -489,9 +458,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame($expected, $mockAbstractFinisher->_call('substituteRuntimeReferences', $input, $formRuntimeMock));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesConvertsObjectsToString(): void
     {
         $date = new \DateTime('@1574415600');
@@ -527,9 +494,7 @@ final class AbstractFinisherTest extends UnitTestCase
         self::assertSame('When: 2019-11-22', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesThrowsExceptionOnObjectWithoutStringableElement(): void
     {
         $formRuntimeMock = $this->createMock(FormRuntime::class);
@@ -556,9 +521,7 @@ final class AbstractFinisherTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function substituteRuntimeReferencesThrowsExceptionOnMultipleVariablesResolvedAsArray(): void
     {
         $mockAbstractFinisher = $this->getAccessibleMockForAbstractClass(
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Finishers/ClosureFinisherTest.php b/typo3/sysext/form/Tests/Unit/Domain/Finishers/ClosureFinisherTest.php
index 12cf552d74a4da55861f38f60f9ee3240d46cf65..2a1d935a0f7d8ad01d7607714e41ad77dfd423b4 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Finishers/ClosureFinisherTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Finishers/ClosureFinisherTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Finishers;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Finishers\ClosureFinisher;
 use TYPO3\CMS\Form\Domain\Finishers\FinisherContext;
 use TYPO3\CMS\Form\Domain\Runtime\FormRuntime;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ClosureFinisherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function closureOptionForFinisherCanBeSetAndIsFunctional(): void
     {
         $closure = static function (FinisherContext $finisherContext) {
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Finishers/RedirectFinisherTest.php b/typo3/sysext/form/Tests/Unit/Domain/Finishers/RedirectFinisherTest.php
index 5894e283d7a04efbe40dbd9cc7435e72b2f2679f..ecda73cfc2917bee6fd9880d2eb0d2f643a7ee02 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Finishers/RedirectFinisherTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Finishers/RedirectFinisherTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Finishers;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\PropagateResponseException;
 use TYPO3\CMS\Core\Http\Response;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -36,10 +38,10 @@ final class RedirectFinisherTest extends UnitTestCase
     protected bool $resetSingletonInstances = true;
 
     /**
-     * @test
-     * @dataProvider pageUidOptionForFinisherAcceptsVariousPageRepresentationsDataProvider
      * @param string|int|null $pageUid
      */
+    #[DataProvider('pageUidOptionForFinisherAcceptsVariousPageRepresentationsDataProvider')]
+    #[Test]
     public function pageUidOptionForFinisherAcceptsVariousPageRepresentations($pageUid, int $expectedPage): void
     {
         $uriPrefix = 'https://site.test/?id=';
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Finishers/SaveToDatabaseFinisherTest.php b/typo3/sysext/form/Tests/Unit/Domain/Finishers/SaveToDatabaseFinisherTest.php
index db6429a3c3b7385874865c8ee283652ce1909a16..40590d072a373ac70c8af862fd971895fc75118d 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Finishers/SaveToDatabaseFinisherTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Finishers/SaveToDatabaseFinisherTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Finishers;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Finishers\Exception\FinisherException;
 use TYPO3\CMS\Form\Domain\Finishers\FinisherContext;
 use TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher;
@@ -25,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SaveToDatabaseFinisherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function throwExceptionOnInconsistentConfigurationThrowsExceptionOnInconsistentConfiguration(): void
     {
         $this->expectException(FinisherException::class);
@@ -40,9 +40,7 @@ final class SaveToDatabaseFinisherTest extends UnitTestCase
         $mockSaveToDatabaseFinisher->_call('throwExceptionOnInconsistentConfiguration');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareDataConvertsArrayValuesToCsv(): void
     {
         $elementsConfiguration = [
@@ -64,9 +62,7 @@ final class SaveToDatabaseFinisherTest extends UnitTestCase
         self::assertSame('one,two', $databaseData['bar']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function executeInternalProcessesSingleTable(): void
     {
         $saveToDatabaseFinisher = $this->getMockBuilder(SaveToDatabaseFinisher::class)
@@ -115,10 +111,10 @@ final class SaveToDatabaseFinisherTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider skipIfValueIsEmptyDataProvider
      * @param mixed $value
      */
+    #[DataProvider('skipIfValueIsEmptyDataProvider')]
+    #[Test]
     public function skipIfValueIsEmptyDetectsEmptyValues($value, bool $expectedEmpty): void
     {
         $elementsConfiguration = [
@@ -138,9 +134,7 @@ final class SaveToDatabaseFinisherTest extends UnitTestCase
         self::assertSame($expectedEmpty, empty($databaseData));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function executeInternalProcessesMultipleTables(): void
     {
         $saveToDatabaseFinisher = $this->getMockBuilder(SaveToDatabaseFinisher::class)->onlyMethods(['process'])->getMock();
@@ -162,9 +156,7 @@ final class SaveToDatabaseFinisherTest extends UnitTestCase
         $saveToDatabaseFinisher->execute($this->createMock(FinisherContext::class));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareDataConvertsDateTimeToUnixTimestamp(): void
     {
         $elementsConfiguration = [
@@ -184,9 +176,7 @@ final class SaveToDatabaseFinisherTest extends UnitTestCase
         self::assertMatchesRegularExpression($expected, $databaseData['date']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function prepareDataConvertsDateTimeToFormat(): void
     {
         $elementsConfiguration = [
diff --git a/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractFormElementTest.php b/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractFormElementTest.php
index 8527340a444dc888476a34d07f34d3030d26c725..60afefc9df6ebaaaa1d154de0a5c1298747e756b 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractFormElementTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractFormElementTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\FormElements;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Form\Domain\Exception\IdentifierNotValidException;
 use TYPO3\CMS\Form\Domain\Model\FormDefinition;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractFormElementTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function newInstanceHasNoProperties(): void
     {
         $subject = new TestingFormElement();
@@ -36,9 +35,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertCount(0, $subject->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSimpleProperties(): void
     {
         $subject = new TestingFormElement();
@@ -54,9 +51,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertEquals('qax', $properties['buz']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideProperties(): void
     {
         $subject = new TestingFormElement();
@@ -70,9 +65,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertEquals('buz', $properties['foo']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setArrayProperties(): void
     {
         $subject = new TestingFormElement();
@@ -90,9 +83,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertEquals('baz', $properties['foo']['bar']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyUnsetIfValueIsNull(): void
     {
         $subject = new TestingFormElement();
@@ -105,9 +96,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertSame($expected, $subject->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyUnsetIfValueIsArrayWithSomeNullVales(): void
     {
         $subject = new TestingFormElement();
@@ -127,9 +116,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertSame($expected, $subject->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionWhenIdentifierIsEmpty(): void
     {
         $this->expectException(IdentifierNotValidException::class);
@@ -139,9 +126,7 @@ final class AbstractFormElementTest extends UnitTestCase
         new GenericFormElement('', 'a_type');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructMustNotThrowExceptionWhenIdentifierIsNonEmptyString(): void
     {
         $formElement = new TestingFormElement();
@@ -149,9 +134,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertInstanceOf(TestingFormElement::class, $formElement);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeFormElementExpectedCallInitializeFormObjectHooks(): void
     {
         $formElement = new TestingFormElement();
@@ -172,9 +155,7 @@ final class AbstractFormElementTest extends UnitTestCase
         $formElement->initializeFormElement();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUniqueIdentifierExpectedUnique(): void
     {
         $formDefinition1 = $this->createMock(FormDefinition::class);
@@ -199,9 +180,7 @@ final class AbstractFormElementTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDefaultValueSetStringValueIfKeyDoesNotExists(): void
     {
         $formDefinitionMock = $this->getAccessibleMock(FormDefinition::class, null, [], '', false);
@@ -216,9 +195,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertSame($expected, $formElement->getDefaultValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDefaultValueSetArrayValueIfKeyDoesNotExists(): void
     {
         $formDefinitionMock = $this->getAccessibleMock(FormDefinition::class, null, [], '', false);
@@ -233,9 +210,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertSame($expected, $formElement->getDefaultValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDefaultValueUnsetIfValueIsArrayWithSomeNullVales(): void
     {
         $formDefinitionMock = $this->getAccessibleMock(FormDefinition::class, null, [], '', false);
@@ -273,9 +248,7 @@ final class AbstractFormElementTest extends UnitTestCase
         self::assertSame($expected, $formElement->getDefaultValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setDefaultValueAddValueIfValueIsArray(): void
     {
         $formDefinitionMock = $this->getAccessibleMock(FormDefinition::class, null, [], '', false);
diff --git a/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractSectionTest.php b/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractSectionTest.php
index 6d4618c66a200779a873513bd9b2c09212e5c0be..1bfaed1c3cff6f3b98e0d793d9030f31718452c3 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractSectionTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/FormElements/AbstractSectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\FormElements;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Form\Domain\Exception\IdentifierNotValidException;
 use TYPO3\CMS\Form\Domain\Exception\TypeDefinitionNotFoundException;
@@ -33,9 +34,7 @@ final class AbstractSectionTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructThrowsExceptionWhenIdentifierIsEmpty(): void
     {
         $this->expectException(IdentifierNotValidException::class);
@@ -45,18 +44,14 @@ final class AbstractSectionTest extends UnitTestCase
         new Section('', 'foobar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructMustNotThrowExceptionWhenIdentifierIsNonEmptyString(): void
     {
         $section = new Section('foobar', 'foobar');
         self::assertInstanceOf(AbstractSection::class, $section);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createElementThrowsExceptionIfTypeDefinitionNotFoundAndSkipUnknownElementsIsFalse(): void
     {
         $rootForm = $this->getMockBuilder(FormDefinition::class)
@@ -93,9 +88,7 @@ final class AbstractSectionTest extends UnitTestCase
         $mockAbstractSection->_call('createElement', '', '');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createElementReturnsUnknownElementsIfTypeDefinitionIsNotFoundAndSkipUnknownElementsIsTrue(): void
     {
         $rootForm = $this->getMockBuilder(FormDefinition::class)
@@ -118,9 +111,7 @@ final class AbstractSectionTest extends UnitTestCase
         self::assertSame('bar', $result->getType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createElementThrowsExceptionIfTypeDefinitionIsNotSet(): void
     {
         $rootForm = $this->getMockBuilder(FormDefinition::class)
@@ -141,9 +132,7 @@ final class AbstractSectionTest extends UnitTestCase
         $section->createElement('id', 'foobar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createElementThrowsExceptionIfTypeDefinitionNotInstanceOfFormElementInterface(): void
     {
         $this->resetSingletonInstances = true;
@@ -172,9 +161,7 @@ final class AbstractSectionTest extends UnitTestCase
         $section->createElement('id', 'foobar');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createElementExpectedToAddAndInitializeElement(): void
     {
         $implementationMock = $this->createPartialMock(TestingFormElement::class, ['setOptions', 'initializeFormElement']);
diff --git a/typo3/sysext/form/Tests/Unit/Domain/FormElements/SectionTest.php b/typo3/sysext/form/Tests/Unit/Domain/FormElements/SectionTest.php
index 6a2316302ad6cdd54df3b2900c49c308b7d63eb2..8706338a166eee101c067ef341dce9d28829c332 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/FormElements/SectionTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/FormElements/SectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\FormElements;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Domain\Model\FormElements\Section;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -36,27 +37,20 @@ final class SectionTest extends UnitTestCase
      */
     protected $sectionInstance;
 
-    /**
-     * @before
-     */
     public function setUp(): void
     {
         parent::setUp();
         $this->sectionInstance = new Section(self::$IDENTIFIER, self::$TYPE);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function newInstanceHasNoProperties(): void
     {
         self::assertNotNull($this->sectionInstance);
         self::assertCount(0, $this->sectionInstance->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setSimpleProperties(): void
     {
         $this->sectionInstance->setProperty('foo', 'bar');
@@ -70,9 +64,7 @@ final class SectionTest extends UnitTestCase
         self::assertEquals('qax', $properties['buz']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideProperties(): void
     {
         $this->sectionInstance->setProperty('foo', 'bar');
@@ -84,9 +76,7 @@ final class SectionTest extends UnitTestCase
         self::assertEquals('buz', $properties['foo']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setArrayProperties(): void
     {
         $this->sectionInstance->setProperty('foo', ['bar' => 'baz', 'bla' => 'blubb']);
@@ -102,9 +92,7 @@ final class SectionTest extends UnitTestCase
         self::assertEquals('baz', $properties['foo']['bar']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyUnsetIfValueIsNull(): void
     {
         $expected = ['foo-1' => ['bar-1' => 'foo-2']];
@@ -115,9 +103,7 @@ final class SectionTest extends UnitTestCase
         self::assertSame($expected, $this->sectionInstance->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setPropertyUnsetIfValueIsArrayWithSomeNullVales(): void
     {
         $expected = [
@@ -135,9 +121,7 @@ final class SectionTest extends UnitTestCase
         self::assertSame($expected, $this->sectionInstance->getProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionSetStringValueIfKeyDoesNotExists(): void
     {
         $expected = ['foo' => 'bar'];
@@ -146,9 +130,7 @@ final class SectionTest extends UnitTestCase
         self::assertSame($expected, $this->sectionInstance->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionSetArrayValueIfKeyDoesNotExists(): void
     {
         $expected = ['foo-1' => ['bar' => 'foo-2']];
@@ -157,9 +139,7 @@ final class SectionTest extends UnitTestCase
         self::assertSame($expected, $this->sectionInstance->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionUnsetIfValueIsNull(): void
     {
         $expected = ['foo-1' => ['bar-1' => 'foo-2']];
@@ -170,9 +150,7 @@ final class SectionTest extends UnitTestCase
         self::assertSame($expected, $this->sectionInstance->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionUnsetIfValueIsArrayWithSomeNullVales(): void
     {
         $expected = [
@@ -190,9 +168,7 @@ final class SectionTest extends UnitTestCase
         self::assertSame($expected, $this->sectionInstance->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionAddValueIfValueIsArray(): void
     {
         $expected = [
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Renderable/AbstractRenderableTest.php b/typo3/sysext/form/Tests/Unit/Domain/Renderable/AbstractRenderableTest.php
index b2081bd3ea60cac97f3ee46533c4bf860ee72ecd..656a4efe42f161693b90d562998045e2cfa6ab2f 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Renderable/AbstractRenderableTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Renderable/AbstractRenderableTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Renderable;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Tests\Unit\Domain\Renderable\Fixtures\TestingRenderable;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractRenderableTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionSetStringValueIfKeyDoesNotExists(): void
     {
         $renderable = new TestingRenderable();
@@ -35,9 +34,7 @@ final class AbstractRenderableTest extends UnitTestCase
         self::assertSame($expected, $renderable->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionSetArrayValueIfKeyDoesNotExists(): void
     {
         $renderable = new TestingRenderable();
@@ -48,9 +45,7 @@ final class AbstractRenderableTest extends UnitTestCase
         self::assertSame($expected, $renderable->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionUnsetIfValueIsNull(): void
     {
         $renderable = new TestingRenderable();
@@ -63,9 +58,7 @@ final class AbstractRenderableTest extends UnitTestCase
         self::assertSame($expected, $renderable->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionUnsetIfValueIsArrayWithSomeNullVales(): void
     {
         $renderable = new TestingRenderable();
@@ -85,9 +78,7 @@ final class AbstractRenderableTest extends UnitTestCase
         self::assertSame($expected, $renderable->getRenderingOptions());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setRenderingOptionAddValueIfValueIsArray(): void
     {
         $renderable = new TestingRenderable();
diff --git a/typo3/sysext/form/Tests/Unit/Domain/Renderable/RenderableVariantTest.php b/typo3/sysext/form/Tests/Unit/Domain/Renderable/RenderableVariantTest.php
index d65b26d23b0c9bd9c45b09ccddebbd22ef726419..4c045a6dd2855c37e9454a31240f03d7e683f2e4 100644
--- a/typo3/sysext/form/Tests/Unit/Domain/Renderable/RenderableVariantTest.php
+++ b/typo3/sysext/form/Tests/Unit/Domain/Renderable/RenderableVariantTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Domain\Renderable;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\ExpressionLanguage\Resolver;
 use TYPO3\CMS\Form\Domain\Model\FormElements\GenericFormElement;
 use TYPO3\CMS\Form\Domain\Model\Renderable\RenderableVariant;
@@ -26,9 +27,7 @@ final class RenderableVariantTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function formVariantOverridesArrayValues(): void
     {
         $formElementIdentifier = 'form-element-identifier';
@@ -74,9 +73,7 @@ final class RenderableVariantTest extends UnitTestCase
         self::assertEquals($expected, $mockFormElement->_get('properties'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderableIsPassedToConditionEvaluation(): void
     {
         $mockFormElement = $this->getAccessibleMock(GenericFormElement::class, null, [], '', false);
diff --git a/typo3/sysext/form/Tests/Unit/EventListener/DataStructureIdentifierListenerTest.php b/typo3/sysext/form/Tests/Unit/EventListener/DataStructureIdentifierListenerTest.php
index 489d0e49c2d4a5bfd34fa407cf3702f2ef23ff51..d78283bcfe926e054da83378775e9b57fedff052 100644
--- a/typo3/sysext/form/Tests/Unit/EventListener/DataStructureIdentifierListenerTest.php
+++ b/typo3/sysext/form/Tests/Unit/EventListener/DataStructureIdentifierListenerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\EventListener;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureIdentifierInitializedEvent;
@@ -40,9 +42,7 @@ final class DataStructureIdentifierListenerTest extends UnitTestCase
         $GLOBALS['LANG'] = $this->createMock(LanguageService::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function modifyIdentifiersReturnsIdentifierForNotMatchingScenario(): void
     {
         $givenIdentifier = ['aKey' => 'aValue'];
@@ -60,9 +60,7 @@ final class DataStructureIdentifierListenerTest extends UnitTestCase
         self::assertSame($givenIdentifier, $event->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function modifyIdentifiersAddDefaultValuesForNewRecord(): void
     {
         $event = new AfterFlexFormDataStructureIdentifierInitializedEvent(
@@ -81,9 +79,7 @@ final class DataStructureIdentifierListenerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function modifyIdentifiersAddsGivenPersistenceIdentifier(): void
     {
         $row = [
@@ -124,9 +120,7 @@ final class DataStructureIdentifierListenerTest extends UnitTestCase
         self::assertEquals($expected, $event->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function modifyIdentifiersAddsOverrideFinisherValue(): void
     {
         $row = [
@@ -163,9 +157,7 @@ final class DataStructureIdentifierListenerTest extends UnitTestCase
         self::assertEquals($expected, $event->getIdentifier());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function modifyDataStructureReturnsDataStructureUnchanged(): void
     {
         $dataStructure = ['foo' => 'bar'];
@@ -181,10 +173,8 @@ final class DataStructureIdentifierListenerTest extends UnitTestCase
         self::assertEquals($expected, $event->getDataStructure());
     }
 
-    /**
-     * @test
-     * @dataProvider modifyDataStructureDataProvider
-     */
+    #[DataProvider('modifyDataStructureDataProvider')]
+    #[Test]
     public function modifyDataStructureAddsExistingFormItems(array $formDefinition, array $expectedItem): void
     {
         $formPersistenceManagerMock = $this->createMock(FormPersistenceManagerInterface::class);
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/ConfigurationManagerTest.php b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/ConfigurationManagerTest.php
index 7cf0872fdec951759f62276db142f819b2dd5ba2..9e4ddc069a07dfc80bf296ec8b4cde9c0441ceb0 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/ConfigurationManagerTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/ConfigurationManagerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -36,9 +37,7 @@ final class ConfigurationManagerTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getConfigurationDoesNotEvaluateTypoScriptLookalikeInstructionsFromYamlSettingsInFrontendContext(): void
     {
         $yamlSettings = [
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/InheritancesResolverServiceTest.php b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/InheritancesResolverServiceTest.php
index ed27e23b4147ee7a68a002a77b5d221230501824..020e0cd462cef57bdfc9d0e45114b55a78a7c0cf 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/InheritancesResolverServiceTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/InheritancesResolverServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Mvc\Configuration\Exception\CycleInheritancesException;
 use TYPO3\CMS\Form\Mvc\Configuration\InheritancesResolverService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -34,10 +35,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         $this->subject = new InheritancesResolverService();
     }
 
-    /**
-     * @test
-     * Test for the explicit example in service class comment
-     */
+    #[Test]
     public function getDocExampleInheritance(): void
     {
         $input = [
@@ -74,9 +72,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         self::assertSame($expected, $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMergedConfigurationSimpleInheritance(): void
     {
         $input = [
@@ -115,9 +111,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         self::assertSame($expected, $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMergedConfigurationSimpleInheritanceOverrideValue(): void
     {
         $input = [
@@ -148,9 +142,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         self::assertSame($expected, $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMergedConfigurationSimpleInheritanceRemoveValue(): void
     {
         $input = [
@@ -213,9 +205,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         self::assertSame($expected, $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMergedConfigurationSimpleMixin(): void
     {
         $input = [
@@ -257,9 +247,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         self::assertSame($expected, $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMergedConfigurationAdvancedMixin(): void
     {
         $input = [
@@ -350,9 +338,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         self::assertSame($expected, $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMergedConfigurationResolvesInheritancesWithAndWithoutVendorNamespacePrefix(): void
     {
         $input = [
@@ -439,9 +425,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         self::assertSame($expected, $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getResolvedConfigurationThrowsExceptionIfCycleDependenciesOnSameLevelIsFound(): void
     {
         $input = [
@@ -463,9 +447,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getResolvedConfigurationThrowsExceptionIfCycleDependenciesOnSameLevelWithGapIsFound(): void
     {
         $input = [
@@ -497,9 +479,7 @@ final class InheritancesResolverServiceTest extends UnitTestCase
         $this->subject->reset()->setReferenceConfiguration($input)->getResolvedConfiguration();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getResolvedConfigurationThrowsExceptionIfCycleDependenciesOnHigherLevelIsFound(): void
     {
         $input = [
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/TypoScriptServiceTest.php b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/TypoScriptServiceTest.php
index dda3e13155553fd86257e0783229725a65283b96..32fe8dad801962d12ec95593f104ced81653153c 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/TypoScriptServiceTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/TypoScriptServiceTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\Mvc\Configuration\TypoScriptService;
 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TypoScriptServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function resolveTypoScriptConfigurationReturnsResolvedConfiguration(): void
     {
         $mockTypoScriptService = $this->getAccessibleMock(TypoScriptService::class, [
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/YamlSourceTest.php b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/YamlSourceTest.php
index e936d04132cab4857a2ce0c8fa5e50a1ec040aba..eccbc535d5d257c7c16339ad21a35deca163403a 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/Configuration/YamlSourceTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/Configuration/YamlSourceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc\Configuration;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Form\Mvc\Configuration\Exception\ParseErrorException;
 use TYPO3\CMS\Form\Mvc\Configuration\YamlSource;
@@ -26,9 +27,7 @@ final class YamlSourceTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadThrowsExceptionIfFileToLoadNotExists(): void
     {
         $this->expectException(ParseErrorException::class);
@@ -43,9 +42,7 @@ final class YamlSourceTest extends UnitTestCase
         $mockYamlSource->_call('load', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadThrowsExceptionIfFileToLoadIsNotValidYamlUseSymfonyParser(): void
     {
         $this->expectException(ParseErrorException::class);
@@ -60,9 +57,7 @@ final class YamlSourceTest extends UnitTestCase
         $mockYamlSource->_call('load', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getHeaderFromFileReturnsHeaderPart(): void
     {
         $mockYamlSource = $this->getAccessibleMock(YamlSource::class, null, [], '', false);
@@ -76,9 +71,7 @@ final class YamlSourceTest extends UnitTestCase
         self::assertSame($expected, $mockYamlSource->_call('getHeaderFromFile', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadOverruleNonArrayValuesOverArrayValues(): void
     {
         $mockYamlSource = $this->getAccessibleMock(YamlSource::class, null, [], '', false);
@@ -98,9 +91,7 @@ final class YamlSourceTest extends UnitTestCase
         self::assertSame($expected, $mockYamlSource->_call('load', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadRemovesVendorNamespacePrefixFromConfiguration(): void
     {
         $mockYamlSource = $this->getAccessibleMock(YamlSource::class, null, [], '', false);
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/Persistence/FormPersistenceManagerTest.php b/typo3/sysext/form/Tests/Unit/Mvc/Persistence/FormPersistenceManagerTest.php
index 535b4d707876e1c4d91051320dd2e6f38aea0aad..eff0da56f6c4c5f58a257832a7796e6ec3413d40 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/Persistence/FormPersistenceManagerTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/Persistence/FormPersistenceManagerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc\Persistence;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\Folder;
@@ -32,9 +34,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FormPersistenceManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function loadThrowsExceptionIfPersistenceIdentifierHasNoYamlExtension(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -57,9 +57,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('load', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function loadThrowsExceptionIfPersistenceIdentifierIsAExtensionLocationWhichIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -88,9 +86,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('load', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function saveThrowsExceptionIfPersistenceIdentifierHasNoYamlExtension(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -102,9 +98,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('save', $input, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function saveThrowsExceptionIfPersistenceIdentifierIsAExtensionLocationAndSaveToExtensionLocationIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -122,9 +116,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('save', $input, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function saveThrowsExceptionIfPersistenceIdentifierIsAExtensionLocationWhichIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -154,9 +146,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('save', $input, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deleteThrowsExceptionIfPersistenceIdentifierHasNoYamlExtension(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -168,9 +158,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('delete', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deleteThrowsExceptionIfPersistenceIdentifierFileDoesNotExists(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -186,9 +174,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('delete', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deleteThrowsExceptionIfPersistenceIdentifierIsExtensionLocationAndDeleteFromExtensionLocationsIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -210,9 +196,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('delete', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deleteThrowsExceptionIfPersistenceIdentifierIsExtensionLocationWhichIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -246,9 +230,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('delete', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function deleteThrowsExceptionIfPersistenceIdentifierIsStorageLocationAndDeleteFromStorageIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -281,9 +263,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('delete', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsTrueIfPersistenceIdentifierIsExtensionLocationAndFileExistsAndFileHasYamlExtension(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, null, [], '', false);
@@ -311,9 +291,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertTrue($mockFormPersistenceManager->_call('exists', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsFalseIfPersistenceIdentifierIsExtensionLocationAndFileExistsAndFileHasNoYamlExtension(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, null, [], '', false);
@@ -321,9 +299,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertFalse($mockFormPersistenceManager->_call('exists', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsFalseIfPersistenceIdentifierIsExtensionLocationAndFileExistsAndExtensionLocationIsNotAllowed(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, null, [], '', false);
@@ -338,9 +314,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertFalse($mockFormPersistenceManager->_call('exists', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsFalseIfPersistenceIdentifierIsExtensionLocationAndFileNotExistsAndFileHasYamlExtension(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, null, [], '', false);
@@ -348,9 +322,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertFalse($mockFormPersistenceManager->_call('exists', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsTrueIfPersistenceIdentifierIsStorageLocationAndFileExistsAndFileHasYamlExtension(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['getStorageByUid'], [], '', false);
@@ -370,9 +342,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertTrue($mockFormPersistenceManager->_call('exists', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsFalseIfPersistenceIdentifierIsStorageLocationAndFileExistsAndFileNoYamlExtension(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['getStorageByUid'], [], '', false);
@@ -392,9 +362,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertFalse($mockFormPersistenceManager->_call('exists', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsFalseIfPersistenceIdentifierIsStorageLocationAndFileNotExistsAndFileHasYamlExtension(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['getStorageByUid'], [], '', false);
@@ -414,9 +382,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertFalse($mockFormPersistenceManager->_call('exists', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUniquePersistenceIdentifierAppendNumberIfPersistenceIdentifierExists(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['exists'], [], '', false);
@@ -436,9 +402,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertSame($expected, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUniquePersistenceIdentifierAppendTimestampIfPersistenceIdentifierExists(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['exists'], [], '', false);
@@ -468,9 +432,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         return $returnValues;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUniqueIdentifierThrowsExceptionIfIdentifierExists(): void
     {
         $this->expectException(NoUniqueIdentifierException::class);
@@ -486,9 +448,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('getUniqueIdentifier', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getUniqueIdentifierAppendTimestampIfIdentifierExists(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['checkForDuplicateIdentifier'], [], '', false);
@@ -507,9 +467,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertMatchesRegularExpression($expected, $returnValue);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkForDuplicateIdentifierReturnsTrueIfIdentifierIsUsed(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['listForms'], [], '', false);
@@ -527,9 +485,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertTrue($mockFormPersistenceManager->_call('checkForDuplicateIdentifier', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkForDuplicateIdentifierReturnsFalseIfIdentifierIsUsed(): void
     {
         $mockFormPersistenceManager = $this->getAccessibleMock(FormPersistenceManager::class, ['listForms'], [], '', false);
@@ -596,19 +552,15 @@ final class FormPersistenceManagerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider metaDataIsExtractedDataProvider
-     */
+    #[DataProvider('metaDataIsExtractedDataProvider')]
+    #[Test]
     public function metaDataIsExtracted(string $maybeRawFormDefinition, array $expectedMetaData): void
     {
         $formPersistenceManagerMock = $this->getAccessibleMock(FormPersistenceManager::class, null, [], '', false);
         self::assertSame($expectedMetaData, $formPersistenceManagerMock->_call('extractMetaDataFromCouldBeFormDefinition', $maybeRawFormDefinition));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideByTypoScriptSettingsReturnsNotOverriddenConfigurationIfNoTypoScriptOverridesExists(): void
     {
         $mockController = $this->getAccessibleMock(FormPersistenceManager::class, null, [], '', false);
@@ -660,9 +612,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('overrideByTypoScriptSettings', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideByTypoScriptSettingsReturnsOverriddenConfigurationIfTypoScriptOverridesExists(): void
     {
         $mockController = $this->getAccessibleMock(FormPersistenceManager::class, null, [], '', false);
@@ -732,9 +682,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertSame($expected, $mockController->_call('overrideByTypoScriptSettings', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function overrideByTypoScriptSettingsDoesNotEvaluateTypoScriptLookalikeInstructionsFromYamlSettings(): void
     {
         $formDefinitionYaml = [
@@ -828,9 +776,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         self::assertSame($expected, $controllerMock->_call('overrideByTypoScriptSettings', $formDefinitionYaml));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function retrieveFileByPersistenceIdentifierThrowsExceptionIfReadFromStorageIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -854,9 +800,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('retrieveFileByPersistenceIdentifier', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrCreateFileThrowsExceptionIfFolderNotExistsInStorage(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -882,9 +826,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('getOrCreateFile', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrCreateFileThrowsExceptionIfWriteToStorageIsNotAllowed(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -919,9 +861,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('getOrCreateFile', $input);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStorageByUidThrowsExceptionIfStorageNotExists(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -937,9 +877,7 @@ final class FormPersistenceManagerTest extends UnitTestCase
         $mockFormPersistenceManager->_call('getStorageByUid', -1);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStorageByUidThrowsExceptionIfStorageIsNotBrowsable(): void
     {
         $this->expectException(PersistenceManagerException::class);
@@ -1133,10 +1071,8 @@ final class FormPersistenceManagerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isAllowedPersistencePathReturnsPropperValuesDataProvider
-     */
+    #[DataProvider('isAllowedPersistencePathReturnsPropperValuesDataProvider')]
+    #[Test]
     public function isAllowedPersistencePathReturnsPropperValues(string $persistencePath, array $allowedExtensionPaths, array $allowedFileMounts, $expected): void
     {
         $formPersistenceManagerMock = $this->getAccessibleMock(FormPersistenceManager::class, ['getStorageByUid'], [], '', false);
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/ProcessingRuleTest.php b/typo3/sysext/form/Tests/Unit/Mvc/ProcessingRuleTest.php
index fa7293d61562728be9846f4c1a257dc68159d384..5f8701b7cff9e72fae1be2a381d8dd7763890d61 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/ProcessingRuleTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/ProcessingRuleTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Extbase\Property\PropertyMapper;
 use TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator;
 use TYPO3\CMS\Extbase\Validation\Validator\ConjunctionValidator;
@@ -28,9 +29,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ProcessingRuleTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function addValidatorAddsValidator(): void
     {
         $conjunctionValidator = new ConjunctionValidator();
@@ -46,9 +45,7 @@ final class ProcessingRuleTest extends UnitTestCase
         self::assertInstanceOf(AbstractValidator::class, $validators->current());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function removeAllRemovesAllValidators(): void
     {
         $conjunctionValidator = new ConjunctionValidator();
@@ -63,9 +60,7 @@ final class ProcessingRuleTest extends UnitTestCase
         self::assertCount(0, $subject->getValidators());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function filterValidatorRemovesValidatorsDependingOnClosure(): void
     {
         $conjunctionValidator = new ConjunctionValidator();
@@ -84,9 +79,7 @@ final class ProcessingRuleTest extends UnitTestCase
         self::assertInstanceOf(AnotherTestValidator::class, $validators->current());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processNoPropertyMappingReturnsNotModifiedValue(): void
     {
         $conjunctionValidator = new ConjunctionValidator();
@@ -98,9 +91,7 @@ final class ProcessingRuleTest extends UnitTestCase
         self::assertSame($input, $subject->process($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processNoPropertyMappingAndHasErrorsIfValidatorContainsErrors(): void
     {
         $conjunctionValidator = new ConjunctionValidator();
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/Property/PropertyMappingConfigurationTest.php b/typo3/sysext/form/Tests/Unit/Mvc/Property/PropertyMappingConfigurationTest.php
index 77c2d26b808cdb47e8c7a862eef3b354c9c057bb..760113a0d8a3a87b54e35452716f8b505141470e 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/Property/PropertyMappingConfigurationTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/Property/PropertyMappingConfigurationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc\Property;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -90,8 +91,8 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
 
     /**
      * A bare minimum test that checks if the function maybe potentially works.
-     * @test
      */
+    #[Test]
     public function afterBuildingFinishedAddsFileReferenceConverter(): void
     {
         // No validators
@@ -115,9 +116,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         $propertyMappingConfiguration->afterBuildingFinished($this->fileUpload);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function afterBuildingFinishedAddsMimeTypeConverter(): void
     {
         $mimeTypes = ['allowedMimeTypes' => ['text/plain', 'application/x-www-form-urlencoded']];
@@ -156,9 +155,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         $propertyMappingConfiguration->afterBuildingFinished($this->fileUpload);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function afterBuildingFinishedSetsUpStoragePathToPropertySaveToFileMountIfItExists(): void
     {
         $resourceFactory = $this->createMock(ResourceFactory::class);
@@ -190,9 +187,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         $this->propertyMappingConfiguration->afterBuildingFinished($this->fileUpload);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function afterBuildingFinishedSetsUpStoragePathToToFormDefinitionPathIfSaveToFileMountIsNotDefinedAndFormWasNotAddedProgrammatically(): void
     {
         $resourceFactory = $this->createMock(ResourceFactory::class);
@@ -228,9 +223,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         $this->propertyMappingConfiguration->afterBuildingFinished($this->fileUpload);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function afterBuildingFinishedSetsStoragePathToUserUploadIfNeitherSaveToFileMountIsSetNorThereIsAFormDefinitionPath(): void
     {
         // Don't add any validators for now
@@ -260,9 +253,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         $this->propertyMappingConfiguration->afterBuildingFinished($this->fileUpload);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function afterBuildingFinishedCopiesValidators(): void
     {
         // Some other Validator
@@ -292,9 +283,7 @@ final class PropertyMappingConfigurationTest extends UnitTestCase
         $this->propertyMappingConfiguration->afterBuildingFinished($this->fileUpload);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function afterBuildingFinishedDoesNotCopyNotEmptyValidator(): void
     {
         // Not Empty Validator
diff --git a/typo3/sysext/form/Tests/Unit/Mvc/Property/TypeConverter/FormDefinitionArrayConverterTest.php b/typo3/sysext/form/Tests/Unit/Mvc/Property/TypeConverter/FormDefinitionArrayConverterTest.php
index 456503e2d26d7fa5e7a41bc509c96959d22dd7ad..3d4b24d0e892b8dc37aab6788817d4540ce66e0c 100644
--- a/typo3/sysext/form/Tests/Unit/Mvc/Property/TypeConverter/FormDefinitionArrayConverterTest.php
+++ b/typo3/sysext/form/Tests/Unit/Mvc/Property/TypeConverter/FormDefinitionArrayConverterTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\Mvc\Property\TypeConverter;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Form\Domain\Configuration\Exception\PropertyException;
 use TYPO3\CMS\Form\Domain\Configuration\FormDefinitionValidationService;
@@ -34,9 +35,7 @@ final class FormDefinitionArrayConverterTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '12345';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertsJsonStringToFormDefinitionArray(): void
     {
         $sessionToken = '123';
@@ -95,9 +94,7 @@ final class FormDefinitionArrayConverterTest extends UnitTestCase
         self::assertSame($expected, $result->getArrayCopy());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromThrowsExceptionIfJsonIsInvalid(): void
     {
         $this->expectException(PropertyException::class);
@@ -109,9 +106,7 @@ final class FormDefinitionArrayConverterTest extends UnitTestCase
         $typeConverter->convertFrom($input, FormDefinitionArray::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function transformMultiValueElementsForFormFrameworkTransformValues(): void
     {
         $typeConverter = $this->getAccessibleMock(FormDefinitionArrayConverter::class, null, [], '', false);
@@ -157,9 +152,7 @@ final class FormDefinitionArrayConverterTest extends UnitTestCase
         self::assertSame($expected, $typeConverter->_call('transformMultiValueElementsForFormFramework', $input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromThrowsExceptionIfPrototypeNameWasChanged(): void
     {
         $this->expectException(PropertyException::class);
@@ -188,9 +181,7 @@ final class FormDefinitionArrayConverterTest extends UnitTestCase
         $typeConverter->convertFrom(json_encode($input), FormDefinitionArray::class);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertFromThrowsExceptionIfIdentifierWasChanged(): void
     {
         $this->expectException(PropertyException::class);
diff --git a/typo3/sysext/form/Tests/Unit/ViewHelpers/Form/DatePickerViewHelperTest.php b/typo3/sysext/form/Tests/Unit/ViewHelpers/Form/DatePickerViewHelperTest.php
index f34dbf10db36fd4740fe57f8736391b159c692a2..c3d2d45aa71db781e615d205fcb2af4805cc3bfc 100644
--- a/typo3/sysext/form/Tests/Unit/ViewHelpers/Form/DatePickerViewHelperTest.php
+++ b/typo3/sysext/form/Tests/Unit/ViewHelpers/Form/DatePickerViewHelperTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Form\Tests\Unit\ViewHelpers\Form;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -68,10 +70,8 @@ final class DatePickerViewHelperTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider convertDateFormatToDatePickerFormatReturnsTransformedFormatDataProvider
-     */
+    #[DataProvider('convertDateFormatToDatePickerFormatReturnsTransformedFormatDataProvider')]
+    #[Test]
     public function convertDateFormatToDatePickerFormatReturnsTransformedFormat(string $input, string $expected): void
     {
         $mock = \Closure::bind(static function (DatePickerViewHelper $datePickerViewHelper) use ($input, &$result) {
diff --git a/typo3/sysext/frontend/Tests/Unit/Authentication/FrontendUserAuthenticationTest.php b/typo3/sysext/frontend/Tests/Unit/Authentication/FrontendUserAuthenticationTest.php
index a408c5d59c7d6b0ba9a48bc862d3f9a5d19a7ef8..5c60273461506faa0a864994e5673d1385dfed65 100644
--- a/typo3/sysext/frontend/Tests/Unit/Authentication/FrontendUserAuthenticationTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Authentication/FrontendUserAuthenticationTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Authentication;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Session\UserSession;
@@ -32,9 +33,8 @@ final class FrontendUserAuthenticationTest extends UnitTestCase
     /**
      * Setting and immediately removing session data should be handled correctly.
      * No write operations should be made
-     *
-     * @test
      */
+    #[Test]
     public function canSetAndUnsetSessionKey(): void
     {
         $uniqueSessionId = StringUtility::getUniqueId('test');
@@ -72,9 +72,8 @@ final class FrontendUserAuthenticationTest extends UnitTestCase
 
     /**
      * A user that is not signed in should be able to have associated session data
-     *
-     * @test
      */
+    #[Test]
     public function canSetSessionDataForAnonymousUser(): void
     {
         $uniqueSessionId = StringUtility::getUniqueId('test');
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/CaseContentObjectTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/CaseContentObjectTest.php
index 237b1b9cb2227fabf49e1482a5d2bac6b8196799..aa1d575ac3509213b34f39ca2c8510c415a9150f 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/CaseContentObjectTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/CaseContentObjectTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\DependencyInjection\Container;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -67,9 +68,7 @@ final class CaseContentObjectTest extends UnitTestCase
         $this->subject->setContentObjectRenderer($contentObjectRenderer);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsEmptyStringIfNoKeyMatchesAndIfNoDefaultObjectIsSet(): void
     {
         $conf = [
@@ -78,9 +77,7 @@ final class CaseContentObjectTest extends UnitTestCase
         self::assertSame('', $this->subject->render($conf));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderReturnsContentFromDefaultObjectIfKeyDoesNotExist(): void
     {
         $conf = [
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentDataProcessorTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentDataProcessorTest.php
index 3f688269f88cc874da193a6665b08e93d64eebbb..db28d092159dc50ca994bfab55ceb4216b5820af 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentDataProcessorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentDataProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Symfony\Component\DependencyInjection\Container;
 use TYPO3\CMS\Frontend\ContentObject\ContentDataProcessor;
@@ -43,9 +44,7 @@ final class ContentDataProcessorTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionIfProcessorDoesNotExist(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -60,9 +59,7 @@ final class ContentDataProcessorTest extends UnitTestCase
         $this->contentDataProcessor->process($contentObjectRendererStub, $config, $variables);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionIfProcessorClassDoesNotImplementInterface(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -77,9 +74,7 @@ final class ContentDataProcessorTest extends UnitTestCase
         $this->contentDataProcessor->process($contentObjectRendererStub, $config, $variables);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processorClassIsCalled(): void
     {
         $contentObjectRendererStub = new ContentObjectRenderer();
@@ -96,9 +91,7 @@ final class ContentDataProcessorTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsExceptionIfProcessorServiceDoesNotImplementInterface(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -114,9 +107,7 @@ final class ContentDataProcessorTest extends UnitTestCase
         $this->contentDataProcessor->process($contentObjectRendererStub, $config, $variables);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processorServiceIsCalled(): void
     {
         $contentObjectRendererStub = new ContentObjectRenderer();
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
index f14b55371590b4a625a1bcd96cc8bea7db4d9b4e..85cee90322756ce0b73763e4130f29a65234d86c 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\Exception;
 use PHPUnit\Framework\MockObject\MockObject;
 use PHPUnit\Framework\MockObject\Rule\InvocationOrder;
@@ -188,7 +190,6 @@ final class ContentObjectRendererTest extends UnitTestCase
     //////////////////////
     // Utility functions
     //////////////////////
-
     /**
      * Converts the subject and the expected result into utf-8.
      *
@@ -376,9 +377,7 @@ final class ContentObjectRendererTest extends UnitTestCase
     /////////////////////////////////////////////
     // Tests concerning the getImgResource hook
     /////////////////////////////////////////////
-    /**
-     * @test
-     */
+    #[Test]
     public function getImgResourceCallsGetImgResourcePostProcessHook(): void
     {
         $cacheManagerMock = $this->getMockBuilder(CacheManager::class)->disableOriginalConstructor()->getMock();
@@ -425,11 +424,10 @@ final class ContentObjectRendererTest extends UnitTestCase
     //////////////////////////////////////
     // Tests related to getContentObject
     //////////////////////////////////////
-
     /**
      * @see ContentObjectRendererTest::canRegisterAContentObjectClassForATypoScriptName
-     * @test
      */
+    #[Test]
     public function willReturnNullForUnregisteredObject(): void
     {
         $object = $this->subject->getContentObject('FOO');
@@ -440,24 +438,19 @@ final class ContentObjectRendererTest extends UnitTestCase
     // Tests concerning crop
     //////////////////////////
     /**
-     * @test
-     *
-     * Tests are kept due ensure parameter splitting works, also they are mostly duplicates of directly implemented
-     * HtmlCropper and TextCropper tests.
      * @see \TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest
      * @see \TYPO3\CMS\Core\Tests\Unit\Text\TextCropperTest
      */
+    #[Test]
     public function cropIsMultibyteSafe(): void
     {
         self::assertEquals('бла', $this->subject->crop('бла', '3|...'));
     }
 
     //////////////////////////////
-
     //////////////////////////////
     // Tests concerning cropHTML
     //////////////////////////////
-
     /**
      * Data provider for cropHTML.
      *
@@ -761,8 +754,6 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if cropHTML works properly.
      *
-     * @test
-     * @dataProvider cropHTMLDataProvider
      * @param string $expect The expected cropped output.
      * @param string $content The given input.
      * @param string $conf The given configuration.
@@ -772,6 +763,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @see \TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest
      * @see \TYPO3\CMS\Core\Tests\Unit\Text\TextCropperTest
      */
+    #[DataProvider('cropHTMLDataProvider')]
+    #[Test]
     public function cropHTML(string $expect, string $content, string $conf): void
     {
         $this->handleCharset($content, $expect);
@@ -848,9 +841,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param float $expect The expected output.
      * @param mixed $content The given content.
      * @param array $conf The given configuration of 'round.'.
-     * @dataProvider roundDataProvider
-     * @test
      */
+    #[DataProvider('roundDataProvider')]
+    #[Test]
     public function round(float $expect, mixed $content, array $conf): void
     {
         self::assertSame(
@@ -859,9 +852,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function recursiveStdWrapProperlyRendersBasicString(): void
     {
         $stdWrapConfiguration = [
@@ -876,9 +867,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function recursiveStdWrapIsOnlyCalledOnce(): void
     {
         $stdWrapConfiguration = [
@@ -951,10 +940,9 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check if numberFormat works properly.
-     *
-     * @dataProvider numberFormatDataProvider
-     * @test
      */
+    #[DataProvider('numberFormatDataProvider')]
+    #[Test]
     public function numberFormat(string $expects, mixed $content, array $conf): void
     {
         self::assertSame(
@@ -1020,12 +1008,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap.replacement and all of its properties work properly
      *
-     * @test
-     * @dataProvider replacementDataProvider
      * @param string $content The given input.
      * @param string $expects The expected result.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('replacementDataProvider')]
+    #[Test]
     public function replacement(string $expects, string $content, array $conf): void
     {
         self::assertSame(
@@ -1092,10 +1080,9 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check if calcAge works properly.
-     *
-     * @test
-     * @dataProvider calcAgeDataProvider
      */
+    #[DataProvider('calcAgeDataProvider')]
+    #[Test]
     public function calcAge(string $expect, int $timestamp, string $labels): void
     {
         self::assertSame(
@@ -1119,10 +1106,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider stdWrapReturnsExpectationDataProvider
-     * @test
-     */
+    #[DataProvider('stdWrapReturnsExpectationDataProvider')]
+    #[Test]
     public function stdWrapReturnsExpectation(string $content, array $configuration, string $expectation): void
     {
         self::assertSame($expectation, $this->subject->stdWrap($content, $configuration));
@@ -1150,10 +1135,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider stdWrapDoesOnlyCallIfEmptyIfTheTrimmedContentIsEmptyOrZeroDataProvider
-     * @test
-     */
+    #[DataProvider('stdWrapDoesOnlyCallIfEmptyIfTheTrimmedContentIsEmptyOrZeroDataProvider')]
+    #[Test]
     public function stdWrapDoesOnlyCallIfEmptyIfTheTrimmedContentIsEmptyOrZero(string $content, bool $ifEmptyShouldBeCalled): void
     {
         $conf = [
@@ -1198,12 +1181,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if substring works properly.
      *
-     * @test
-     * @dataProvider substringDataProvider
      * @param string $expect The expected output.
      * @param string $content The given input.
      * @param string $conf The given configuration.
      */
+    #[DataProvider('substringDataProvider')]
+    #[Test]
     public function substring(string $expect, string $content, string $conf): void
     {
         self::assertSame($expect, $this->subject->substring($content, $conf));
@@ -1220,10 +1203,9 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "gp"
-     *
-     * @test
-     * @dataProvider getDataWithTypeGpDataProvider
      */
+    #[DataProvider('getDataWithTypeGpDataProvider')]
+    #[Test]
     public function getDataWithTypeGp(string $key, string $expectedValue): void
     {
         $queryArguments = [
@@ -1243,9 +1225,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "tsfe"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeTsfe(): void
     {
         $GLOBALS['TSFE']->linkVars = 'foo';
@@ -1254,9 +1235,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "getenv"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeGetenv(): void
     {
         $envName = StringUtility::getUniqueId('frontendtest');
@@ -1267,9 +1247,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "getindpenv"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeGetindpenv(): void
     {
         $this->subject->expects(self::once())->method('getEnvironmentVariable')
@@ -1279,9 +1258,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "field"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeField(): void
     {
         $key = 'someKey';
@@ -1294,9 +1272,8 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Checks if getData() works with type "field" of the field content
      * is multi-dimensional (e.g. an array)
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeFieldAndFieldIsMultiDimensional(): void
     {
         $key = 'somekey|level1|level2';
@@ -1323,10 +1300,9 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Basic check if getData gets the uid of a file object
-     *
-     * @test
-     * @dataProvider getDataWithTypeFileReturnsUidOfFileObjectDataProvider
      */
+    #[DataProvider('getDataWithTypeFileReturnsUidOfFileObjectDataProvider')]
+    #[Test]
     public function getDataWithTypeFileReturnsUidOfFileObject(string $typoScriptPath): void
     {
         $uid = StringUtility::getUniqueId();
@@ -1338,9 +1314,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "parameters"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeParameters(): void
     {
         $key = StringUtility::getUniqueId('someKey');
@@ -1352,9 +1327,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "register"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeRegister(): void
     {
         $key = StringUtility::getUniqueId('someKey');
@@ -1366,9 +1340,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "session"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeSession(): void
     {
         $frontendUser = $this->getMockBuilder(FrontendUserAuthentication::class)
@@ -1386,9 +1359,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "level"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeLevel(): void
     {
         $rootline = [
@@ -1402,9 +1374,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "leveltitle"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeLeveltitle(): void
     {
         $rootline = [
@@ -1420,9 +1391,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "levelmedia"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeLevelmedia(): void
     {
         $rootline = [
@@ -1438,9 +1408,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "leveluid"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeLeveluid(): void
     {
         $rootline = [
@@ -1456,9 +1425,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "levelfield"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeLevelfield(): void
     {
         $rootline = [
@@ -1473,9 +1441,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "fullrootline"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeFullrootline(): void
     {
         $rootline1 = [
@@ -1494,9 +1461,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "date"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeDate(): void
     {
         $format = 'Y-M-D';
@@ -1508,9 +1474,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "page"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypePage(): void
     {
         $uid = random_int(0, mt_getrandmax());
@@ -1520,9 +1485,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "current"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeCurrent(): void
     {
         $key = StringUtility::getUniqueId('someKey');
@@ -1532,9 +1496,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         self::assertEquals($value, $this->subject->getData('current'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDataWithTypeDbReturnsCorrectTitle()
     {
         $dummyRecord = ['uid' => 5, 'title' => 'someTitle'];
@@ -1578,10 +1540,9 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "db"
-     *
-     * @test
-     * @dataProvider getDataWithTypeDbDataProvider
      */
+    #[DataProvider('getDataWithTypeDbDataProvider')]
+    #[Test]
     public function getDataWithTypeDbReturnsEmptyStringOnInvalidIdentifiers(string $identifier, InvocationOrder $expectsMethodCall): void
     {
         $dummyRecord = ['uid' => 5, 'title' => 'someTitle'];
@@ -1591,9 +1552,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "lll"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeLll(): void
     {
         $key = StringUtility::getUniqueId('someKey');
@@ -1608,9 +1568,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "path"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypePath(): void
     {
         $filenameIn = 'typo3/sysext/frontend/Public/Icons/Extension.svg';
@@ -1619,9 +1578,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "context"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeContext(): void
     {
         $context = new Context([
@@ -1637,9 +1595,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "site"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeSite(): void
     {
         $site = new Site('my-site', 123, [
@@ -1657,9 +1614,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "site" and base variants
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeSiteWithBaseVariants(): void
     {
         $packageManager = new PackageManager(new DependencyOrderingService());
@@ -1692,9 +1648,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "siteLanguage"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeSiteLanguage(): void
     {
         $site = $this->createSiteWithLanguage([
@@ -1715,9 +1670,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "parentRecordNumber"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeParentRecordNumber(): void
     {
         $recordNumber = random_int(0, mt_getrandmax());
@@ -1727,9 +1681,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "debug:rootLine"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeDebugRootline(): void
     {
         $rootline = [
@@ -1749,9 +1702,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "debug:fullRootLine"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeDebugFullRootline(): void
     {
         $rootline = [
@@ -1771,9 +1723,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "debug:data"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeDebugData(): void
     {
         $key = StringUtility::getUniqueId('someKey');
@@ -1791,9 +1742,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "debug:register"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeDebugRegister(): void
     {
         $key = StringUtility::getUniqueId('someKey');
@@ -1811,9 +1761,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Checks if getData() works with type "data:page"
-     *
-     * @test
      */
+    #[Test]
     public function getDataWithTypeDebugPage(): void
     {
         $uid = random_int(0, mt_getrandmax());
@@ -1828,9 +1777,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         self::assertEquals($expectedResult, $cleanedResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderingContentObjectThrowsException(): void
     {
         $this->expectException(\LogicException::class);
@@ -1839,9 +1786,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         $this->subject->render($contentObjectFixture, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function exceptionHandlerIsEnabledByDefaultInProductionContext(): void
     {
         Environment::initialize(
@@ -1859,9 +1804,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         $this->subject->render($contentObjectFixture, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderingContentObjectDoesNotThrowExceptionIfExceptionHandlerIsConfiguredLocally(): void
     {
         $contentObjectFixture = $this->createContentObjectThrowingExceptionFixture();
@@ -1872,9 +1815,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         $this->subject->render($contentObjectFixture, $configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderingContentObjectDoesNotThrowExceptionIfExceptionHandlerIsConfiguredGlobally(): void
     {
         $contentObjectFixture = $this->createContentObjectThrowingExceptionFixture();
@@ -1883,9 +1824,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         $this->subject->render($contentObjectFixture, []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function globalExceptionHandlerConfigurationCanBeOverriddenByLocalConfiguration(): void
     {
         $contentObjectFixture = $this->createContentObjectThrowingExceptionFixture(false);
@@ -1898,9 +1837,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         $this->subject->render($contentObjectFixture, $configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function renderedErrorMessageCanBeCustomized(): void
     {
         $contentObjectFixture = $this->createContentObjectThrowingExceptionFixture();
@@ -1915,9 +1852,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         self::assertSame('New message for testing', $this->subject->render($contentObjectFixture, $configuration));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function localConfigurationOverridesGlobalConfiguration(): void
     {
         $contentObjectFixture = $this->createContentObjectThrowingExceptionFixture();
@@ -1936,9 +1871,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         self::assertSame('New message for testing', $this->subject->render($contentObjectFixture, $configuration));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function specificExceptionsCanBeIgnoredByExceptionHandler(): void
     {
         $contentObjectFixture = $this->createContentObjectThrowingExceptionFixture();
@@ -2063,10 +1996,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider _parseFuncReturnsCorrectHtmlDataProvider
-     */
+    #[DataProvider('_parseFuncReturnsCorrectHtmlDataProvider')]
+    #[Test]
     public function stdWrap_parseFuncReturnsParsedHtml(string $value, array $configuration, string $expectedResult, LinkResultInterface|false $linkResult): void
     {
         if ($linkResult !== false) {
@@ -2338,10 +2269,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider _parseFuncParsesNestedTagsProperlyDataProvider
-     */
+    #[DataProvider('_parseFuncParsesNestedTagsProperlyDataProvider')]
+    #[Test]
     public function parseFuncParsesNestedTagsProperly(string $value, array $configuration, string $expectedResult): void
     {
         self::assertEquals($expectedResult, $this->subject->stdWrap_parseFunc($value, $configuration));
@@ -2479,10 +2408,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider httpMakelinksDataProvider
-     */
+    #[DataProvider('httpMakelinksDataProvider')]
+    #[Test]
     public function httpMakelinksReturnsLink(string $data, array $configuration, string $expectedResult, LinkResult $linkResult): void
     {
         $linkFactory = $this->getMockBuilder(LinkFactory::class)->disableOriginalConstructor()->getMock();
@@ -2516,10 +2443,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider invalidHttpMakelinksDataProvider
-     */
+    #[DataProvider('invalidHttpMakelinksDataProvider')]
+    #[Test]
     public function httpMakelinksReturnsNoLink(string $data, array $configuration, string $expectedResult): void
     {
         self::assertSame($expectedResult, $this->subject->_call('http_makelinks', $data, $configuration));
@@ -2591,10 +2516,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider mailtoMakelinksDataProvider
-     */
+    #[DataProvider('mailtoMakelinksDataProvider')]
+    #[Test]
     public function mailtoMakelinksReturnsMailToLink(string $data, array $configuration, string $expectedResult, LinkResult $linkResult): void
     {
         $linkFactory = $this->getMockBuilder(LinkFactory::class)->disableOriginalConstructor()->getMock();
@@ -2604,17 +2527,13 @@ final class ContentObjectRendererTest extends UnitTestCase
         self::assertSame($expectedResult, $this->subject->_call('mailto_makelinks', $data, $configuration));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mailtoMakelinksReturnsNoMailToLink(): void
     {
         self::assertSame('mailto:', $this->subject->_call('mailto_makelinks', 'mailto:', []));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function stdWrap_splitObjReturnsCount(): void
     {
         $conf = [
@@ -2685,8 +2604,6 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - takes key from $conf['key']
      * - processes key with stdWrap based on $conf['key.']
      *
-     * @test
-     * @dataProvider calculateCacheKeyDataProvider
      * @param string $expect Expected result.
      * @param array $conf Properties 'key', 'key.'
      * @param int $times Times called mocked method.
@@ -2694,6 +2611,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param array|null $withWrap
      * @param string|null $will Return value of mocked method.
      */
+    #[DataProvider('calculateCacheKeyDataProvider')]
+    #[Test]
     public function calculateCacheKey(string $expect, array $conf, int $times, ?string $with, ?array $withWrap, ?string $will): void
     {
         $subject = $this->getAccessibleMock(ContentObjectRenderer::class, ['stdWrap']);
@@ -2740,14 +2659,14 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - CacheFrontend is created and called if $cacheKey is not empty.
      * - Else false is returned.
      *
-     * @test
-     * @dataProvider getFromCacheDataProvider
      * @param string|bool $expect Expected result.
      * @param array $conf Configuration to pass to calculateCacheKey mock.
      * @param string $cacheKey Return from calculateCacheKey mock.
      * @param int $times Times the cache is expected to be called (0 or 1).
      * @param string|null $cached Return from cacheFrontend mock.
      */
+    #[DataProvider('getFromCacheDataProvider')]
+    #[Test]
     public function getFromCache(string|bool $expect, array $conf, string $cacheKey, int $times, ?string $cached): void
     {
         $tags = [StringUtility::getUniqueId('tags')];
@@ -2860,11 +2779,11 @@ final class ContentObjectRendererTest extends UnitTestCase
      *   -  1 => 1
      *   - 'string' => 'string'
      *
-     * @test
-     * @dataProvider getFieldValDataProvider
      * @param mixed $expect The expected string.
      * @param string $fields Field names divides by //.
      */
+    #[DataProvider('getFieldValDataProvider')]
+    #[Test]
     public function getFieldVal(mixed $expect, string $fields): void
     {
         $data = [
@@ -2923,10 +2842,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider caseshiftDataProvider
-     */
+    #[DataProvider('caseshiftDataProvider')]
+    #[Test]
     public function caseshift(string $expected, string $content, string $case): void
     {
         self::assertSame($expected, $this->subject->caseshift($content, $case));
@@ -2956,10 +2873,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider HTMLcaseshiftDataProvider
-     */
+    #[DataProvider('HTMLcaseshiftDataProvider')]
+    #[Test]
     public function HTMLcaseshift(string $content, string $expected): void
     {
         self::assertSame($expected, (new ContentObjectRenderer())->HTMLcaseshift($content, 'upper'));
@@ -2968,7 +2883,6 @@ final class ContentObjectRendererTest extends UnitTestCase
     /***************************************************************************
      * General tests for stdWrap_
      ***************************************************************************/
-
     /**
      * Check that all registered stdWrap processors are callable.
      *
@@ -2977,9 +2891,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - The given invalidProcessor is counted as not callable.
      * - All stdWrap processors are counted as callable.
      * - Their amount is 91.
-     *
-     * @test
      */
+    #[Test]
     public function allStdWrapProcessorsAreCallable(): void
     {
         $callable = 0;
@@ -3016,9 +2929,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  The exceptions break, if the configuration is empty. This test just
      *  tracks the different behaviour to gain information. It doesn't mean
      *  that it is an issue.
-     *
-     * @test
      */
+    #[Test]
     public function notAllStdWrapProcessorsAreCallableWithEmptyConfiguration(): void
     {
         $timeTrackerMock = $this->getMockBuilder(TimeTracker::class)->disableOriginalConstructor()->getMock();
@@ -3054,11 +2966,9 @@ final class ContentObjectRendererTest extends UnitTestCase
     /***************************************************************************
      * End general tests for stdWrap_
      ***************************************************************************/
-
     /***************************************************************************
      * Tests for stdWrap_ in alphabetical order (all uppercase before lowercase)
      ***************************************************************************/
-
     /**
      * Data provider for fourTypesOfStdWrapHookObjectProcessors
      *
@@ -3096,11 +3006,11 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - stdWrap_stdWrapProcess
      * - stdWrap_stdWrapPostProcess
      *
-     * @test
-     * @dataProvider fourTypesOfStdWrapHookObjectProcessorsDataProvider
      * @param string $stdWrapMethod The method to cover.
      * @param string $hookObjectCall The expected hook object call.
      */
+    #[DataProvider('fourTypesOfStdWrapHookObjectProcessorsDataProvider')]
+    #[Test]
     public function fourTypesOfStdWrapHookObjectProcessors(
         string $stdWrapMethod,
         string $hookObjectCall
@@ -3186,14 +3096,14 @@ final class ContentObjectRendererTest extends UnitTestCase
      *   - Parameter 2 is $conf['HTMLparser'].
      *   - Returns the return value.
      *
-     * @test
-     * @dataProvider stdWrap_HTMLparserDataProvider
      * @param string $expect The expected output.
      * @param string $content The given content.
      * @param array $conf The given configuration.
      * @param int $times Times HTMLparser_TSbridge is called (0 or 1).
      * @param string $will Return of HTMLparser_TSbridge.
      */
+    #[DataProvider('stdWrap_HTMLparserDataProvider')]
+    #[Test]
     public function stdWrap_HTMLparser(
         string $expect,
         string $content,
@@ -3235,10 +3145,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider stdWrap_addPageCacheTagsAddsPageTagsDataProvider
-     */
+    #[DataProvider('stdWrap_addPageCacheTagsAddsPageTagsDataProvider')]
+    #[Test]
     public function stdWrap_addPageCacheTagsAddsPageTags(array $expectedTags, array $configuration): void
     {
         $this->subject->stdWrap_addPageCacheTags('', $configuration);
@@ -3254,9 +3162,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is the difference between $content and EXEC_TIME.
      * - Parameter 2 is $conf['age'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_age(): void
     {
         $now = 10;
@@ -3285,9 +3192,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Second parameter is $conf['append.'].
      * - Third parameter is '/stdWrap/.append'.
      * - Returns the return value appended to $content.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_append(): void
     {
         $debugKey = '/stdWrap/.append';
@@ -3347,9 +3253,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param string|null $xhtmlDoctype Xhtml document type.
-     * @test
-     * @dataProvider stdWrapBrDataProvider
      */
+    #[DataProvider('stdWrapBrDataProvider')]
+    #[Test]
     public function stdWrap_br(string $expected, string $input, ?string $xhtmlDoctype): void
     {
         $pageRenderer = $this->getMockBuilder(PageRenderer::class)->disableOriginalConstructor()->addMethods(['dummy'])->getMock();
@@ -3395,10 +3301,9 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check if brTag works properly
-     *
-     * @test
-     * @dataProvider stdWrapBrTagDataProvider
      */
+    #[DataProvider('stdWrapBrTagDataProvider')]
+    #[Test]
     public function stdWrap_brTag(string $input, string $expected, array $config): void
     {
         self::assertEquals($expected, $this->subject->stdWrap_brTag($input, $config));
@@ -3470,12 +3375,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      *       is done by testing input/output pairs instead. To not duplicate
      *       the testing of formatSize just a few smoke tests are done here.
      *
-     * @test
-     * @dataProvider stdWrap_bytesDataProvider
      * @param string $expect The expected output.
      * @param string $content The given input.
      * @param array $conf The given configuration for 'bytes.'.
      */
+    #[DataProvider('stdWrap_bytesDataProvider')]
+    #[Test]
     public function stdWrap_bytes(string $expect, string $content, array $conf): void
     {
         $locale = 'en_US.UTF-8';
@@ -3501,9 +3406,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is $conf['cObject.'].
      * - Parameter 3 is '/stdWrap/.cObject'.
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_cObject(): void
     {
         $debugKey = '/stdWrap/.cObject';
@@ -3597,10 +3501,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider stdWrap_orderedStdWrapDataProvider
-     */
+    #[DataProvider('stdWrap_orderedStdWrapDataProvider')]
+    #[Test]
     public function stdWrap_orderedStdWrap(array $config, string $expected): void
     {
         self::assertSame($expected, (new ContentObjectRenderer())->stdWrap_orderedStdWrap('someContent', $config));
@@ -3658,8 +3560,6 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - getFromCache is called to fetch from cache
      * - $conf['cache.'] is passed on as parameter
      *
-     * @test
-     * @dataProvider stdWrap_cacheReadDataProvider
      * @param string $expect Expected result.
      * @param string $input Given input string.
      * @param array $conf Property 'cache.'
@@ -3667,6 +3567,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param array|null $with Parameter passed to mocked method.
      * @param string|false $will Return value of mocked method.
      */
+    #[DataProvider('stdWrap_cacheReadDataProvider')]
+    #[Test]
     public function stdWrap_cacheRead(
         string $expect,
         string $input,
@@ -3735,13 +3637,13 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Calls all configured user functions with $params, $this.
      * - Calls set on the cache frontend with $key, $content, $tags, $lifetime.
      *
-     * @test
-     * @dataProvider stdWrap_cacheStoreDataProvider
      * @param array|null $confCache Configuration of 'cache.'
      * @param int $timesCCK Times calculateCacheKey is called.
      * @param mixed $key The return value of calculateCacheKey.
      * @param int $times Times the other methods are called.
      */
+    #[DataProvider('stdWrap_cacheStoreDataProvider')]
+    #[Test]
     public function stdWrap_cacheStore(
         ?array $confCache,
         int $timesCCK,
@@ -3839,9 +3741,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['case'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_case(): void
     {
         $content = StringUtility::getUniqueId();
@@ -3865,9 +3766,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check if stdWrap_char works properly.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_char(): void
     {
         $input = 'discarded';
@@ -3884,9 +3784,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['crop'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_crop(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -3917,9 +3816,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['cropHTML'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_cropHTML(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -4010,10 +3908,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider stdWrap_formattedDateProvider
-     */
+    #[DataProvider('stdWrap_formattedDateProvider')]
+    #[Test]
     public function stdWrap_formattedDate(string $expected, mixed $pattern, string $locale = null, string $givenDate = null): void
     {
         $this->frontendControllerMock->getContext()->setAspect('date', new DateTimeAspect(new \DateTimeImmutable('2023-02-02 13:05:00')));
@@ -4069,12 +3965,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_csConv works properly.
      *
-     * @test
-     * @dataProvider stdWrap_csConvDataProvider
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf Property: csConv
      */
+    #[DataProvider('stdWrap_csConvDataProvider')]
+    #[Test]
     public function stdWrap_csConv(string $expected, string $input, array $conf): void
     {
         self::assertSame(
@@ -4091,9 +3987,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - current is returned from $this->data
      * - the key is stored in $this->currentValKey
      * - the key defaults to 'currentValue_kidjls9dksoje'
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_current(): void
     {
         $data = [
@@ -4138,11 +4033,11 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is property data by default.
      * - Returns the return value.
      *
-     * @test
-     * @dataProvider stdWrap_dataDataProvider
      * @param array $expect Expect either $data
      * @param array $data The data.
      */
+    #[DataProvider('stdWrap_dataDataProvider')]
+    #[Test]
     public function stdWrap_data(array $expect, array $data): void
     {
         $conf = ['data' => StringUtility::getUniqueId('conf.data')];
@@ -4169,9 +4064,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Parameter 1 is $content.
      *  - Parameter 2 is $conf['dataWrap'].
      *  - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_dataWrap(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -4236,13 +4130,13 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_date works properly.
      *
-     * @test
-     * @dataProvider stdWrap_dateDataProvider
      * @param string $expected The expected output.
      * @param mixed $content The given input.
      * @param array $conf The given configuration.
      * @param int $now Fictive execution time.
      */
+    #[DataProvider('stdWrap_dateDataProvider')]
+    #[Test]
     public function stdWrap_date(string $expected, mixed $content, array $conf, int $now): void
     {
         $GLOBALS['EXEC_TIME'] = $now;
@@ -4254,9 +4148,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check if stdWrap_debug works properly.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_debug(): void
     {
         $expect = '<pre>&lt;p class=&quot;class&quot;&gt;&lt;br/&gt;'
@@ -4282,9 +4175,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * Note 2:
      *   The second parameter to the debug function isn't used by the current
      *   implementation at all. It can't even indirectly be tested.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_debugData(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'] = '*';
@@ -4332,11 +4224,11 @@ final class ContentObjectRendererTest extends UnitTestCase
      *   easily intercepted. The test is done indirectly by catching the
      *   frontend output of debug.
      *
-     * @test
-     * @dataProvider stdWrap_debugFuncDataProvider
      * @param bool $expectArray If cast to array is expected.
      * @param mixed $confDebugFunc The configuration for $conf['debugFunc'].
      */
+    #[DataProvider('stdWrap_debugFuncDataProvider')]
+    #[Test]
     public function stdWrap_debugFunc(bool $expectArray, mixed $confDebugFunc): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'] = '*';
@@ -4418,12 +4310,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if doubleBrTag works properly
      *
-     * @test
-     * @dataProvider stdWrapDoubleBrTagDataProvider
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $config The property 'doubleBrTag'.
      */
+    #[DataProvider('stdWrapDoubleBrTagDataProvider')]
+    #[Test]
     public function stdWrap_doubleBrTag(string $expected, string $input, array $config): void
     {
         self::assertEquals($expected, $this->subject->stdWrap_doubleBrTag($input, $config));
@@ -4438,9 +4330,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['encapsLines'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_encapsLines(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -4466,10 +4357,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * Check if stdWrap_encapsLines uses self closing tags
      * only for allowed tags according to
      * @see https://www.w3.org/TR/html5/syntax.html#void-elements
-     *
-     * @test
-     * @dataProvider html5SelfClosingTagsDataprovider
      */
+    #[DataProvider('html5SelfClosingTagsDataprovider')]
+    #[Test]
     public function stdWrap_encapsLines_HTML5SelfClosingTags(string $input, string $expected): void
     {
         $rteParseFunc = self::getLibParseFunc_RTE();
@@ -4618,11 +4508,11 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if encodeForJavaScriptValue works properly.
      *
-     * @test
-     * @dataProvider stdWrap_encodeForJavaScriptValueDataProvider
      * @param string $expect The expected output.
      * @param string $content The given input.
      */
+    #[DataProvider('stdWrap_encodeForJavaScriptValueDataProvider')]
+    #[Test]
     public function stdWrap_encodeForJavaScriptValue(string $expect, string $content): void
     {
         self::assertSame(
@@ -4653,11 +4543,11 @@ final class ContentObjectRendererTest extends UnitTestCase
      * can't mock static methods, to prove they are called, all we do here
      * is to provide a few smoke tests.
      *
-     * @test
-     * @dataProvider stdWrap_expandListDataProvider
      * @param string $expected The expected output.
      * @param string $content The given content.
      */
+    #[DataProvider('stdWrap_expandListDataProvider')]
+    #[Test]
     public function stdWrap_expandList(string $expected, string $content): void
     {
         self::assertEquals(
@@ -4673,9 +4563,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *
      * - calls getFieldVal
      * - passes conf['field'] as parameter
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_field(): void
     {
         $expect = StringUtility::getUniqueId('expect');
@@ -4779,13 +4668,13 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - False triggers a stop of further rendering.
      *  - False returns '', true the given content as is.
      *
-     * @test
-     * @dataProvider stdWrap_fieldRequiredDataProvider
      * @param string $expect The expected output.
      * @param bool $stop Expect stop further rendering.
      * @param string $content The given input.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('stdWrap_fieldRequiredDataProvider')]
+    #[Test]
     public function stdWrap_fieldRequired(string $expect, bool $stop, string $content, array $conf): void
     {
         $data = [
@@ -4854,12 +4743,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Returns '' for invalid algorithm.
      *  - Value can be processed by stdWrap.
      *
-     * @test
-     * @dataProvider hashDataProvider
      * @param string $expect The expected output.
      * @param string $content The given content.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('hashDataProvider')]
+    #[Test]
     public function stdWrap_hash(string $expect, string $content, array $conf): void
     {
         self::assertSame(
@@ -4902,12 +4791,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_htmlSpecialChars works properly
      *
-     * @test
-     * @dataProvider stdWrap_htmlSpecialCharsDataProvider
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf htmlSpecialChars.preserveEntities
      */
+    #[DataProvider('stdWrap_htmlSpecialCharsDataProvider')]
+    #[Test]
     public function stdWrap_htmlSpecialChars(string $expected, string $input, array $conf): void
     {
         self::assertSame(
@@ -5006,8 +4895,6 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - 'False' triggers a stop of further rendering.
      *  - Returns the content as is or '' if false.
      *
-     * @test
-     * @dataProvider stdWrap_ifDataProvider
      * @param string $expect The expected output.
      * @param bool $stop Expect stop further rendering.
      * @param string $content The given content.
@@ -5015,6 +4902,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param int $times Times checkIf is called (0 or 1).
      * @param bool $will Return of checkIf (null if not called).
      */
+    #[DataProvider('stdWrap_ifDataProvider')]
+    #[Test]
     public function stdWrap_if(string $expect, bool $stop, string $content, array $conf, int $times, bool $will): void
     {
         $subject = $this->getAccessibleMock(
@@ -5064,11 +4953,11 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if checkIf works properly.
      *
-     * @test
-     * @dataProvider checkIfDataProvider
      * @param bool $expect Whether result should be true or false.
      * @param array $conf TypoScript configuration to pass into checkIf
      */
+    #[DataProvider('checkIfDataProvider')]
+    #[Test]
     public function checkIf(bool $expect, array $conf): void
     {
         $subject = $this->getAccessibleMock(
@@ -5112,12 +5001,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - The check for blank is done by comparing the trimmed content
      *   with the empty string for equality.
      *
-     * @test
-     * @dataProvider stdWrap_ifBlankDataProvider
      * @param mixed $expect
      * @param mixed $content The given input.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('stdWrap_ifBlankDataProvider')]
+    #[Test]
     public function stdWrap_ifBlank(mixed $expect, mixed $content, array $conf): void
     {
         $result = $this->subject->stdWrap_ifBlank($content, $conf);
@@ -5166,12 +5055,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Otherwise returns $conf['ifEmpty'].
      * - Empty is checked by cast to boolean after trimming.
      *
-     * @test
-     * @dataProvider stdWrap_ifEmptyDataProvider
      * @param mixed $expect The expected output.
      * @param mixed $content The given content.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('stdWrap_ifEmptyDataProvider')]
+    #[Test]
     public function stdWrap_ifEmpty(mixed $expect, mixed $content, array $conf): void
     {
         $result = $this->subject->stdWrap_ifEmpty($content, $conf);
@@ -5207,12 +5096,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Otherwise returns $conf['ifNull'].
      * - Null is strictly checked by identity with null.
      *
-     * @test
-     * @dataProvider stdWrap_ifNullDataProvider
      * @param mixed $expect
      * @param mixed $content The given input.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('stdWrap_ifNullDataProvider')]
+    #[Test]
     public function stdWrap_ifNull(mixed $expect, mixed $content, array $conf): void
     {
         $result = $this->subject->stdWrap_ifNull($content, $conf);
@@ -5264,9 +5153,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf Property: innerWrap
-     * @test
-     * @dataProvider stdWrap_innerWrapDataProvider
      */
+    #[DataProvider('stdWrap_innerWrapDataProvider')]
+    #[Test]
     public function stdWrap_innerWrap(string $expected, string $input, array $conf): void
     {
         self::assertSame(
@@ -5320,9 +5209,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf Property: innerWrap2
-     * @test
-     * @dataProvider stdWrap_innerWrap2DataProvider
      */
+    #[DataProvider('stdWrap_innerWrap2DataProvider')]
+    #[Test]
     public function stdWrap_innerWrap2(string $expected, string $input, array $conf): void
     {
         self::assertSame(
@@ -5339,9 +5228,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Delegates to method insertData.
      *  - Parameter 1 is $content.
      *  - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_insertData(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -5373,11 +5261,11 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check that stdWrap_insertData works properly with given input.
      *
-     * @test
-     * @dataProvider stdWrap_insertDataProvider
      * @param mixed $expect The expected output.
      * @param string $content The given input.
      */
+    #[DataProvider('stdWrap_insertDataProvider')]
+    #[Test]
     public function stdWrap_insertDataAndInputExamples(mixed $expect, string $content): void
     {
         self::assertSame($expect, $this->subject->stdWrap_insertData($content));
@@ -5427,11 +5315,11 @@ final class ContentObjectRendererTest extends UnitTestCase
      *
      *
      *
-     * @test
-     * @dataProvider stdWrap_intvalDataProvider
      * @param int $expect The expected output.
      * @param mixed $content The given input.
      */
+    #[DataProvider('stdWrap_intvalDataProvider')]
+    #[Test]
     public function stdWrap_intval(int $expect, mixed $content): void
     {
         self::assertSame($expect, $this->subject->stdWrap_intval($content));
@@ -5487,9 +5375,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      *
      * @param string $expected The expected value.
      * @param string $input The input value.
-     * @test
-     * @dataProvider stdWrapKeywordsDataProvider
      */
+    #[DataProvider('stdWrapKeywordsDataProvider')]
+    #[Test]
     public function stdWrap_keywords(string $expected, string $input): void
     {
         self::assertSame($expected, $this->subject->stdWrap_keywords($input));
@@ -5563,9 +5451,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $input The input value.
      * @param array $conf Properties: lang.xy.
      * @param string $language For $TSFE->config[config][language].
-     * @test
-     * @dataProvider stdWrap_langDataProvider
      */
+    #[DataProvider('stdWrap_langDataProvider')]
+    #[Test]
     public function stdWrap_langViaSiteLanguage(string $expected, string $input, array $conf, string $language): void
     {
         $site = $this->createSiteWithLanguage([
@@ -5590,9 +5478,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is $conf['listNum'].
      * - Parameter 3 is $conf['listNum.']['splitChar'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_listNum(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -5692,12 +5579,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_noTrimWrap works properly.
      *
-     * @test
-     * @dataProvider stdWrap_noTrimWrapDataProvider
      * @param string $expect The expected output.
      * @param string $content The given input.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('stdWrap_noTrimWrapDataProvider')]
+    #[Test]
     public function stdWrap_noTrimWrap(string $expect, string $content, array $conf): void
     {
         self::assertSame(
@@ -5714,9 +5601,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Delegates to method numRows.
      * - Parameter is $conf['numRows.'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_numRows(): void
     {
         $conf = [
@@ -5742,9 +5628,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['numberFormat.'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_numberFormat(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -5811,9 +5696,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf Property: outerWrap
-     * @test
-     * @dataProvider stdWrap_outerWrapDataProvider
      */
+    #[DataProvider('stdWrap_outerWrapDataProvider')]
+    #[Test]
     public function stdWrap_outerWrap(string $expected, string $input, array $conf): void
     {
         self::assertSame(
@@ -5896,10 +5781,10 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_override works properly.
      *
-     * @test
-     * @dataProvider stdWrap_overrideDataProvider
      * @param array $conf Property: setCurrent
      */
+    #[DataProvider('stdWrap_overrideDataProvider')]
+    #[Test]
     public function stdWrap_override(mixed $expect, string $content, array $conf): void
     {
         self::assertSame(
@@ -5918,9 +5803,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is $conf['parseFunc.'].
      * - Parameter 3 is $conf['parseFunc'].
      * - Returns the return.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_parseFunc(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -5952,9 +5836,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is $conf['postCObject.'].
      * - Parameter 3 is '/stdWrap/.postCObject'.
      * - Returns the return value appended by $content.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_postCObject(): void
     {
         $debugKey = '/stdWrap/.postCObject';
@@ -5985,9 +5868,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Parameter 1 is $conf['postUserFunc'].
      *  - Parameter 2 is $conf['postUserFunc.'].
      *  - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_postUserFunc(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6024,9 +5906,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *   - type: 'POSTUSERFUNC'
      *   - cObj: serialized content renderer object
      * - Returns "<!-- $substKey -->".
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_postUserFuncInt(): void
     {
         $uniqueHash = StringUtility::getUniqueId('uniqueHash');
@@ -6075,9 +5956,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is $conf['preCObject.'].
      * - Parameter 3 is '/stdWrap/.preCObject'.
      * - Returns the return value appended by $content.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_preCObject(): void
     {
         $debugKey = '/stdWrap/.preCObject';
@@ -6110,9 +5990,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is $conf['preIfEmptyListNum'].
      * - Parameter 3 is $conf['preIfEmptyListNum.']['splitChar'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_preIfEmptyListNum(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6176,10 +6055,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Returns $content as is,
      *    - if $conf['prefixComment'] is empty.
      *    - if 'config.disablePrefixComment' is configured by the frontend.
-     *
-     * @test
-     * @dataProvider stdWrap_prefixCommentDataProvider
      */
+    #[DataProvider('stdWrap_prefixCommentDataProvider')]
+    #[Test]
     public function stdWrap_prefixComment(
         string $expect,
         string $content,
@@ -6213,9 +6091,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Second parameter is $conf['prepend.'].
      * - Third parameter is '/stdWrap/.prepend'.
      * - Returns the return value prepended to $content.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_prepend(): void
     {
         $debugKey = '/stdWrap/.prepend';
@@ -6268,12 +6145,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      *       duplicate the testing of calculateWithParentheses just a few
      *       smoke tests are done here.
      *
-     * @test
-     * @dataProvider stdWrap_prioriCalcDataProvider
      * @param mixed $expect The expected output.
      * @param string $content The given content.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('stdWrap_prioriCalcDataProvider')]
+    #[Test]
     public function stdWrap_prioriCalc(mixed $expect, string $content, array $conf): void
     {
         $result = $this->subject->stdWrap_prioriCalc($content, $conf);
@@ -6290,9 +6167,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 2 is $conf['preUserFunc.'].
      * - Parameter 3 is $content.
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_preUserFunc(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6333,11 +6209,11 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if rawUrlEncode works properly.
      *
-     * @test
-     * @dataProvider stdWrap_rawUrlEncodeDataProvider
      * @param string $expect The expected output.
      * @param string $content The given input.
      */
+    #[DataProvider('stdWrap_rawUrlEncodeDataProvider')]
+    #[Test]
     public function stdWrap_rawUrlEncode(string $expect, string $content): void
     {
         self::assertSame(
@@ -6355,9 +6231,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['replacement.'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_replacement(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6412,12 +6287,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Empty content triggers a stop of further rendering.
      *  - Returns the content as is or '' for empty content.
      *
-     * @test
-     * @dataProvider stdWrap_requiredDataProvider
      * @param mixed $expect The expected output.
      * @param bool $stop Expect stop further rendering.
      * @param mixed $content The given input.
      */
+    #[DataProvider('stdWrap_requiredDataProvider')]
+    #[Test]
     public function stdWrap_required(mixed $expect, bool $stop, mixed $content): void
     {
         $subject = $this->subject;
@@ -6436,9 +6311,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['round.'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_round(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6459,9 +6333,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check if stdWrap_setContentToCurrent works properly.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_setContentToCurrent(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6515,11 +6388,11 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_setCurrent works properly.
      *
-     * @test
-     * @dataProvider stdWrap_setCurrentDataProvider
      * @param string $input The input value.
      * @param array $conf Property: setCurrent
      */
+    #[DataProvider('stdWrap_setCurrentDataProvider')]
+    #[Test]
     public function stdWrap_setCurrent(string $input, array $conf): void
     {
         if (isset($conf['setCurrent'])) {
@@ -6540,9 +6413,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['split.'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_split(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6572,9 +6444,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Parameter 1 is $content.
      *  - Parameter 2 is $conf['stdWrap.'].
      *  - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_stdWrap(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -6661,10 +6532,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider stdWrap_stdWrapValueDataProvider
-     * @test
-     */
+    #[DataProvider('stdWrap_stdWrapValueDataProvider')]
+    #[Test]
     public function stdWrap_stdWrapValue(
         string $key,
         array $configuration,
@@ -6786,12 +6655,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_strPad works properly.
      *
-     * @test
-     * @dataProvider stdWrap_strPadDataProvider
      * @param string $expect The expected output.
      * @param string $content The given input.
      * @param array $conf The configuration of 'strPad.'.
      */
+    #[DataProvider('stdWrap_strPadDataProvider')]
+    #[Test]
     public function stdWrap_strPad(string $expect, string $content, array $conf): void
     {
         $conf = ['strPad.' => $conf];
@@ -6833,13 +6702,13 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_strftime works properly.
      *
-     * @test
-     * @dataProvider stdWrap_strftimeDataProvider
      * @param string $expect The expected output.
      * @param mixed $content The given input.
      * @param array $conf The given configuration.
      * @param int $now Fictive execution time.
      */
+    #[DataProvider('stdWrap_strftimeDataProvider')]
+    #[Test]
     public function stdWrap_strftime(string $expect, mixed $content, array $conf, int $now): void
     {
         // Save current timezone and set to UTC to make the system under test
@@ -6858,9 +6727,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Test for the stdWrap_stripHtml
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_stripHtml(): void
     {
         $content = '<html><p>Hello <span class="inline">inline tag<span>!</p><p>Hello!</p></html>';
@@ -6912,12 +6780,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if stdWrap_strtotime works properly.
      *
-     * @test
-     * @dataProvider stdWrap_strtotimeDataProvider
      * @param mixed $expect The expected output.
      * @param string $content The given input.
      * @param array $conf The given configuration.
      */
+    #[DataProvider('stdWrap_strtotimeDataProvider')]
+    #[Test]
     public function stdWrap_strtotime(mixed $expect, string $content, array $conf): void
     {
         // Set exec_time to a hard timestamp
@@ -6944,9 +6812,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Parameter 1 is $content.
      * - Parameter 2 is $conf['substring'].
      * - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_substring(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -7020,10 +6887,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      *    - -1 => '-1'
      *    - 1.0 => '1'
      *    - 1.1 => '1.1'
-     *
-     * @test
-     * @dataProvider stdWrap_trimDataProvider
      */
+    #[DataProvider('stdWrap_trimDataProvider')]
+    #[Test]
     public function stdWrap_trim(string $expect, mixed $content): void
     {
         $result = $this->subject->stdWrap_trim($content);
@@ -7038,9 +6904,8 @@ final class ContentObjectRendererTest extends UnitTestCase
      *  - Parameter 1 is $content.
      *  - Parameter 2 is $conf['typolink.'].
      *  - Returns the return value.
-     *
-     * @test
      */
+    #[Test]
     public function stdWrap_typolink(): void
     {
         $content = StringUtility::getUniqueId('content');
@@ -7114,9 +6979,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf Properties: wrap, wrap.splitChar
-     * @test
-     * @dataProvider stdWrap_wrapDataProvider
      */
+    #[DataProvider('stdWrap_wrapDataProvider')]
+    #[Test]
     public function stdWrap_wrap(string $expected, string $input, array $conf): void
     {
         self::assertSame(
@@ -7180,9 +7045,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf Properties: wrap2, wrap2.splitChar
-     * @test
-     * @dataProvider stdWrap_wrap2DataProvider
      */
+    #[DataProvider('stdWrap_wrap2DataProvider')]
+    #[Test]
     public function stdWrap_wrap2(string $expected, string $input, array $conf): void
     {
         self::assertSame($expected, $this->subject->stdWrap_wrap2($input, $conf));
@@ -7243,9 +7108,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * @param string $expected The expected value.
      * @param string $input The input value.
      * @param array $conf Properties: wrap3, wrap3.splitChar
-     * @test
-     * @dataProvider stdWrap_wrap3DataProvider
      */
+    #[DataProvider('stdWrap_wrap3DataProvider')]
+    #[Test]
     public function stdWrap_wrap3(string $expected, string $input, array $conf): void
     {
         self::assertSame($expected, $this->subject->stdWrap_wrap3($input, $conf));
@@ -7280,12 +7145,12 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Returns the content as is,
      * - if $conf['wrapAlign'] evals to false after being trimmed.
      *
-     * @test
-     * @dataProvider stdWrap_wrapAlignDataProvider
      * @param string $expect The expected output.
      * @param string $content The given content.
      * @param mixed $wrapAlignConf The given input.
      */
+    #[DataProvider('stdWrap_wrapAlignDataProvider')]
+    #[Test]
     public function stdWrap_wrapAlign(string $expect, string $content, mixed $wrapAlignConf): void
     {
         $conf = [];
@@ -7301,7 +7166,6 @@ final class ContentObjectRendererTest extends UnitTestCase
     /***************************************************************************
      * End of tests of stdWrap in alphabetical order
      ***************************************************************************/
-
     /***************************************************************************
      * Begin: Mixed tests
      *
@@ -7309,12 +7173,10 @@ final class ContentObjectRendererTest extends UnitTestCase
      * - Place tests in alphabetical order.
      * - Place data provider above test method.
      ***************************************************************************/
-
     /**
      * Check if getCurrentTable works properly.
-     *
-     * @test
      */
+    #[Test]
     public function getCurrentTable(): void
     {
         self::assertEquals('tt_content', $this->subject->getCurrentTable());
@@ -7386,12 +7248,12 @@ final class ContentObjectRendererTest extends UnitTestCase
     /**
      * Check if prefixComment works properly.
      *
-     * @test
-     * @dataProvider prefixCommentDataProvider
      * @param string $expect The expected output.
      * @param string $comment The parameter $comment.
      * @param string $content The parameter $content.
      */
+    #[DataProvider('prefixCommentDataProvider')]
+    #[Test]
     public function prefixComment(string $expect, string $comment, string $content): void
     {
         // The parameter $conf is never used. Just provide null.
@@ -7402,9 +7264,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check setter and getter of currentFile work properly.
-     *
-     * @test
      */
+    #[Test]
     public function setCurrentFile_getCurrentFile(): void
     {
         $storageMock = $this->createMock(ResourceStorage::class);
@@ -7419,9 +7280,9 @@ final class ContentObjectRendererTest extends UnitTestCase
      * Show it stored to $this->data[$this->currentValKey].
      * (The default value of currentValKey is tested elsewhere.)
      *
-     * @test
      * @see stdWrap_current()
      */
+    #[Test]
     public function setCurrentVal_getCurrentVal(): void
     {
         $key = StringUtility::getUniqueId();
@@ -7434,9 +7295,8 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     /**
      * Check setter and getter of userObjectType work properly.
-     *
-     * @test
      */
+    #[Test]
     public function setUserObjectType_getUserObjectType(): void
     {
         $value = StringUtility::getUniqueId();
@@ -7514,10 +7374,8 @@ final class ContentObjectRendererTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getGlobalDataProvider
-     */
+    #[DataProvider('getGlobalDataProvider')]
+    #[Test]
     public function getGlobalReturnsExpectedResult(mixed $expected, string $key, ?array $globals, ?array $source): void
     {
         if (isset($globals['HTTP_SERVER_VARS'])) {
@@ -7544,7 +7402,7 @@ final class ContentObjectRendererTest extends UnitTestCase
 
             public function getContentObject(
                 string $name,
-                \Psr\Http\Message\ServerRequestInterface $request,
+                ServerRequestInterface $request,
                 ContentObjectRenderer $contentObjectRenderer
             ): ?AbstractContentObject {
                 if (is_callable($this->getContentObjectCallbacks[$name] ?? null)) {
@@ -7577,9 +7435,7 @@ final class ContentObjectRendererTest extends UnitTestCase
         };
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function mergeTSRefResolvesRecursive(): void
     {
         $typoScriptString =
@@ -7640,19 +7496,15 @@ final class ContentObjectRendererTest extends UnitTestCase
 
     }
 
-    /**
-     * @test
-     * @dataProvider listNumDataProvider
-     */
+    #[DataProvider('listNumDataProvider')]
+    #[Test]
     public function listNum(string $expected, string $content, string $listNum, string $delimeter): void
     {
         $contentObjectRenderer = new ContentObjectRenderer();
         self::assertEquals($expected, $contentObjectRenderer->listNum($content, $listNum, $delimeter));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function listNumWithListNumRandReturnsString(): void
     {
         $contentObjectRenderer = new ContentObjectRenderer();
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/Exception/ProductionExceptionHandlerTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/Exception/ProductionExceptionHandlerTest.php
index e1357fab6904e73b4b4495e1d296d5d84bf9a05a..74ca20a9a32796eb62c6c593548512646d5ac88e 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/Exception/ProductionExceptionHandlerTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/Exception/ProductionExceptionHandlerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject\Exception;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Context\DateTimeAspect;
@@ -29,9 +30,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ProductionExceptionHandlerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function relayPropagateResponseException(): void
     {
         $exception = new PropagateResponseException(new HtmlResponse(''), 1607328584);
@@ -41,9 +40,7 @@ final class ProductionExceptionHandlerTest extends UnitTestCase
         $subject->handle($exception);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function relayImmediateResponseException(): void
     {
         $exception = new ImmediateResponseException(new HtmlResponse(''), 1533939251);
@@ -53,9 +50,7 @@ final class ProductionExceptionHandlerTest extends UnitTestCase
         $subject->handle($exception);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function handleReturnsMessageWithResolvedErrorCode(): void
     {
         $currentTimestamp = 1629993829;
@@ -76,9 +71,7 @@ final class ProductionExceptionHandlerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function handleReturnsCustomErrorMessageWithResolvedErrorCode(): void
     {
         $currentTimestamp = 1629993829;
@@ -102,9 +95,7 @@ final class ProductionExceptionHandlerTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function handleReturnsCustomErrorMessageWithResolvedErrorCodeForLegacyPlaceholder(): void
     {
         $currentTimestamp = 1629993829;
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/ImageContentObjectTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/ImageContentObjectTest.php
index de5f807ee41895b50e4fe495c4442ea228fe43b3..b69ca64241d5bb6da7c868b651111b5948582064 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/ImageContentObjectTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/ImageContentObjectTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Cache\Frontend\NullFrontend;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -69,10 +71,9 @@ final class ImageContentObjectTest extends UnitTestCase
 
     /**
      * Make sure that the rendering falls back to the classic <img style if nothing else is found
-     *
-     * @test
-     * @dataProvider getImageTagTemplateFallsBackToDefaultTemplateIfNoTemplateIsFoundDataProvider
      */
+    #[DataProvider('getImageTagTemplateFallsBackToDefaultTemplateIfNoTemplateIsFoundDataProvider')]
+    #[Test]
     public function getImageTagTemplateFallsBackToDefaultTemplateIfNoTemplateIsFound(?string $key, ?array $configuration): void
     {
         $defaultImgTagTemplate = '<img src="###SRC###" width="###WIDTH###" height="###HEIGHT###" ###PARAMS### ###ALTPARAMS### ###SELFCLOSINGTAGSLASH###>';
@@ -100,10 +101,9 @@ final class ImageContentObjectTest extends UnitTestCase
 
     /**
      * Assure if a layoutKey and layout is given the selected layout is returned
-     *
-     * @test
-     * @dataProvider getImageTagTemplateReturnTemplateElementIdentifiedByKeyDataProvider
      */
+    #[DataProvider('getImageTagTemplateReturnTemplateElementIdentifiedByKeyDataProvider')]
+    #[Test]
     public function getImageTagTemplateReturnTemplateElementIdentifiedByKey(string $key, array $configuration, string $expectation): void
     {
         $result = $this->subject->_call('getImageTagTemplate', $key, $configuration);
@@ -121,10 +121,9 @@ final class ImageContentObjectTest extends UnitTestCase
 
     /**
      * Make sure the source collection is empty if no valid configuration or source collection is defined
-     *
-     * @test
-     * @dataProvider getImageSourceCollectionReturnsEmptyStringIfNoSourcesAreDefinedDataProvider
      */
+    #[DataProvider('getImageSourceCollectionReturnsEmptyStringIfNoSourcesAreDefinedDataProvider')]
+    #[Test]
     public function getImageSourceCollectionReturnsEmptyStringIfNoSourcesAreDefined(
         ?string $layoutKey,
         ?array $configuration,
@@ -136,9 +135,8 @@ final class ImageContentObjectTest extends UnitTestCase
 
     /**
      * Make sure the generation of subimages calls the generation of the subimages and uses the layout -> source template
-     *
-     * @test
      */
+    #[Test]
     public function getImageSourceCollectionRendersDefinedSources(): void
     {
         $cObj = $this->getMockBuilder(ContentObjectRenderer::class)
@@ -227,10 +225,9 @@ final class ImageContentObjectTest extends UnitTestCase
 
     /**
      * Make sure the generation of subimages renders the expected HTML Code for the sourceset
-     *
-     * @test
-     * @dataProvider getImageSourceCollectionRendersDefinedLayoutKeyDataDefaultProvider
      */
+    #[DataProvider('getImageSourceCollectionRendersDefinedLayoutKeyDataDefaultProvider')]
+    #[Test]
     public function getImageSourceCollectionRendersDefinedLayoutKeyDefault(string $layoutKey, array $configuration): void
     {
         $cObj = $this->getMockBuilder(ContentObjectRenderer::class)
@@ -342,10 +339,9 @@ final class ImageContentObjectTest extends UnitTestCase
 
     /**
      * Make sure the generation of subimages renders the expected HTML Code for the sourceset
-     *
-     * @test
-     * @dataProvider getImageSourceCollectionRendersDefinedLayoutKeyDataDataProvider
      */
+    #[DataProvider('getImageSourceCollectionRendersDefinedLayoutKeyDataDataProvider')]
+    #[Test]
     public function getImageSourceCollectionRendersDefinedLayoutKeyData(
         string $layoutKey,
         array $configuration,
@@ -392,9 +388,8 @@ final class ImageContentObjectTest extends UnitTestCase
 
     /**
      * Make sure the hook in get sourceCollection is called
-     *
-     * @test
      */
+    #[Test]
     public function getImageSourceCollectionHookCalled(): void
     {
         $cObj = $this->getAccessibleMock(
@@ -518,12 +513,12 @@ final class ImageContentObjectTest extends UnitTestCase
     /**
      * Check if linkWrap works properly.
      *
-     * @test
-     * @dataProvider  linkWrapDataProvider
      * @param string $expected The expected output.
      * @param string $content The parameter $content.
      * @param string|null $wrap The parameter $wrap.
      */
+    #[DataProvider('linkWrapDataProvider')]
+    #[Test]
     public function linkWrap(string $expected, string $content, $wrap): void
     {
         $GLOBALS['TSFE']->config = ['rootLine' => [3 => ['uid' => 55]]];
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php
index 0fe2d887f0b49752e0f124a430f5863b3869a128..2b3c84dfc5f84c514094b5753e99a852b62b811f 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php
@@ -18,6 +18,8 @@ declare(strict_types=1);
 namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject\Menu;
 
 use Doctrine\DBAL\Result;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
@@ -128,9 +130,7 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         GeneralUtility::addInstance(ConnectionPool::class, $connectionPoolMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sectionIndexReturnsEmptyArrayIfTheRequestedPageCouldNotBeFetched(): void
     {
         $this->prepareSectionIndexTest();
@@ -141,9 +141,7 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         self::assertEquals([], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sectionIndexUsesTheInternalIdIfNoPageIdWasGiven(): void
     {
         $this->prepareSectionIndexTest();
@@ -155,9 +153,7 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         self::assertEquals([], $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sectionIndexThrowsAnExceptionIfTheInternalQueryFails(): void
     {
         $this->expectException(\UnexpectedValueException::class);
@@ -175,9 +171,7 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         $this->subject->_call('sectionIndex', 'field');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sectionIndexReturnsOverlaidRowBasedOnTheLanguageOfTheGivenPage(): void
     {
         $statementMock = $this->createMock(Result::class);
@@ -243,10 +237,8 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sectionIndexFiltersDataProvider
-     */
+    #[DataProvider('sectionIndexFiltersDataProvider')]
+    #[Test]
     public function sectionIndexFilters(int $expectedAmount, array $dataRow): void
     {
         $statementMock = $this->createMock(Result::class);
@@ -306,10 +298,8 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sectionIndexQueriesWithDifferentColPosDataProvider
-     */
+    #[DataProvider('sectionIndexQueriesWithDifferentColPosDataProvider')]
+    #[Test]
     public function sectionIndexQueriesWithDifferentColPos(array $configuration, string $colPosFromStdWrapValue, string $whereClausePrefix): void
     {
         $statementMock = $this->createMock(Result::class);
@@ -428,10 +418,8 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider isItemStateChecksExcludeUidListDataProvider
-     */
+    #[DataProvider('isItemStateChecksExcludeUidListDataProvider')]
+    #[Test]
     public function isItemStateChecksExcludeUidList(array $menuItems, string $excludeUidList, bool $expectedResult): void
     {
         $subject = $this->getAccessibleMockForAbstractClass(AbstractMenuContentObject::class, [], '', true, true, true, ['getRuntimeCache']);
@@ -623,10 +611,8 @@ final class AbstractMenuContentObjectTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider menuTypoLinkCreatesExpectedTypoLinkConfigurationDataProvider
-     */
+    #[DataProvider('menuTypoLinkCreatesExpectedTypoLinkConfigurationDataProvider')]
+    #[Test]
     public function menuTypoLinkCreatesExpectedTypoLinkConfiguration(array $expected, array $mconf, array $page, string $oTarget, string|int $addParams = '', string|int $typeOverride = '', int|string|null $overrideId = null): void
     {
         $expected['page'] = new Page($page);
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/MenuContentObjectFactoryTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/MenuContentObjectFactoryTest.php
index c661b7b88292d6595a649957fb0d5f750a864280..6d4968bc925c640c2255441fa71170d96bbda38f 100644
--- a/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/MenuContentObjectFactoryTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/MenuContentObjectFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject\Menu;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\StringUtility;
 use TYPO3\CMS\Frontend\ContentObject\Menu\AbstractMenuContentObject;
 use TYPO3\CMS\Frontend\ContentObject\Menu\Exception\NoSuchMenuTypeException;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MenuContentObjectFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getMenuObjectByTypeThrowsExceptionForUnknownType(): void
     {
         $this->expectException(NoSuchMenuTypeException::class);
@@ -36,27 +35,21 @@ final class MenuContentObjectFactoryTest extends UnitTestCase
         $factory->getMenuObjectByType(StringUtility::getUniqueId('foo_'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMenuObjectByTypeReturnsObjectForRegisteredMenuType(): void
     {
         $factory = new MenuContentObjectFactory();
         self::assertIsObject($factory->getMenuObjectByType('TMENU'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMenuObjectByTypeReturnsObjectWithLowercasedMenuType(): void
     {
         $factory = new MenuContentObjectFactory();
         self::assertIsObject($factory->getMenuObjectByType('tmenu'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMenuObjectByTypeReturnsInstanceOfOwnRegisteredTypeInsteadOfInternalType(): void
     {
         $factory = new MenuContentObjectFactory();
@@ -67,9 +60,7 @@ final class MenuContentObjectFactoryTest extends UnitTestCase
         self::assertInstanceOf($selfClassName, $factory->getMenuObjectByType('TMENU'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMenuObjectByTypeReturnsInstanceOfNewRegisteredType(): void
     {
         $factory = new MenuContentObjectFactory();
diff --git a/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php b/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php
index ac0b3b6054543b941501b62e24fa11493e4da961..9e34822ea78eb314808417179d9f6d61789b933d 100644
--- a/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\NormalizedParams;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Information\Typo3Information;
@@ -28,9 +29,7 @@ final class ErrorControllerTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function pageNotFoundHandlingReturns404ResponseIfNotConfigured(): void
     {
         $typo3InformationMock = $this->getMockBuilder(Typo3Information::class)->disableOriginalConstructor()->getMock();
@@ -44,9 +43,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertStringContainsString('This test page was not found!', $response->getBody()->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unavailableHandlingReturns503ResponseIfNotConfigured(): void
     {
         $typo3InformationMock = $this->getMockBuilder(Typo3Information::class)->disableOriginalConstructor()->getMock();
@@ -60,9 +57,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertStringContainsString('This page is temporarily unavailable.', $response->getBody()->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function unavailableHandlingDoesNotTriggerDueToDevIpMask(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'] = '*';
@@ -76,9 +71,7 @@ final class ErrorControllerTest extends UnitTestCase
         $subject->unavailableAction($request, 'All your system are belong to us!');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function internalErrorHandlingReturns500ResponseIfNotConfigured(): void
     {
         $typo3InformationMock = $this->getMockBuilder(Typo3Information::class)->disableOriginalConstructor()->getMock();
@@ -92,9 +85,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertStringContainsString('All your system are belong to us!', $response->getBody()->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function internalErrorHandlingDoesNotTriggerDueToDevIpMask(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'] = '*';
@@ -108,9 +99,7 @@ final class ErrorControllerTest extends UnitTestCase
         $subject->internalErrorAction($request, 'All your system are belong to us!');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithHtmlResponseIsChosenWhenNoSiteConfiguredForPageNotFoundAction(): void
     {
         $typo3InformationMock = $this->getMockBuilder(Typo3Information::class)->disableOriginalConstructor()->getMock();
@@ -125,9 +114,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertStringContainsString('Error handler is not configured.', $response->getBody()->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithJsonResponseIsChosenWhenNoSiteConfiguredForPageNotFoundAction(): void
     {
         $request = new ServerRequest();
@@ -140,9 +127,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertEquals(['reason' => 'Error handler is not configured.'], $responseContent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithHtmlResponseIsChosenWhenNoSiteConfiguredForUnavailableAction(): void
     {
         $typo3InformationMock = $this->getMockBuilder(Typo3Information::class)->disableOriginalConstructor()->getMock();
@@ -157,9 +142,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertStringContainsString('Error handler is not configured.', $response->getBody()->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithJsonResponseIsChosenWhenNoSiteConfiguredForUnavailableAction(): void
     {
         $request = new ServerRequest();
@@ -172,9 +155,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertEquals(['reason' => 'Error handler is not configured.'], $responseContent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithHtmlResponseIsChosenWhenNoSiteConfiguredForInternalErrorAction(): void
     {
         $typo3InformationMock = $this->getMockBuilder(Typo3Information::class)->disableOriginalConstructor()->getMock();
@@ -189,9 +170,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertStringContainsString('Error handler is not configured.', $response->getBody()->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithJsonResponseIsChosenWhenNoSiteConfiguredForInternalErrorAction(): void
     {
         $request = new ServerRequest();
@@ -204,9 +183,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertEquals(['reason' => 'Error handler is not configured.'], $responseContent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithHtmlResponseIsChosenWhenNoSiteConfiguredForAccessDeniedAction(): void
     {
         $typo3InformationMock = $this->getMockBuilder(Typo3Information::class)->disableOriginalConstructor()->getMock();
@@ -221,9 +198,7 @@ final class ErrorControllerTest extends UnitTestCase
         self::assertStringContainsString('Error handler is not configured.', $response->getBody()->getContents());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultErrorHandlerWithJsonResponseIsChosenWhenNoSiteConfiguredForAccessDeniedAction(): void
     {
         $request = new ServerRequest();
diff --git a/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php b/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php
index 7be3e682f787e70f39146dbceac915a44d192d61..d03c4c4d200d77d0b2512773e9983de0e128a4b8 100644
--- a/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -48,10 +50,8 @@ final class TypoScriptFrontendControllerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider baseUrlWrapHandlesDifferentUrlsDataProvider
-     * @test
-     */
+    #[DataProvider('baseUrlWrapHandlesDifferentUrlsDataProvider')]
+    #[Test]
     public function baseUrlWrapHandlesDifferentUrls(string $baseUrl, string $url, string $expected): void
     {
         $subject = $this->getMockBuilder(TypoScriptFrontendController::class)->disableOriginalConstructor()->onlyMethods([])->getMock();
diff --git a/typo3/sysext/frontend/Tests/Unit/DataProcessing/FlexFormProcessorTest.php b/typo3/sysext/frontend/Tests/Unit/DataProcessing/FlexFormProcessorTest.php
index 36f9c706b0c3769c84b946f00175a091aa32b11f..881bf0e0c0661eef5fb797a2d9c1c07a645b4a17 100644
--- a/typo3/sysext/frontend/Tests/Unit/DataProcessing/FlexFormProcessorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/DataProcessing/FlexFormProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\DataProcessing;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Service\FlexFormService;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -37,9 +38,7 @@ final class FlexFormProcessorTest extends UnitTestCase
         $this->prepareFlexFormService();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function customFieldNameDoesNotExistsWillReturnUnchangedProcessedData(): void
     {
         $processorConfiguration = ['as' => 'myOutputVariable', 'fieldName' => 'non_existing_field'];
@@ -65,9 +64,7 @@ final class FlexFormProcessorTest extends UnitTestCase
         self::assertSame($expected, $processedData);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function customFieldNameDoesNotContainFlexFormDataWillReturnUnchangedProcessedData(): void
     {
         $processorConfiguration = ['as' => 'myOutputVariable', 'fieldName' => 'custom_field'];
@@ -93,9 +90,7 @@ final class FlexFormProcessorTest extends UnitTestCase
         self::assertSame($expected, $processedData);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function customOutputVariableForProcessorWillReturnParsedFlexFormToDataCustomVariable(): void
     {
         $processorConfiguration = ['as' => 'myCustomVar'];
@@ -121,9 +116,7 @@ final class FlexFormProcessorTest extends UnitTestCase
         self::assertIsArray($expected['myCustomVar']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultOutputVariableForProcessorWillBeUsed(): void
     {
         $processorConfiguration = [];
@@ -150,9 +143,7 @@ final class FlexFormProcessorTest extends UnitTestCase
         self::assertIsArray($expected['flexFormData']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function defaultConfigurationWithCustomFieldNameWillReturnParsedFlexFormToDefaultOutputVariable(): void
     {
         $processorConfiguration = ['as' => 'myOutputVariable', 'fieldName' => 'my_flexform'];
@@ -178,9 +169,7 @@ final class FlexFormProcessorTest extends UnitTestCase
         self::assertIsArray($expected['myOutputVariable']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function subDataProcessorIsResolved(): void
     {
         $this->prepareFlexFormServiceWithSubDataProcessorData();
diff --git a/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteLanguageProcessorTest.php b/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteLanguageProcessorTest.php
index b3202cb8b41d8aa32a1562a0a79f6e6bbccedf96..5200e7b31a2786d610c0a366a9336649bf2200ab 100644
--- a/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteLanguageProcessorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteLanguageProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\DataProcessing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SiteLanguageProcessorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function siteLanguageIsRetrieved(): void
     {
         $expectedName = 'currentLanguage';
@@ -43,9 +42,7 @@ final class SiteLanguageProcessorTest extends UnitTestCase
         self::assertEquals($siteLanguage->toArray(), $processedData[$expectedName]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullIsProvidedIfSiteLanguageCouldNotBeRetrieved(): void
     {
         $expectedName = 'currentSiteLanguage';
diff --git a/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteProcessorTest.php b/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteProcessorTest.php
index d6a8f44d96782cb681cfcdeaaf2587c29c1a3bdb..56d9db51f53795d90d7a36e14cc18a7a0e72b425 100644
--- a/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteProcessorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/DataProcessing/SiteProcessorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\DataProcessing;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SiteProcessorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function siteIsRetrieved(): void
     {
         $expectedName = 'currentSite';
@@ -43,9 +42,7 @@ final class SiteProcessorTest extends UnitTestCase
         self::assertEquals($site, $processedData[$expectedName]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function nullIsProvidedIfSiteCouldNotBeRetrieved(): void
     {
         $expectedName = 'currentSite';
diff --git a/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php b/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php
index a74a8217e429f7e6bec617b544cedc3644599a08..3611320346fb3849955f278d3188faefa34b6324 100644
--- a/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Http;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\DependencyInjection\Container;
 use TYPO3\CMS\Core\EventDispatcher\ListenerProvider;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
@@ -90,10 +92,9 @@ final class RequestHandlerTest extends UnitTestCase
 
     /**
      * Does not test stdWrap functionality.
-     *
-     * @test
-     * @dataProvider generateHtmlTagIncludesAllPossibilitiesDataProvider
      */
+    #[DataProvider('generateHtmlTagIncludesAllPossibilitiesDataProvider')]
+    #[Test]
     public function generateHtmlTagIncludesAllPossibilities(array $htmlTagAttributes, array $configuration, string $expectedResult): void
     {
         $subject = $this->getAccessibleMock(RequestHandler::class, null, [], '', false);
@@ -103,9 +104,7 @@ final class RequestHandlerTest extends UnitTestCase
         self::assertEquals($expectedResult, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateMetaTagExpectExceptionOnBogusTags(): void
     {
         $stdWrapResult = '10';
@@ -268,10 +267,8 @@ final class RequestHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider generateMetaTagHtmlGeneratesCorrectTagsDataProvider
-     */
+    #[DataProvider('generateMetaTagHtmlGeneratesCorrectTagsDataProvider')]
+    #[Test]
     public function generateMetaTagHtmlGeneratesCorrectTags(array $typoScript, string $stdWrapResult, array $expectedTags): void
     {
         $siteLanguage = $this->createSiteWithLanguage()->getLanguageById(3);
@@ -315,9 +312,7 @@ final class RequestHandlerTest extends UnitTestCase
         $subject->_call('processHtmlBasedRenderingSettings', $frontendController, $siteLanguage, $request);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateMetaTagHtmlGenerateNoTagWithEmptyContent(): void
     {
         $stdWrapResult = '';
@@ -422,10 +417,8 @@ final class RequestHandlerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider generateMultipleMetaTagsDataProvider
-     */
+    #[DataProvider('generateMultipleMetaTagsDataProvider')]
+    #[Test]
     public function generateMultipleMetaTags(array $typoScript, string $stdWrapResult, array $expectedTags): void
     {
         $siteLanguage = $this->createSiteWithLanguage()->getLanguageById(3);
@@ -485,9 +478,8 @@ final class RequestHandlerTest extends UnitTestCase
 
     /**
      * Test if the method is called, and the globals are still the same after calling the method
-     *
-     * @test
      */
+    #[Test]
     public function resetGlobalsToCurrentRequestDoesNotModifyAnything(): void
     {
         $getVars = ['outside' => '1'];
@@ -507,9 +499,8 @@ final class RequestHandlerTest extends UnitTestCase
 
     /**
      * Test if the method is called, and the globals are still the same after calling the method
-     *
-     * @test
      */
+    #[Test]
     public function resetGlobalsToCurrentRequestWithModifiedRequestOverridesGlobals(): void
     {
         $getVars = ['typical' => '1'];
diff --git a/typo3/sysext/frontend/Tests/Unit/Imaging/GifBuilderTest.php b/typo3/sysext/frontend/Tests/Unit/Imaging/GifBuilderTest.php
index 28ed78a56e9c48c245524b7b2f6f95408c0ee22d..d8ddca5a8970d83846ea9d18157846e64f755712 100644
--- a/typo3/sysext/frontend/Tests/Unit/Imaging/GifBuilderTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Imaging/GifBuilderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Imaging;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Frontend\Imaging\GifBuilder;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -45,11 +47,8 @@ final class GifBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     * @dataProvider singleIntegerDataProvider
-     */
+    #[DataProvider('singleIntegerDataProvider')]
+    #[Test]
     public function calcOffsetWithSingleIntegerReturnsTheGivenIntegerAsString(string $number): void
     {
         $result = $this->subject->calcOffset($number);
@@ -57,9 +56,7 @@ final class GifBuilderTest extends UnitTestCase
         self::assertSame($number, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function calcOffsetWithMultipleIntegersReturnsTheGivenIntegerCommaSeparated(): void
     {
         $numbers = '1,2,3';
@@ -68,9 +65,7 @@ final class GifBuilderTest extends UnitTestCase
         self::assertSame($numbers, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function calcOffsetTrimsWhitespaceAroundProvidedNumbers(): void
     {
         $result = $this->subject->calcOffset(' 1, 2, 3 ');
@@ -89,11 +84,8 @@ final class GifBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     * @dataProvider roundingDataProvider
-     */
+    #[DataProvider('roundingDataProvider')]
+    #[Test]
     public function calcOffsetRoundsNumbersToNearestInteger(string $input, string $expectedResult): void
     {
         $result = $this->subject->calcOffset($input);
@@ -118,11 +110,8 @@ final class GifBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     *
-     * @dataProvider calculationDataProvider
-     */
+    #[DataProvider('calculationDataProvider')]
+    #[Test]
     public function calcOffsetDoesTheProvidedCalculation(string $input, string $expectedResult): void
     {
         $result = $this->subject->calcOffset($input);
diff --git a/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php b/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php
index 19b13f4e8c19f38762b9c3b0e1e1fa36df983ec3..1792a35309c7009b4f6190a3f571af33e5f50fce 100644
--- a/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Middleware;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Server\RequestHandlerInterface;
@@ -58,9 +59,7 @@ final class PageArgumentValidatorTest extends UnitTestCase
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = '';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function givenCacheHashWithoutRequiredParametersTriggersRedirect(): void
     {
         $incomingUrl = 'https://example.com/lotus-flower/en/mr-magpie/bloom/?cHash=XYZ';
@@ -79,9 +78,7 @@ final class PageArgumentValidatorTest extends UnitTestCase
         self::assertEquals($expectedResult, $response->getHeader('Location')[0]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function givenCacheHashNotMatchingCalculatedCacheHashTriggers404(): void
     {
         $incomingUrl = 'https://example.com/lotus-flower/en/mr-magpie/bloom/?cHash=YAZ';
@@ -100,9 +97,7 @@ final class PageArgumentValidatorTest extends UnitTestCase
         self::assertEquals(404, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function noPageArgumentsReturnsErrorResponse(): void
     {
         $incomingUrl = 'https://king.com/lotus-flower/en/mr-magpie/bloom/';
@@ -116,9 +111,7 @@ final class PageArgumentValidatorTest extends UnitTestCase
         self::assertEquals(404, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function staticPageArgumentsSkipProcessingAndReturnsSuccess(): void
     {
         $incomingUrl = 'https://example.com/lotus-flower/en/mr-magpie/bloom/';
@@ -133,9 +126,7 @@ final class PageArgumentValidatorTest extends UnitTestCase
         self::assertEquals(200, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidCacheHashWithDynamicArgumentsTriggers404(): void
     {
         $incomingUrl = 'https://example.com/lotus-flower/en/mr-magpie/bloom/';
diff --git a/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php b/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php
index c6cc712c1c1aadc297f4a8ae7be7a293c8a3f226..22ae69b4f1359f90ac1d00b0e7772613ae1228dd 100644
--- a/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Middleware;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Server\RequestHandlerInterface;
@@ -137,10 +139,8 @@ final class SiteBaseRedirectResolverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider doRedirectOnMissingOrSuperfluousRequestUrlDataProvider
-     * @test
-     */
+    #[DataProvider('doRedirectOnMissingOrSuperfluousRequestUrlDataProvider')]
+    #[Test]
     public function doRedirectOnMissingOrSuperfluousRequestUrl(
         string $incomingUrl,
         string $expectedRedirectUrl,
@@ -168,10 +168,8 @@ final class SiteBaseRedirectResolverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider checkIf404IsSiteLanguageIsDisabledInFrontendDataProvider
-     */
+    #[DataProvider('checkIf404IsSiteLanguageIsDisabledInFrontendDataProvider')]
+    #[Test]
     public function checkIf404IsSiteLanguageIsDisabledInFrontend(
         string $url,
         int $expectedStatusCode,
@@ -250,10 +248,8 @@ final class SiteBaseRedirectResolverTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider doNotRedirectOnBaseWithoutQueryDataProvider
-     * @test
-     */
+    #[DataProvider('doNotRedirectOnBaseWithoutQueryDataProvider')]
+    #[Test]
     public function doNotRedirectOnBaseWithoutQuery(
         string $incomingUrl,
         Site $site,
@@ -271,9 +267,7 @@ final class SiteBaseRedirectResolverTest extends UnitTestCase
         self::assertEquals(200, $response->getStatusCode());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function useDefaultLanguageIfNoLanguageIsGiven(): void
     {
         $incomingUrl = 'https://twenty.one/';
@@ -308,9 +302,7 @@ final class SiteBaseRedirectResolverTest extends UnitTestCase
         self::assertEquals('https://twenty.one/en/', $response->getHeader('Location')[0]);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function useFirstAvailableLanguageIfDefaultLanguageIsNotEnabledAndLanguageIsGiven(): void
     {
         $incomingUrl = 'https://twenty.one/';
diff --git a/typo3/sysext/frontend/Tests/Unit/Middleware/SiteResolverTest.php b/typo3/sysext/frontend/Tests/Unit/Middleware/SiteResolverTest.php
index 7ce2891fb8b9a72e15d31cd774617b7620e8dc51..f773c43d788f006dffe6ff5e86d8d1ee4e116219 100644
--- a/typo3/sysext/frontend/Tests/Unit/Middleware/SiteResolverTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Middleware/SiteResolverTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Middleware;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
@@ -92,9 +94,8 @@ final class SiteResolverTest extends UnitTestCase
      * Then the site handling gets triggered, and the URL is taken to resolve a site.
      *
      * This case tests against a site with no domain or scheme, and successfully finds it.
-     *
-     * @test
      */
+    #[Test]
     public function detectASingleSiteWhenProperRequestIsGiven(): void
     {
         $incomingUrl = 'https://a-random-domain.com/mysite/';
@@ -135,9 +136,8 @@ final class SiteResolverTest extends UnitTestCase
      * The result should be that site 2 is resolved by the router when calling
      *
      * www.random-result.com/mysubsite/you-know-why/
-     *
-     * @test
      */
+    #[Test]
     public function detectSubsiteInsideNestedUrlStructure(): void
     {
         $incomingUrl = 'https://www.random-result.com/mysubsite/you-know-why/';
@@ -217,10 +217,9 @@ final class SiteResolverTest extends UnitTestCase
      *
      * and site 3 when calling
      * www.random-result.com/mysubsite/micro-site/oh-yes-you-do/
-     *
-     * @test
-     * @dataProvider detectSubSubsiteInsideNestedUrlStructureDataProvider
      */
+    #[DataProvider('detectSubSubsiteInsideNestedUrlStructureDataProvider')]
+    #[Test]
     public function detectSubSubsiteInsideNestedUrlStructure($incomingUrl, $expectedSiteIdentifier, $expectedRootPageId, $expectedBase): void
     {
         $siteFinder = $this->createSiteFinder(
@@ -324,10 +323,9 @@ final class SiteResolverTest extends UnitTestCase
      *     Language: 2: /
      * Site 3: /mysubsite/micro-site/
      *     Language: 13: /ru/
-     *
-     * @test
-     * @dataProvider detectProperLanguageByIncomingUrlDataProvider
      */
+    #[DataProvider('detectProperLanguageByIncomingUrlDataProvider')]
+    #[Test]
     public function detectProperLanguageByIncomingUrl($incomingUrl, $expectedSiteIdentifier, $expectedRootPageId, $expectedLanguageId, $expectedBase): void
     {
         $siteFinder = $this->createSiteFinder(
diff --git a/typo3/sysext/frontend/Tests/Unit/Middleware/StaticRouteResolverTest.php b/typo3/sysext/frontend/Tests/Unit/Middleware/StaticRouteResolverTest.php
index 5d36c16b99dcbafd11addbccbfffa1dfbddfa2ae..f195dc83ce6e38063726b911e9af3b760a2282bc 100644
--- a/typo3/sysext/frontend/Tests/Unit/Middleware/StaticRouteResolverTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Middleware/StaticRouteResolverTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Middleware;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Server\RequestHandlerInterface;
@@ -45,9 +46,7 @@ final class StaticRouteResolverTest extends UnitTestCase
         };
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function invalidStaticRouteDoesNotWork(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
diff --git a/typo3/sysext/frontend/Tests/Unit/Page/CacheHashCalculatorTest.php b/typo3/sysext/frontend/Tests/Unit/Page/CacheHashCalculatorTest.php
index 14c2c8a7e056d937d5abd8936ec0a82e3acf1b1d..e4526c1bc38589ce8b6a079db0ababc9f8052f49 100644
--- a/typo3/sysext/frontend/Tests/Unit/Page/CacheHashCalculatorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Page/CacheHashCalculatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Frontend\Page\CacheHashCalculator;
 use TYPO3\CMS\Frontend\Page\CacheHashConfiguration;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -46,10 +48,8 @@ final class CacheHashCalculatorTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @dataProvider cacheHashCalculationDataProvider
-     * @test
-     */
+    #[DataProvider('cacheHashCalculationDataProvider')]
+    #[Test]
     public function cacheHashCalculationWorks(array $params, string $expected): void
     {
         self::assertEquals($expected, $this->subject->calculateCacheHash($params));
@@ -80,10 +80,8 @@ final class CacheHashCalculatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider getRelevantParametersDataprovider
-     * @test
-     */
+    #[DataProvider('getRelevantParametersDataprovider')]
+    #[Test]
     public function getRelevantParametersWorks(string $params, array $expected): void
     {
         $actual = $this->subject->getRelevantParameters($params);
@@ -117,18 +115,14 @@ final class CacheHashCalculatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider canGenerateForParametersDataProvider
-     * @test
-     */
+    #[DataProvider('canGenerateForParametersDataProvider')]
+    #[Test]
     public function canGenerateForParameters(string $params, string $expected): void
     {
         self::assertEquals($expected, $this->subject->generateForParameters($params));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function generateForParametersThrowsExceptionWhenIdIsNotSpecified(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -153,10 +147,8 @@ final class CacheHashCalculatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider parametersRequireCacheHashDataprovider
-     * @test
-     */
+    #[DataProvider('parametersRequireCacheHashDataprovider')]
+    #[Test]
     public function parametersRequireCacheHashWorks(string $params, bool $expected): void
     {
         self::assertEquals($expected, $this->subject->doParametersRequireCacheHash($params));
@@ -176,10 +168,9 @@ final class CacheHashCalculatorTest extends UnitTestCase
     /**
      * In case the $TYPO3_CONF_VARS[FE][cacheHash][cachedParametersWhiteList] is set, other parameters should not
      * influence the cHash (except the encryption key of course)
-     *
-     * @dataProvider canWhitelistParametersDataProvider
-     * @test
      */
+    #[DataProvider('canWhitelistParametersDataProvider')]
+    #[Test]
     public function canWhitelistParameters(string $params, string $expected): void
     {
         $this->subject->setConfiguration([
@@ -201,10 +192,8 @@ final class CacheHashCalculatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider canSkipParametersWithEmptyValuesDataProvider
-     * @test
-     */
+    #[DataProvider('canSkipParametersWithEmptyValuesDataProvider')]
+    #[Test]
     public function canSkipParametersWithEmptyValues(string $params, array $settings, array $expected): void
     {
         $this->subject->setConfiguration($settings);
diff --git a/typo3/sysext/frontend/Tests/Unit/Page/CacheHashConfigurationTest.php b/typo3/sysext/frontend/Tests/Unit/Page/CacheHashConfigurationTest.php
index 65decc3bfbd343d031b3e917078566570a6b7489..e01b04385fb7dba8322bb2f651d47ca9c56644c3 100644
--- a/typo3/sysext/frontend/Tests/Unit/Page/CacheHashConfigurationTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Page/CacheHashConfigurationTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
 use TYPO3\CMS\Core\Utility\PermutationUtility;
 use TYPO3\CMS\Frontend\Page\CacheHashConfiguration;
@@ -36,10 +38,8 @@ final class CacheHashConfigurationTest extends TestCase
         ]);
     }
 
-    /**
-     * @test
-     * @dataProvider nonArrayValueThrowsExceptionDataProvider
-     */
+    #[DataProvider('nonArrayValueThrowsExceptionDataProvider')]
+    #[Test]
     public function nonArrayValueThrowsException(string $aspect, mixed $value): void
     {
         $this->expectException(\LogicException::class);
@@ -60,10 +60,8 @@ final class CacheHashConfigurationTest extends TestCase
         ]);
     }
 
-    /**
-     * @test
-     * @dataProvider nonScalarValueThrowsExceptionDataProvider
-     */
+    #[DataProvider('nonScalarValueThrowsExceptionDataProvider')]
+    #[Test]
     public function nonScalarValueThrowsException(string $aspect, mixed $value): void
     {
         $this->expectException(\LogicException::class);
@@ -84,10 +82,8 @@ final class CacheHashConfigurationTest extends TestCase
         ]);
     }
 
-    /**
-     * @test
-     * @dataProvider emptyIndicatedValueThrowsExceptionDataProvider
-     */
+    #[DataProvider('emptyIndicatedValueThrowsExceptionDataProvider')]
+    #[Test]
     public function emptyIndicatedValueThrowsException(string $aspect, string $value): void
     {
         $this->expectException(\LogicException::class);
@@ -110,10 +106,8 @@ final class CacheHashConfigurationTest extends TestCase
         ]);
     }
 
-    /**
-     * @test
-     * @dataProvider equalsResolvesParameterValueDataProvider
-     */
+    #[DataProvider('equalsResolvesParameterValueDataProvider')]
+    #[Test]
     public function equalsResolvesParameterValue(string $aspect, array $values, array $positives, array $negatives): void
     {
         $configuration = new CacheHashConfiguration([$aspect => $values]);
@@ -140,10 +134,8 @@ final class CacheHashConfigurationTest extends TestCase
         ]);
     }
 
-    /**
-     * @test
-     * @dataProvider startsWithResolvesParameterValueDataProvider
-     */
+    #[DataProvider('startsWithResolvesParameterValueDataProvider')]
+    #[Test]
     public function startsWithResolvesParameterValue(string $aspect, array $values, array $positives, array $negatives): void
     {
         $configuration = new CacheHashConfiguration([$aspect => $values]);
@@ -170,10 +162,8 @@ final class CacheHashConfigurationTest extends TestCase
         ]);
     }
 
-    /**
-     * @test
-     * @dataProvider containsResolvesParameterValueDataProvider
-     */
+    #[DataProvider('containsResolvesParameterValueDataProvider')]
+    #[Test]
     public function containsResolvesParameterValue(string $aspect, array $values, array $positives, array $negatives): void
     {
         $configuration = new CacheHashConfiguration([$aspect => $values]);
@@ -191,10 +181,8 @@ final class CacheHashConfigurationTest extends TestCase
         return self::containsResolvesParameterValueDataProvider();
     }
 
-    /**
-     * @test
-     * @dataProvider appliesResolvesParameterValueDataProvider
-     */
+    #[DataProvider('appliesResolvesParameterValueDataProvider')]
+    #[Test]
     public function appliesResolvesParameterValue(string $aspect, array $values, array $positives, array $negatives): void
     {
         $configuration = new CacheHashConfiguration([$aspect => $values]);
diff --git a/typo3/sysext/frontend/Tests/Unit/Page/PageAccessFailureReasonsTest.php b/typo3/sysext/frontend/Tests/Unit/Page/PageAccessFailureReasonsTest.php
index a23d9bfed972accf9b8f14fedb6f7f18e7dcbce1..ce7b4e97a6d552e1abe32bed679b02fc35f5e672 100644
--- a/typo3/sysext/frontend/Tests/Unit/Page/PageAccessFailureReasonsTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Page/PageAccessFailureReasonsTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Frontend\Page\PageAccessFailureReasons;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PageAccessFailureReasonsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getMessageForReasonReturnsExpectedMessageForCode(): void
     {
         $subject = new PageAccessFailureReasons();
@@ -32,9 +31,7 @@ final class PageAccessFailureReasonsTest extends UnitTestCase
         self::assertEquals('No page on rootlevel found', $message);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getMessageForReasonThrowsExceptionForWrongCode(): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/frontend/Tests/Unit/Page/PageLayoutResolverTest.php b/typo3/sysext/frontend/Tests/Unit/Page/PageLayoutResolverTest.php
index 4ed96e6a42a92e27fa9c3a36cfeceb453a0ee0b4..b34d24079d8588e8939c34d0a78a1052c26c4a83 100644
--- a/typo3/sysext/frontend/Tests/Unit/Page/PageLayoutResolverTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Page/PageLayoutResolverTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Page;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Frontend\Page\PageLayoutResolver;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PageLayoutResolverTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getLayoutForPageFetchesSelectedPageDirectly(): void
     {
         $subject = new PageLayoutResolver();
@@ -32,9 +31,7 @@ final class PageLayoutResolverTest extends UnitTestCase
         self::assertEquals('1', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLayoutForPageTreatsSpecialMinusOneValueAsNone(): void
     {
         $subject = new PageLayoutResolver();
@@ -42,9 +39,7 @@ final class PageLayoutResolverTest extends UnitTestCase
         self::assertEquals('none', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLayoutForPageTreatsSpecialValueZeroOrEmptyAsDefaultWithEmptyRootLine(): void
     {
         $subject = new PageLayoutResolver();
@@ -57,9 +52,7 @@ final class PageLayoutResolverTest extends UnitTestCase
         self::assertEquals('default', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLayoutForPageTreatsSpecialValueZeroOrEmptyAsDefaultWhenNothingGivenInRootLine(): void
     {
         $subject = new PageLayoutResolver();
@@ -70,9 +63,7 @@ final class PageLayoutResolverTest extends UnitTestCase
         self::assertEquals('default', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLayoutForPageFetchesRootLinePagesUpUntilSomethingWasFound(): void
     {
         $subject = new PageLayoutResolver();
@@ -83,9 +74,7 @@ final class PageLayoutResolverTest extends UnitTestCase
         self::assertEquals('regular', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getLayoutForPageFetchesRootLinePagesUpWhenNoneWasSelectedExplicitly(): void
     {
         $subject = new PageLayoutResolver();
diff --git a/typo3/sysext/frontend/Tests/Unit/Processor/GalleryProcessorTest.php b/typo3/sysext/frontend/Tests/Unit/Processor/GalleryProcessorTest.php
index 86366970a9da352fda7e321d3262c44ba4857d10..8b34be5fca6824381819ff01c6f52728b3b70174 100644
--- a/typo3/sysext/frontend/Tests/Unit/Processor/GalleryProcessorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Processor/GalleryProcessorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Processor;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\FileReference;
 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
@@ -36,9 +38,7 @@ final class GalleryProcessorTest extends UnitTestCase
             ->getMock();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function processThrowsExceptionWhenFilesProcessedDataKeyIsNotFound(): void
     {
         $this->expectException(ContentRenderingException::class);
@@ -142,10 +142,8 @@ final class GalleryProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider galleryPositionDataProvider
-     */
+    #[DataProvider('galleryPositionDataProvider')]
+    #[Test]
     public function galleryPositionTest(array $processorConfiguration, array $expected): void
     {
         $processor = new GalleryProcessor();
@@ -159,9 +157,7 @@ final class GalleryProcessorTest extends UnitTestCase
         self::assertEquals($expected, $processedData['gallery']['position']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function maxGalleryWidthTest(): void
     {
         $processor = new GalleryProcessor();
@@ -175,9 +171,7 @@ final class GalleryProcessorTest extends UnitTestCase
         self::assertEquals(200, $processedData['gallery']['width']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function maxGalleryWidthWhenInTextTest(): void
     {
         $processor = new GalleryProcessor();
@@ -242,10 +236,8 @@ final class GalleryProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider countDataProvider
-     */
+    #[DataProvider('countDataProvider')]
+    #[Test]
     public function countResultTest(int $numberOfFiles, array $data, array $processorConfiguration, array $expected): void
     {
         $files = [];
@@ -427,10 +419,8 @@ final class GalleryProcessorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider calculateMediaWidthsAndHeightsDataProvider
-     */
+    #[DataProvider('calculateMediaWidthsAndHeightsDataProvider')]
+    #[Test]
     public function calculateMediaWidthsAndHeightsTest(array $testFiles, array $processorConfiguration, array $expected): void
     {
         $files = [];
diff --git a/typo3/sysext/frontend/Tests/Unit/Resource/FilePathSanitizerTest.php b/typo3/sysext/frontend/Tests/Unit/Resource/FilePathSanitizerTest.php
index 176e04b63148f1e08ca5848f80f841ad2ff91fd2..b4dcc496d5df8cad7ed5d609aea4e17878321e9d 100644
--- a/typo3/sysext/frontend/Tests/Unit/Resource/FilePathSanitizerTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Resource/FilePathSanitizerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Resource;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Resource\Exception\FileDoesNotExistException;
 use TYPO3\CMS\Core\Resource\Exception\InvalidFileException;
@@ -55,9 +57,7 @@ final class FilePathSanitizerTest extends UnitTestCase
         $this->testFilesToDelete[] = $fakePublicDir . '/index.php';
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function tryingToResolvePrivateResourcesFromComposerPackagesThrowsException(): void
     {
         $this->simulateWebRequestInComposerMode();
@@ -66,9 +66,7 @@ final class FilePathSanitizerTest extends UnitTestCase
         $subject->sanitize('EXT:frontend/Resources/Private/Templates/MainPage.html');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function settingSecondArgumentToFalseIsNotAllowed(): void
     {
         $this->expectException(\BadMethodCallException::class);
@@ -117,10 +115,8 @@ final class FilePathSanitizerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider publicAssetsInComposerModeResolvedCorrectlyDataProvider
-     */
+    #[DataProvider('publicAssetsInComposerModeResolvedCorrectlyDataProvider')]
+    #[Test]
     public function publicAssetsInComposerModeResolvedCorrectly(string $givenPathOrUrl, string $expectedPathOrUrl, ?bool $allowExtensionPath = null): void
     {
         $this->simulateWebRequestInComposerMode();
@@ -170,19 +166,15 @@ final class FilePathSanitizerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider sanitizeCorrectlyResolvesPathsAndUrlsDataProvider
-     */
+    #[DataProvider('sanitizeCorrectlyResolvesPathsAndUrlsDataProvider')]
+    #[Test]
     public function sanitizeCorrectlyResolvesPathsAndUrls(string $givenPathOrUrl, string $expectedPathOrUrl, ?bool $allowExtensionPath = null): void
     {
         $subject = new FilePathSanitizer();
         self::assertSame($expectedPathOrUrl, $subject->sanitize($givenPathOrUrl, $allowExtensionPath));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sanitizeFailsIfDirectoryGiven(): void
     {
         $this->expectException(FileDoesNotExistException::class);
@@ -190,9 +182,7 @@ final class FilePathSanitizerTest extends UnitTestCase
         $subject->sanitize(__DIR__);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function sanitizeThrowsExceptionWithInvalidFileName(): void
     {
         $this->expectException(InvalidFileNameException::class);
diff --git a/typo3/sysext/frontend/Tests/Unit/Typolink/AbstractTypolinkBuilderTest.php b/typo3/sysext/frontend/Tests/Unit/Typolink/AbstractTypolinkBuilderTest.php
index 9bc334f160d2292dca11b569fd5992c5e0bc0c4a..5d55f4ff5aa2d72fd2fd5212f2251d5e15c03654 100644
--- a/typo3/sysext/frontend/Tests/Unit/Typolink/AbstractTypolinkBuilderTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Typolink/AbstractTypolinkBuilderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Typolink;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\Container;
@@ -51,7 +53,6 @@ final class AbstractTypolinkBuilderTest extends UnitTestCase
     //////////////////////
     // Utility functions
     //////////////////////
-
     /**
      * Avoid logging to the file system (file writer is currently the only configured writer)
      */
@@ -165,9 +166,9 @@ final class AbstractTypolinkBuilderTest extends UnitTestCase
      * @param string $expected The expected URL
      * @param string $url The URL to parse and manipulate
      * @param array $configuration The configuration array
-     * @test
-     * @dataProvider forceAbsoluteUrlReturnsCorrectAbsoluteUrlDataProvider
      */
+    #[DataProvider('forceAbsoluteUrlReturnsCorrectAbsoluteUrlDataProvider')]
+    #[Test]
     public function forceAbsoluteUrlReturnsCorrectAbsoluteUrl(string $expected, string $url, array $configuration): void
     {
         Environment::initialize(
@@ -201,9 +202,7 @@ final class AbstractTypolinkBuilderTest extends UnitTestCase
         self::assertEquals($expected, $subject->_call('forceAbsoluteUrl', $url, $configuration));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function forceAbsoluteUrlReturnsCorrectAbsoluteUrlWithSubfolder(): void
     {
         Environment::initialize(
@@ -276,10 +275,8 @@ final class AbstractTypolinkBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider resolveTargetAttributeDataProvider
-     */
+    #[DataProvider('resolveTargetAttributeDataProvider')]
+    #[Test]
     public function canResolveTheTargetAttribute(
         string $expected,
         array $conf,
diff --git a/typo3/sysext/frontend/Tests/Unit/Typolink/DatabaseRecordLinkBuilderTest.php b/typo3/sysext/frontend/Tests/Unit/Typolink/DatabaseRecordLinkBuilderTest.php
index 0ec7469fc2280402383311ada6fb07967e0452d5..2bdd9ae4ac4d46125cb2813566159756ff0ea6b6 100644
--- a/typo3/sysext/frontend/Tests/Unit/Typolink/DatabaseRecordLinkBuilderTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Typolink/DatabaseRecordLinkBuilderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Typolink;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Backend\LinkHandler\RecordLinkHandler;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Core\Domain\Repository\PageRepository;
@@ -88,10 +90,9 @@ final class DatabaseRecordLinkBuilderTest extends UnitTestCase
      * in the default link handler configuration
      *
      * Note that the TypolinkCodecService is not mocked on purpose to get the full unit tested.
-     *
-     * @test
-     * @dataProvider attributesSetInRecordLinkOverwriteConfiguredAttributesDataProvider
      */
+    #[DataProvider('attributesSetInRecordLinkOverwriteConfiguredAttributesDataProvider')]
+    #[Test]
     public function attributesSetInRecordLinkOverwriteConfiguredAttributes(string $parameterFromTypoScript, string $parameterFromDb, string $expectedParameter): void
     {
         $confFromDb = [
diff --git a/typo3/sysext/frontend/Tests/Unit/Typolink/LinkVarsCalculatorTest.php b/typo3/sysext/frontend/Tests/Unit/Typolink/LinkVarsCalculatorTest.php
index c8a7b08fe8b77e4240a14f11378ebf9aaea1ab23..2312513bf70950845853359d44ec568d1e2d5f0b 100644
--- a/typo3/sysext/frontend/Tests/Unit/Typolink/LinkVarsCalculatorTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Typolink/LinkVarsCalculatorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Typolink;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Context\Context;
 use TYPO3\CMS\Frontend\Typolink\LinkVarsCalculator;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -62,10 +64,8 @@ final class LinkVarsCalculatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider calculateLinkVarsDataProvider
-     */
+    #[DataProvider('calculateLinkVarsDataProvider')]
+    #[Test]
     public function calculateLinkVarsConsidersCorrectVariables(string $linkVars, array $getVars, string $expected): void
     {
         $subject = new LinkVarsCalculator();
@@ -177,10 +177,8 @@ final class LinkVarsCalculatorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider splitLinkVarsDataProvider
-     */
+    #[DataProvider('splitLinkVarsDataProvider')]
+    #[Test]
     public function splitLinkVarsStringSplitsStringByComma(string $string, array $expected): void
     {
         $subject = $this->getAccessibleMock(LinkVarsCalculator::class, null);
diff --git a/typo3/sysext/frontend/Tests/Unit/Typolink/PageLinkBuilderTest.php b/typo3/sysext/frontend/Tests/Unit/Typolink/PageLinkBuilderTest.php
index 0804e821e8c18654bddb3c2c03c6b5e1fdbd36f8..0b251c623746bb992d6e9e8f6e07b9911f5364ec 100644
--- a/typo3/sysext/frontend/Tests/Unit/Typolink/PageLinkBuilderTest.php
+++ b/typo3/sysext/frontend/Tests/Unit/Typolink/PageLinkBuilderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\Unit\Typolink;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Routing\PageArguments;
 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
@@ -47,10 +49,8 @@ final class PageLinkBuilderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getQueryArgumentsExcludesParametersDataProvider
-     */
+    #[DataProvider('getQueryArgumentsExcludesParametersDataProvider')]
+    #[Test]
     public function getQueryArgumentsExcludesParameters(string $queryString, string $queryInformation, array $configuration, string $expectedResult): void
     {
         parse_str($queryString, $queryParameters);
diff --git a/typo3/sysext/frontend/Tests/UnitDeprecated/Resource/FilePathSanitizerTest.php b/typo3/sysext/frontend/Tests/UnitDeprecated/Resource/FilePathSanitizerTest.php
index ca5c18e990946acf4e96036c16fcbdc12ac8af54..7af1720249d088c5b00f5408e057ec578f0c7c90 100644
--- a/typo3/sysext/frontend/Tests/UnitDeprecated/Resource/FilePathSanitizerTest.php
+++ b/typo3/sysext/frontend/Tests/UnitDeprecated/Resource/FilePathSanitizerTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Frontend\Tests\UnitDeprecated\Resource;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Frontend\Resource\FilePathSanitizer;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FilePathSanitizerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function sanitizeCorrectlyResolvesPathsForLegacySystemsEvenForPrivateResources(): void
     {
         $subject = new FilePathSanitizer();
diff --git a/typo3/sysext/impexp/Tests/Unit/ExportTest.php b/typo3/sysext/impexp/Tests/Unit/ExportTest.php
index 8f1a442785cceb52f8eb7c117aa7c3cf400f659b..6089c444dcdc70c6c9646658d162eb8e4613aeba 100644
--- a/typo3/sysext/impexp/Tests/Unit/ExportTest.php
+++ b/typo3/sysext/impexp/Tests/Unit/ExportTest.php
@@ -15,6 +15,8 @@
 
 namespace TYPO3\CMS\Impexp\Tests\Unit;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Resource\File;
@@ -37,10 +39,8 @@ final class ExportTest extends UnitTestCase
         $this->exportMock->_set('compressionAvailable', true);
     }
 
-    /**
-     * @test
-     * @dataProvider setExportFileNameSanitizesFileNameProvider
-     */
+    #[DataProvider('setExportFileNameSanitizesFileNameProvider')]
+    #[Test]
     public function setExportFileNameSanitizesFileName(string $fileName, string $expected): void
     {
         $this->exportMock->setExportFileName($fileName);
@@ -59,9 +59,7 @@ final class ExportTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrGenerateExportFileNameWithFileExtensionConsidersPidAndLevels(): void
     {
         $this->exportMock->setPid(1);
@@ -70,9 +68,7 @@ final class ExportTest extends UnitTestCase
         self::assertMatchesRegularExpression("/T3D_tree_PID1_L2_$patternDateTime.xml/", $this->exportMock->getOrGenerateExportFileNameWithFileExtension());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrGenerateExportFileNameWithFileExtensionConsidersRecords(): void
     {
         $this->exportMock->setRecord(['page:1', 'tt_content:1']);
@@ -80,9 +76,7 @@ final class ExportTest extends UnitTestCase
         self::assertMatchesRegularExpression("/T3D_recs_page_1-tt_conte_$patternDateTime.xml/", $this->exportMock->getOrGenerateExportFileNameWithFileExtension());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getOrGenerateExportFileNameWithFileExtensionConsidersLists(): void
     {
         $this->exportMock->setList(['sys_news:0', 'news:12']);
@@ -99,28 +93,22 @@ final class ExportTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider setExportFileTypeSucceedsWithSupportedFileTypeProvider
-     */
+    #[DataProvider('setExportFileTypeSucceedsWithSupportedFileTypeProvider')]
+    #[Test]
     public function setExportFileTypeSucceedsWithSupportedFileType(string $fileType): void
     {
         $this->exportMock->setExportFileType($fileType);
         self::assertEquals($fileType, $this->exportMock->getExportFileType());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setExportFileTypeFailsWithUnsupportedFileType(): void
     {
         $this->expectException(\Exception::class);
         $this->exportMock->setExportFileType('json');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixFileIdInRelationsProcessesOriginalRelationsArray(): void
     {
         $relations = [
@@ -188,10 +176,8 @@ final class ExportTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArrayDataProvider
-     */
+    #[DataProvider('removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArrayDataProvider')]
+    #[Test]
     public function removeRedundantSoftRefsInRelationsProcessesOriginalRelationsArray(array $relations, array $expected): void
     {
         $resourceFactoryMock = $this->getAccessibleMock(
@@ -344,10 +330,9 @@ final class ExportTest extends UnitTestCase
 
     /**
      * Temporary test until there is a complex functional test which tests exportAddFilesFromRelations() implicitly.
-     *
-     * @test
-     * @dataProvider exportAddFilesFromRelationsSucceedsDataProvider
      */
+    #[DataProvider('exportAddFilesFromRelationsSucceedsDataProvider')]
+    #[Test]
     public function exportAddFilesFromRelationsSucceeds(array $dat, array $expected): void
     {
         $exportMock = $this->getAccessibleMock(
diff --git a/typo3/sysext/indexed_search/Tests/Unit/IndexerTest.php b/typo3/sysext/indexed_search/Tests/Unit/IndexerTest.php
index bdc69dff987c169b944149acc915e1bc3d174d4b..704b0502188cafe55167056a2f4ebbf2317755f4 100644
--- a/typo3/sysext/indexed_search/Tests/Unit/IndexerTest.php
+++ b/typo3/sysext/indexed_search/Tests/Unit/IndexerTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\IndexedSearch\Tests\Unit;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Http\NormalizedParams;
 use TYPO3\CMS\Core\Http\ServerRequest;
@@ -38,9 +39,7 @@ final class IndexerTest extends UnitTestCase
         $GLOBALS['TYPO3_REQUEST'] = $request;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractHyperLinksDoesNotReturnNonExistingLocalPath(): void
     {
         $html = 'test <a href="' . StringUtility::getUniqueId() . '">test</a> test';
@@ -50,9 +49,7 @@ final class IndexerTest extends UnitTestCase
         self::assertEquals('', $result[0]['localPath']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractHyperLinksReturnsCorrectPathWithBaseUrl(): void
     {
         $baseURL = $GLOBALS['TYPO3_REQUEST']->getAttribute('normalizedParams')->getSiteUrl();
@@ -63,9 +60,7 @@ final class IndexerTest extends UnitTestCase
         self::assertEquals(Environment::getPublicPath() . '/index.php', $result[0]['localPath']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractHyperLinksFindsCorrectPathWithAbsolutePath(): void
     {
         $html = 'test <a href="index.php">test</a> test';
@@ -75,9 +70,7 @@ final class IndexerTest extends UnitTestCase
         self::assertEquals(Environment::getPublicPath() . '/index.php', $result[0]['localPath']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractHyperLinksFindsCorrectPathForPathWithinTypo3Directory(): void
     {
         $html = 'test <a href="typo3/index.php">test</a> test';
@@ -87,9 +80,7 @@ final class IndexerTest extends UnitTestCase
         self::assertEquals(Environment::getPublicPath() . '/typo3/index.php', $result[0]['localPath']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractHyperLinksFindsCorrectPathUsingAbsRefPrefix(): void
     {
         $absRefPrefix = '/' . StringUtility::getUniqueId();
@@ -107,9 +98,7 @@ final class IndexerTest extends UnitTestCase
         self::assertEquals(Environment::getPublicPath() . '/index.php', $result[0]['localPath']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function extractBaseHrefExtractsBaseHref(): void
     {
         $baseHref = 'http://example.com/';
@@ -121,9 +110,8 @@ final class IndexerTest extends UnitTestCase
 
     /**
      * Tests whether indexer can extract content between "TYPO3SEARCH_begin" and "TYPO3SEARCH_end" markers
-     *
-     * @test
      */
+    #[Test]
     public function typoSearchTagsRemovesBodyContentOutsideMarkers(): void
     {
         $body = <<<EOT
@@ -165,9 +153,8 @@ EOT;
 
     /**
      * Tests whether indexer can extract content between multiple pairs of "TYPO3SEARCH" markers
-     *
-     * @test
      */
+    #[Test]
     public function typoSearchTagsHandlesMultipleMarkerPairs(): void
     {
         $body = <<<EOT
diff --git a/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php b/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php
index 5f072f567894393e81921218df0a7efb4cee8c64..62506527f6768b9a27e4b022a6652ae3cdfb971c 100644
--- a/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php
+++ b/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\View\ViewInterface;
 use TYPO3\CMS\Install\Controller\UpgradeController;
@@ -46,10 +48,8 @@ final class UpgradeControllerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider versionDataProvider
-     * @test
-     */
+    #[DataProvider('versionDataProvider')]
+    #[Test]
     public function versionIsAsserted(string $version, bool $expectsException): void
     {
         if ($expectsException) {
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
index eeae82123607b9dbad97625f1dfbeed2f0acad6c..f35a8867e4ec8e25025be5a4c6630e9908f22289 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/CodeStatisticsTest.php
@@ -19,14 +19,13 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php;
 
 use PhpParser\NodeTraverser;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\CodeStatistics;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CodeStatisticsTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function enterNodeSumsStatistics(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php
index e899cfda6304f2a879aa2241710758b2fbd5e1f3..3aa535367c6ffa6ef7099e8289c14a2caf065163 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/GeneratorClassesResolverTest.php
@@ -24,15 +24,14 @@ use PhpParser\Node\Expr\StaticCall;
 use PhpParser\Node\Name\FullyQualified;
 use PhpParser\NodeTraverser;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\AbstractCoreMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class GeneratorClassesResolverTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function visitorCreatesFullyQualifiedNameFromStringArgumentInMakeInstance(): void
     {
         $phpCode = <<<'EOC'
@@ -53,9 +52,7 @@ EOC;
         self::assertInstanceOf(New_::class, $node->getAttribute(AbstractCoreMatcher::NODE_RESOLVED_AS));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function visitorDoesNotTransformDynamicallyCreatesFullyQualifiedNameFromStringArgumentInMakeInstance(): void
     {
         $phpCode = <<<'EOC'
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/AbstractCoreMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/AbstractCoreMatcherTest.php
index d7d100ae51578a299719286c5d2c41ee12a986ec..fbab6f0a1ee8dff4099255eec244319aa355bafb 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/AbstractCoreMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/AbstractCoreMatcherTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\AbstractCoreMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AbstractCoreMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function validateMatcherDefinitionsRunsFineWithProperDefinition(): void
     {
         $matcher = $this->getAccessibleMockForAbstractClass(AbstractCoreMatcher::class, [], '', false);
@@ -40,9 +39,7 @@ final class AbstractCoreMatcherTest extends UnitTestCase
         $matcher->_call('validateMatcherDefinitions', ['requiredArg1']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateMatcherDefinitionsThrowsIfRequiredArgIsNotInConfig(): void
     {
         $matcher = $this->getAccessibleMockForAbstractClass(AbstractCoreMatcher::class, [], '', false);
@@ -60,9 +57,7 @@ final class AbstractCoreMatcherTest extends UnitTestCase
         $matcher->_call('validateMatcherDefinitions', ['requiredArg1']);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateMatcherDefinitionsThrowsWithMissingRestFiles(): void
     {
         $matcher = $this->getAccessibleMockForAbstractClass(AbstractCoreMatcher::class, [], '', false);
@@ -77,9 +72,7 @@ final class AbstractCoreMatcherTest extends UnitTestCase
         $matcher->_call('validateMatcherDefinitions', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function validateMatcherDefinitionsThrowsWithEmptySingleRestFile(): void
     {
         $matcher = $this->getAccessibleMockForAbstractClass(AbstractCoreMatcher::class, [], '', false);
@@ -97,9 +90,7 @@ final class AbstractCoreMatcherTest extends UnitTestCase
         $matcher->_call('validateMatcherDefinitions', []);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function initializeMethodNameArrayThrowsWithInvalidKeys(): void
     {
         $matcher = $this->getAccessibleMockForAbstractClass(AbstractCoreMatcher::class, [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
index 9f0f25101a977c3050d6dd9372d8ff55d730b840..264678db60ef649fe1570d6facbff6bc7081bf86 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayDimensionMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ArrayDimensionMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ArrayDimensionMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -118,10 +118,8 @@ final class ArrayDimensionMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
index dad1a5012a187a0da9c866b8ae22d7eed6eb6627..4e4aad346126126079f3af2bdc77ab4d0cc479ac 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ArrayGlobalMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ArrayGlobalMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ArrayGlobalMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -83,10 +83,8 @@ final class ArrayGlobalMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
index 1b003af86698349ee3ae512a8847eabf748b8cc9..b6d144818e53234183463a96eb8a319fe067f091 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassConstantMatcherTest.php
@@ -20,15 +20,15 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ClassConstantMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ClassConstantMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -92,10 +92,8 @@ final class ClassConstantMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
index 2fa4180b48bbf3e61971607e752e4b653a6b7d4e..8e46a0831c5d8a0d6835afdf96c2a1e1114d848e 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ClassNameMatcherTest.php
@@ -20,15 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ClassNameMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ClassNameMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
index 5ca0762515e893794ca06b28b5b63d67e6360a95..337f18d334db4057cbd12dcf51e709327988885c 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstantMatcherTest.php
@@ -20,15 +20,15 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ConstantMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ConstantMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -85,10 +85,8 @@ final class ConstantMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php
index c1bc543451c349282b37eed1d3cdec392d24c3c8..040ca6a2ab249532e400a239d91b617f22cfb408 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/ConstructorArgumentMatcherTest.php
@@ -20,6 +20,8 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\ConstructorArgumentMatcher;
@@ -72,10 +74,8 @@ final class ConstructorArgumentMatcherTest extends TestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider hitsFromFixtureAreFoundDataProvider
-     */
+    #[DataProvider('hitsFromFixtureAreFoundDataProvider')]
+    #[Test]
     public function hitsFromFixtureAreFound(array $configuration, array $expectation): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
index 8e19b4254a610724d4d9d2db74d322c32d67aeb1..7e7259d74525f2e96c14f72c1e6b755bea462d5e 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/FunctionCallMatcherTest.php
@@ -20,14 +20,13 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\FunctionCallMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class FunctionCallMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -59,9 +58,7 @@ final class FunctionCallMatcherTest extends UnitTestCase
         self::assertEquals($expectedHitLineNumbers, $actualHitLineNumbers);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchIsIgnoredIfIgnoreFileIsSet(): void
     {
         $phpCode = <<<'EOC'
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php
index 5648bc3238efbf24c6a467855957f928ff9f1e88..c69ac7d974148cdc186d68cea7eacc27ca113870 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/InterfaceMethodChangedMatcherTest.php
@@ -20,14 +20,13 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\InterfaceMethodChangedMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class InterfaceMethodChangedMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php
index 215758941d6c40279c3d015e79a23aabd97c92c3..f2ed09bc07f93e0aea991b3d5870c55612dad54f 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodAnnotationMatcherTest.php
@@ -20,14 +20,13 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodAnnotationMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodAnnotationMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
index 11a9f5e70f436df7a8130904f136d1024f8aacc3..78d0e0c428f99406f2b2be61bb4b3d9067ec94ea 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentDroppedMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodArgumentDroppedMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -219,10 +219,8 @@ final class MethodArgumentDroppedMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
index 6f96a75057d2f6fb91bca3ff666076746520e6a5..083b114e480a86b366f3f31d248f3b5a6e2e08f2 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentDroppedStaticMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentDroppedStaticMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodArgumentDroppedStaticMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -222,10 +222,8 @@ final class MethodArgumentDroppedStaticMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php
index 5444e65826a8644636206a5cd387bcc6e1086ad1..c6ac7a2b0455f2937da884b8cf858345dda96e1b 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentRequiredMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodArgumentRequiredMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -212,10 +212,8 @@ final class MethodArgumentRequiredMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php
index d384c1e622c7946aecb178601aef1d56340b5075..9c92c6cc8e8152d38a99c3615a51a4ff264f1928 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentRequiredStaticMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentRequiredStaticMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodArgumentRequiredStaticMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -190,10 +190,8 @@ final class MethodArgumentRequiredStaticMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
index a09815bc7cd58f2ffa38da84fee1b0aa1328db95..f57591b5fa2b1f15323416c3bc8eda5cefca66b6 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodArgumentUnusedMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodArgumentUnusedMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodArgumentUnusedMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -208,10 +208,8 @@ final class MethodArgumentUnusedMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
index 97062abfeb1ebfc5f35bb4e1faac1e13adc50d5c..172af55b7a8f73f32830181465d1281b3b49aaa4 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodCallMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodCallMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -62,9 +62,7 @@ final class MethodCallMatcherTest extends UnitTestCase
         self::assertEquals($expectedHitLineNumbers, $actualHitLineNumbers);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchIsIgnoredIfIgnoreFileIsSet(): void
     {
         $phpCode = <<<'EOC'
@@ -302,10 +300,8 @@ EOC;
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
index 77125199e0a150042ca0ac76d6891cbb32882395..616fbb561caa81e2ce1dd41481c19c1d15036202 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/MethodCallStaticMatcherTest.php
@@ -20,15 +20,15 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\GeneratorClassesResolver;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\MethodCallStaticMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MethodCallStaticMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -263,10 +263,8 @@ final class MethodCallStaticMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php
index 50e91dcdbd45304357c3f5e2a200708562e578da..22c74b51437a51c6c375153faa064f4886fa806f 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyAnnotationMatcherTest.php
@@ -20,14 +20,13 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyAnnotationMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PropertyAnnotationMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php
index 676e3764f85dbf42f2d5f905e495ba0f64008230..e62155b7d9039738bc63f35afc1fc7495f7df84b 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyExistsStaticMatcherTest.php
@@ -20,14 +20,13 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyExistsStaticMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PropertyExistsStaticMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
index 77180b2258447d4a24b0203dfc2273a90f1dd631..bd4235a7d36e39b57f79e88615e6c37c19888327 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyProtectedMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyProtectedMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PropertyProtectedMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -117,10 +117,8 @@ final class PropertyProtectedMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
index f1077840c46e6707f8123cb816c374fcd7a41e78..0f6142226237dce6726c8bfb7f05edab14b97519 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/Matcher/PropertyPublicMatcherTest.php
@@ -20,14 +20,14 @@ namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php\Matcher;
 use PhpParser\NodeTraverser;
 use PhpParser\NodeVisitor\NameResolver;
 use PhpParser\ParserFactory;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\Matcher\PropertyPublicMatcher;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PropertyPublicMatcherTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hitsFromFixtureAreFound(): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
@@ -117,10 +117,8 @@ final class PropertyPublicMatcherTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider matchesReturnsExpectedRestFilesDataProvider
-     */
+    #[DataProvider('matchesReturnsExpectedRestFilesDataProvider')]
+    #[Test]
     public function matchesReturnsExpectedRestFiles(array $configuration, string $phpCode, array $expected): void
     {
         $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
diff --git a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/MatcherFactoryTest.php b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/MatcherFactoryTest.php
index 5da6a8a51104639b6a9ced695e059c1a5b659143..0e3329a5c8babf9cc9fb104323ef03e41edd9ea0 100644
--- a/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/MatcherFactoryTest.php
+++ b/typo3/sysext/install/Tests/Unit/ExtensionScanner/Php/MatcherFactoryTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\ExtensionScanner\Php;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\ExtensionScanner\Php\MatcherFactory;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class MatcherFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function createAllThrowWithMissingClass(): void
     {
         $subject = new MatcherFactory();
@@ -38,9 +37,7 @@ final class MatcherFactoryTest extends UnitTestCase
         $subject->createAll($configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAllThrowsWithMissingConfiguration(): void
     {
         $subject = new MatcherFactory();
@@ -54,9 +51,7 @@ final class MatcherFactoryTest extends UnitTestCase
         $subject->createAll($configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAllThrowsWithBothConfigurationFileAndConfigurationArray(): void
     {
         $subject = new MatcherFactory();
@@ -72,9 +67,7 @@ final class MatcherFactoryTest extends UnitTestCase
         $subject->createAll($configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAllThrowsIfConfigurationFileDoesNotExist(): void
     {
         $subject = new MatcherFactory();
@@ -89,9 +82,7 @@ final class MatcherFactoryTest extends UnitTestCase
         $subject->createAll($configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAllThrowsIfConfigurationFileDoesNotReturnArray(): void
     {
         $subject = new MatcherFactory();
@@ -106,9 +97,7 @@ final class MatcherFactoryTest extends UnitTestCase
         $subject->createAll($configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAllThrowsIfConfigurationArrayIsNotAnArray(): void
     {
         $subject = new MatcherFactory();
@@ -123,9 +112,7 @@ final class MatcherFactoryTest extends UnitTestCase
         $subject->createAll($configuration);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createAllThrowIfMatcherDoesNotImplementCodeScannerInterface(): void
     {
         $subject = new MatcherFactory();
diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/AbstractNodeTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/AbstractNodeTest.php
index c0191e292c107945b7fb1c679075e8b622310548..58afce216278db56c88ed5a92aac01fc5fb1ff8e 100644
--- a/typo3/sysext/install/Tests/Unit/FolderStructure/AbstractNodeTest.php
+++ b/typo3/sysext/install/Tests/Unit/FolderStructure/AbstractNodeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\FolderStructure;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -29,9 +30,7 @@ use TYPO3\CMS\Install\FolderStructure\RootNodeInterface;
 
 final class AbstractNodeTest extends AbstractFolderStructureTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getNameReturnsSetName(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -40,9 +39,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($name, $node->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetPermissionReturnsSetTargetPermission(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -51,9 +48,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($permission, $node->_call('getTargetPermission'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getChildrenReturnsSetChildren(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -62,9 +57,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($children, $node->_call('getChildren'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getParentReturnsSetParent(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -73,9 +66,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($parent, $node->_call('getParent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAbsolutePathCallsParentForPathAndAppendsOwnName(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -88,9 +79,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($parentPath . '/' . $name, $node->getAbsolutePath());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isWritableCallsParentIsWritable(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -100,9 +89,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         $node->isWritable();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isWritableReturnsWritableStatusOfParent(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -112,9 +99,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->isWritable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsTrueIfNodeExists(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, ['getAbsolutePath'], [], '', false);
@@ -123,9 +108,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('exists'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsTrueIfIsLinkAndTargetIsDead(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, ['getAbsolutePath'], [], '', false);
@@ -141,9 +124,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('exists'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function existsReturnsFalseIfNodeNotExists(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, ['getAbsolutePath'], [], '', false);
@@ -152,9 +133,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertFalse($node->_call('exists'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionThrowsExceptionIfPermissionAreAlreadyCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -171,9 +150,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         $node->_call('fixPermission');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixPermissionReturnsOkStatusIfPermissionCanBeFixedAndSetsPermissionToCorrectValue(): void
     {
         $node = $this->getAccessibleMock(
@@ -196,9 +173,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame('2770', $resultDirectoryPermissions);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPermissionCorrectReturnsTrueOnWindowsOs(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, ['isWindowsOs'], [], '', false);
@@ -206,9 +181,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('isPermissionCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPermissionCorrectReturnsFalseIfTargetPermissionAndCurrentPermissionAreNotIdentical(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, ['isWindowsOs', 'getCurrentPermission'], [], '', false);
@@ -218,9 +191,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertFalse($node->_call('isPermissionCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCurrentPermissionReturnsCurrentDirectoryPermission(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, ['getAbsolutePath'], [], '', false);
@@ -231,9 +202,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame('0444', $node->_call('getCurrentPermission'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCurrentPermissionReturnsCurrentFilePermission(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, ['getAbsolutePath'], [], '', false);
@@ -245,9 +214,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame('0770', $node->_call('getCurrentPermission'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRelativePathBelowSiteRootThrowsExceptionIfGivenPathIsNotBelowPathSiteConstant(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -256,9 +223,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         $node->_call('getRelativePathBelowSiteRoot', '/tmp');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRelativePathCallsGetAbsolutePathIfPathIsNull(): void
     {
         $node = $this->getAccessibleMock(
@@ -272,9 +237,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         $node->_call('getRelativePathBelowSiteRoot', null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRelativePathBelowSiteRootReturnsSingleForwardSlashIfGivenPathEqualsPathSiteConstant(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
@@ -282,9 +245,7 @@ final class AbstractNodeTest extends AbstractFolderStructureTestCase
         self::assertSame('/', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getRelativePathBelowSiteRootReturnsSubPath(): void
     {
         $node = $this->getAccessibleMock(AbstractNode::class, null, [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/DefaultFactoryTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/DefaultFactoryTest.php
index 92ecad0b40bdafd28f1ba70616986d8551ae0693..4123eb9efc14041d3e6663e723bc713cb51d6f13 100644
--- a/typo3/sysext/install/Tests/Unit/FolderStructure/DefaultFactoryTest.php
+++ b/typo3/sysext/install/Tests/Unit/FolderStructure/DefaultFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\FolderStructure;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\FolderStructure\DefaultFactory;
 use TYPO3\CMS\Install\FolderStructure\StructureFacadeInterface;
 use TYPO3\CMS\Install\WebserverType;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class DefaultFactoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getStructureReturnsInstanceOfStructureFacadeInterface(): void
     {
         $webserverType = WebserverType::fromType('i-dont-care');
diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/DirectoryNodeTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/DirectoryNodeTest.php
index 347eaf30cfdb8bbcf9ab27ee405d29865dacf2c9..71729b0fb0855cca80a392e78d6e4db818f59d49 100644
--- a/typo3/sysext/install/Tests/Unit/FolderStructure/DirectoryNodeTest.php
+++ b/typo3/sysext/install/Tests/Unit/FolderStructure/DirectoryNodeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\FolderStructure;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
@@ -30,9 +31,7 @@ use TYPO3\CMS\Install\FolderStructure\RootNodeInterface;
 
 final class DirectoryNodeTest extends AbstractFolderStructureTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfParentIsNull(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -40,9 +39,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         new DirectoryNode([], null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfNameContainsForwardSlash(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -54,9 +51,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         new DirectoryNode($structure, $parent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorCallsCreateChildrenIfChildrenAreSet(): void
     {
         $parent = $this->createMock(NodeInterface::class);
@@ -75,9 +70,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         $node->__construct($structure, $parent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsParent(): void
     {
         $parent = $this->createMock(NodeInterface::class);
@@ -89,9 +82,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($parent, $node->_call('getParent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTargetPermission(): void
     {
         $parent = $this->createMock(NodeInterface::class);
@@ -105,9 +96,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($targetPermission, $node->_call('getTargetPermission'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsName(): void
     {
         $parent = $this->createMock(RootNodeInterface::class);
@@ -116,9 +105,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($name, $node->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArray(): void
     {
         $node = $this->getAccessibleMock(
@@ -138,9 +125,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertIsArray($node->getStatus());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithWarningStatusIfDirectoryNotExists(): void
     {
         $node = $this->getAccessibleMock(
@@ -161,9 +146,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::WARNING, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithErrorStatusIfNodeIsNotADirectory(): void
     {
         $node = $this->getAccessibleMock(
@@ -185,9 +168,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::ERROR, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithErrorStatusIfDirectoryExistsButIsNotWritable(): void
     {
         $node = $this->getAccessibleMock(
@@ -209,9 +190,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::ERROR, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithNoticeStatusIfDirectoryExistsButPermissionAreNotCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -233,9 +212,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::NOTICE, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithOkStatusIfDirectoryExistsAndPermissionAreCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -257,9 +234,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusCallsGetStatusOnChildren(): void
     {
         $node = $this->getAccessibleMock(
@@ -281,9 +256,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         $node->getStatus();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithOwnStatusAndStatusOfChild(): void
     {
         $node = $this->getAccessibleMock(
@@ -308,9 +281,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($childMessage, $statusOfChild);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixCallsFixSelfAndReturnsItsResult(): void
     {
         $node = $this->getMockBuilder(DirectoryNode::class)
@@ -322,9 +293,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($uniqueReturn, $node->fix());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixCallsFixOnChildrenAndReturnsMergedResult(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, ['fixSelf'], [], '', false);
@@ -344,9 +313,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame([$uniqueReturnSelf, $uniqueReturnChild1, $uniqueReturnChild2], $node->fix());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfCallsCreateDirectoryIfDirectoryDoesNotExistAndReturnsResult(): void
     {
         $node = $this->getAccessibleMock(
@@ -363,9 +330,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame([$uniqueReturn], $node->_call('fixSelf'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfReturnsErrorStatusIfNodeExistsButIsNotADirectoryAndReturnsResult(): void
     {
         $node = $this->getAccessibleMock(
@@ -384,9 +349,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::ERROR, $result[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfCallsFixPermissionIfDirectoryExistsButIsNotWritable(): void
     {
         $node = $this->getAccessibleMock(
@@ -403,9 +366,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame([$message], $node->_call('fixSelf'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createDirectoryThrowsExceptionIfNodeExists(): void
     {
         $this->expectException(Exception::class);
@@ -416,9 +377,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         $node->_call('createDirectory');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createDirectoryCreatesDirectory(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, ['exists', 'getAbsolutePath', 'getRelativePathBelowSiteRoot'], [], '', false);
@@ -430,9 +389,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertDirectoryExists($path);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createDirectoryReturnsOkStatusIfDirectoryWasCreated(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, ['exists', 'getAbsolutePath', 'getRelativePathBelowSiteRoot'], [], '', false);
@@ -443,9 +400,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $node->_call('createDirectory')->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createChildrenThrowsExceptionIfAChildTypeIsNotSet(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -459,9 +414,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         $node->_call('createChildren', $brokenStructure);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createChildrenThrowsExceptionIfAChildNameIsNotSet(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -475,9 +428,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         $node->_call('createChildren', $brokenStructure);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createChildrenThrowsExceptionForMultipleChildrenWithSameName(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -496,9 +447,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         $node->_call('createChildren', $brokenStructure);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getChildrenReturnsCreatedChild(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, null, [], '', false);
@@ -522,9 +471,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($childName, $child->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isWritableReturnsFalseIfNodeDoesNotExist(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, ['getAbsolutePath'], [], '', false);
@@ -533,9 +480,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertFalse($node->isWritable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isWritableReturnsTrueIfNodeExistsAndFileCanBeCreated(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, ['getAbsolutePath'], [], '', false);
@@ -544,9 +489,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->isWritable());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isDirectoryReturnsTrueIfNameIsADirectory(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, ['getAbsolutePath'], [], '', false);
@@ -555,9 +498,7 @@ final class DirectoryNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('isDirectory'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isDirectoryReturnsFalseIfNameIsALinkToADirectory(): void
     {
         $node = $this->getAccessibleMock(DirectoryNode::class, ['getAbsolutePath'], [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/FileNodeTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/FileNodeTest.php
index fd2cd4de2f548bc65e8e7a10f03e1b7a449f5ced..63c28c71a4124288ccf6df11a984bbfa0b8aede7 100644
--- a/typo3/sysext/install/Tests/Unit/FolderStructure/FileNodeTest.php
+++ b/typo3/sysext/install/Tests/Unit/FolderStructure/FileNodeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\FolderStructure;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
@@ -30,9 +31,7 @@ use TYPO3\CMS\Install\FolderStructure\RootNodeInterface;
 
 final class FileNodeTest extends AbstractFolderStructureTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfParentIsNull(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -41,9 +40,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->__construct([], null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfNameContainsForwardSlash(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -56,9 +53,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->__construct($structure, $parent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsParent(): void
     {
         $parent = $this->createMock(NodeInterface::class);
@@ -70,9 +65,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($parent, $node->_call('getParent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTargetPermission(): void
     {
         $parent = $this->createMock(NodeInterface::class);
@@ -86,9 +79,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($targetPermission, $node->_call('getTargetPermission'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsName(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, null, [], '', false);
@@ -98,9 +89,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($name, $node->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfBothTargetContentAndTargetContentFileAreSet(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -115,9 +104,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->__construct($structure, $parent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTargetContent(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, null, [], '', false);
@@ -131,9 +118,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($targetContent, $node->_get('targetContent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTargetContentToContentOfTargetContentFile(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, null, [], '', false);
@@ -149,9 +134,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($targetContent, $node->_get('targetContent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfTargetContentFileDoesNotExist(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -166,9 +149,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->__construct($structure, $parent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function targetContentIsNullIfNotGiven(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, null, [], '', false);
@@ -180,9 +161,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertNull($node->_get('targetContent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArray(): void
     {
         $node = $this->getAccessibleMock(
@@ -206,9 +185,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertIsArray($node->getStatus());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithWarningStatusIFileNotExists(): void
     {
         $node = $this->getAccessibleMock(
@@ -230,9 +207,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::WARNING, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithErrorStatusIfNodeIsNotAFile(): void
     {
         $node = $this->getAccessibleMock(
@@ -255,9 +230,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::ERROR, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayNoticeStatusIfFileExistsButIsNotWritable(): void
     {
         $node = $this->getAccessibleMock(
@@ -280,9 +253,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::NOTICE, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithNoticeStatusIfFileExistsButPermissionAreNotCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -305,9 +276,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::NOTICE, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithNoticeStatusIfFileExistsButContentIsNotCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -330,9 +299,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::NOTICE, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithOkStatusIfFileExistsAndPermissionAreCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -355,9 +322,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixCallsFixSelfAndReturnsItsResult(): void
     {
         $node = $this->getAccessibleMock(
@@ -372,9 +337,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($uniqueReturn, $node->fix());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfCallsCreateFileIfFileDoesNotExistAndReturnsResult(): void
     {
         $node = $this->getAccessibleMock(
@@ -394,9 +357,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($message, $actualReturn);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfCallsSetsContentIfFileCreationWasSuccessfulAndTargetContentIsNotNullAndReturnsResult(): void
     {
         $node = $this->getAccessibleMock(
@@ -419,9 +380,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($message2, $actualReturn);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfDoesNotCallSetContentIfFileCreationFailed(): void
     {
         $node = $this->getAccessibleMock(
@@ -441,9 +400,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->_call('fixSelf');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfDoesNotCallSetContentIfFileTargetContentIsNull(): void
     {
         $node = $this->getAccessibleMock(
@@ -463,9 +420,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->_call('fixSelf');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfReturnsErrorStatusIfNodeExistsButIsNotAFileAndReturnsResult(): void
     {
         $node = $this->getAccessibleMock(
@@ -483,9 +438,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame([$message], $node->_call('fixSelf'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfCallsFixPermissionIfFileExistsButPermissionAreWrong(): void
     {
         $node = $this->getAccessibleMock(
@@ -501,9 +454,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->_call('fixSelf');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixSelfReturnsArrayOfStatusMessages(): void
     {
         $node = $this->getAccessibleMock(
@@ -519,9 +470,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertIsArray($node->_call('fixSelf'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFileThrowsExceptionIfNodeExists(): void
     {
         $this->expectException(Exception::class);
@@ -532,9 +481,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->_call('createFile');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFileReturnsOkStatusIfFileWasCreated(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['exists', 'getAbsolutePath', 'getRelativePathBelowSiteRoot'], [], '', false);
@@ -545,9 +492,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $node->_call('createFile')->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createFileCreatesFile(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['exists', 'getAbsolutePath', 'getRelativePathBelowSiteRoot'], [], '', false);
@@ -559,9 +504,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue(is_file($path));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isContentCorrectThrowsExceptionIfTargetIsNotAFile(): void
     {
         $this->expectException(Exception::class);
@@ -572,9 +515,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->_call('isContentCorrect');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isContentCorrectReturnsTrueIfTargetContentPropertyIsNull(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['getAbsolutePath'], [], '', false);
@@ -585,9 +526,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('isContentCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isContentCorrectReturnsTrueIfTargetContentEqualsCurrentContent(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['getAbsolutePath'], [], '', false);
@@ -599,9 +538,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('isContentCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isContentCorrectReturnsFalseIfTargetContentNotEqualsCurrentContent(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['getAbsolutePath'], [], '', false);
@@ -614,9 +551,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertFalse($node->_call('isContentCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPermissionCorrectReturnsTrueIfTargetPermissionAndCurrentPermissionAreIdentical(): void
     {
         $parent = $this->createMock(NodeInterface::class);
@@ -632,9 +567,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('isPermissionCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setContentThrowsExceptionIfTargetIsNotAFile(): void
     {
         $this->expectException(Exception::class);
@@ -646,9 +579,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->_call('setContent');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setContentThrowsExceptionIfTargetContentIsNull(): void
     {
         $this->expectException(Exception::class);
@@ -661,9 +592,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         $node->_call('setContent');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setContentSetsContentToFile(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['getAbsolutePath', 'getRelativePathBelowSiteRoot'], [], '', false);
@@ -677,9 +606,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame($targetContent, $resultContent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setContentReturnsOkStatusIfContentWasSuccessfullySet(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['getAbsolutePath', 'getRelativePathBelowSiteRoot'], [], '', false);
@@ -691,9 +618,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $node->_call('setContent')->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFileReturnsTrueIfNameIsFile(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['getAbsolutePath', 'getRelativePathBelowSiteRoot'], [], '', false);
@@ -703,9 +628,7 @@ final class FileNodeTest extends AbstractFolderStructureTestCase
         self::assertTrue($node->_call('isFile'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFileReturnsFalseIfNameIsALinkFile(): void
     {
         $node = $this->getAccessibleMock(FileNode::class, ['getAbsolutePath'], [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php
index 3455d04e9af34570553658f9e23b1743a6615ee9..8a65612ed29719149f395f3eda114e497e32136b 100644
--- a/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php
+++ b/typo3/sysext/install/Tests/Unit/FolderStructure/LinkNodeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\FolderStructure;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -40,9 +41,7 @@ final class LinkNodeTest extends UnitTestCase
         GeneralUtility::mkdir_deep($this->testRoot);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfParentIsNull(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -51,9 +50,7 @@ final class LinkNodeTest extends UnitTestCase
         $node->__construct([], null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfNameContainsForwardSlash(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -66,9 +63,7 @@ final class LinkNodeTest extends UnitTestCase
         $node->__construct($structure, $parent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsParent(): void
     {
         $parent = $this->createMock(NodeInterface::class);
@@ -80,9 +75,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame($parent, $node->_call('getParent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsName(): void
     {
         $node = $this->getAccessibleMock(LinkNode::class, null, [], '', false);
@@ -92,9 +85,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame($name, $node->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsNameAndTarget(): void
     {
         $node = $this->getAccessibleMock(LinkNode::class, null, [], '', false);
@@ -105,9 +96,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame($target, $node->_call('getTarget'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArray(): void
     {
         $node = $this->getAccessibleMock(
@@ -122,9 +111,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertIsArray($node->getStatus());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithInformationStatusIfRunningOnWindows(): void
     {
         $node = $this->getAccessibleMock(
@@ -141,9 +128,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame(ContextualFeedbackSeverity::INFO, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithErrorStatusIfLinkNotExists(): void
     {
         $node = $this->getAccessibleMock(
@@ -161,9 +146,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame(ContextualFeedbackSeverity::ERROR, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithWarningStatusIfNodeIsNotALink(): void
     {
         $node = $this->getAccessibleMock(
@@ -180,9 +163,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame(ContextualFeedbackSeverity::WARNING, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsErrorStatusIfLinkTargetIsNotCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -201,9 +182,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame(ContextualFeedbackSeverity::ERROR, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsOkStatusIfLinkExistsAndTargetIsCorrect(): void
     {
         $node = $this->getAccessibleMock(
@@ -222,9 +201,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixReturnsEmptyArray(): void
     {
         $node = $this->getAccessibleMock(
@@ -238,9 +215,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertEmpty($statusArray);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isLinkThrowsExceptionIfLinkNotExists(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -250,9 +225,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertFalse($node->_call('isLink'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isLinkReturnsTrueIfNameIsLink(): void
     {
         $node = $this->getAccessibleMock(LinkNode::class, ['exists', 'getAbsolutePath'], [], '', false);
@@ -265,9 +238,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertTrue($node->_call('isLink'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isFileReturnsFalseIfNameIsAFile(): void
     {
         $node = $this->getAccessibleMock(LinkNode::class, ['exists', 'getAbsolutePath'], [], '', false);
@@ -278,9 +249,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertFalse($node->_call('isLink'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isTargetCorrectThrowsExceptionIfLinkNotExists(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -290,9 +259,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertFalse($node->_call('isTargetCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isTargetCorrectThrowsExceptionIfNodeIsNotALink(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -303,9 +270,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertTrue($node->_call('isTargetCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isTargetCorrectReturnsTrueIfNoExpectedLinkTargetIsSpecified(): void
     {
         $node = $this->getAccessibleMock(LinkNode::class, ['exists', 'isLink', 'getTarget'], [], '', false);
@@ -315,9 +280,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertTrue($node->_call('isTargetCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isTargetCorrectAcceptsATargetWithATrailingSlash(): void
     {
         $node = $this->getAccessibleMock(LinkNode::class, ['exists', 'isLink', 'getCurrentTarget', 'getTarget'], [], '', false);
@@ -328,9 +291,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertTrue($node->_call('isTargetCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isTargetCorrectReturnsTrueIfActualTargetIsIdenticalToSpecifiedTarget(): void
     {
         $path = $this->testRoot . StringUtility::getUniqueId('link_');
@@ -351,9 +312,7 @@ final class LinkNodeTest extends UnitTestCase
         self::assertTrue($node->_call('isTargetCorrect'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isTargetCorrectReturnsFalseIfActualTargetIsNotIdenticalToSpecifiedTarget(): void
     {
         $path = $this->testRoot . StringUtility::getUniqueId('link_');
diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/RootNodeTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/RootNodeTest.php
index 10120ee611548989295e54007e3ed657a66603e8..c4dd6a3e97f451ff130e84bb3493a0e71ec3b0e2 100644
--- a/typo3/sysext/install/Tests/Unit/FolderStructure/RootNodeTest.php
+++ b/typo3/sysext/install/Tests/Unit/FolderStructure/RootNodeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\FolderStructure;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
@@ -32,9 +33,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RootNodeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfParentIsNotNull(): void
     {
         $this->expectException(RootNodeException::class);
@@ -44,9 +43,7 @@ final class RootNodeTest extends UnitTestCase
         $node->__construct([], $falseParent);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfAbsolutePathIsNotSet(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -58,9 +55,7 @@ final class RootNodeTest extends UnitTestCase
         $node->__construct($structure, null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfAbsolutePathIsNotAbsoluteOnWindows(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -75,9 +70,7 @@ final class RootNodeTest extends UnitTestCase
         $node->__construct($structure, null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionIfAbsolutePathIsNotAbsoluteOnUnix(): void
     {
         $this->expectException(InvalidArgumentException::class);
@@ -92,9 +85,7 @@ final class RootNodeTest extends UnitTestCase
         $node->__construct($structure, null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsParentToNull(): void
     {
         $node = $this->getAccessibleMock(RootNode::class, ['isWindowsOs'], [], '', false);
@@ -108,9 +99,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertNull($node->_call('getParent'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getChildrenReturnsChildCreatedByConstructor(): void
     {
         $node = $this->getAccessibleMock(RootNode::class, ['isWindowsOs'], [], '', false);
@@ -135,9 +124,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertSame($childName, $child->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTargetPermission(): void
     {
         $node = $this->getAccessibleMock(RootNode::class, ['isWindowsOs'], [], '', false);
@@ -153,9 +140,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertSame($targetPermission, $node->_call('getTargetPermission'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsName(): void
     {
         $node = $this->getAccessibleMock(RootNode::class, ['isWindowsOs'], [], '', false);
@@ -167,9 +152,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertSame($name, $node->getName());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsArrayWithOkStatusAndCallsOwnStatusMethods(): void
     {
         $node = $this->getAccessibleMock(
@@ -193,9 +176,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $statusArray[0]->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusCallsGetChildrenStatusForStatus(): void
     {
         $node = $this->getAccessibleMock(
@@ -224,9 +205,7 @@ final class RootNodeTest extends UnitTestCase
         self::assertSame($childStatus, $statusOfChild);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getAbsolutePathReturnsGivenName(): void
     {
         $node = $this->getAccessibleMock(RootNode::class, ['isWindowsOs'], [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/FolderStructure/StructureFacadeTest.php b/typo3/sysext/install/Tests/Unit/FolderStructure/StructureFacadeTest.php
index 79db7e17f51e97dfd17f676a6211d1fdd49dbf8d..d9fef0b0d892e10f19a3c1c621055ba2600c7152 100644
--- a/typo3/sysext/install/Tests/Unit/FolderStructure/StructureFacadeTest.php
+++ b/typo3/sysext/install/Tests/Unit/FolderStructure/StructureFacadeTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\FolderStructure;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Messaging\FlashMessageQueue;
 use TYPO3\CMS\Install\FolderStructure\RootNode;
 use TYPO3\CMS\Install\FolderStructure\StructureFacade;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class StructureFacadeTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsStatusOfStructureAndReturnsItsResult(): void
     {
         $facade = $this->getAccessibleMock(StructureFacade::class, null, [], '', false);
@@ -37,9 +36,7 @@ final class StructureFacadeTest extends UnitTestCase
         self::assertInstanceOf(FlashMessageQueue::class, $status);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function fixCallsFixOfStructureAndReturnsItsResult(): void
     {
         $facade = $this->getAccessibleMock(StructureFacade::class, null, [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/Service/ClearTableServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/ClearTableServiceTest.php
index 455a74c462fc7295bc7bdf169c54f558497aa3e6..b6efbfe20685234acd25bf4a8119526c394ea89b 100644
--- a/typo3/sysext/install/Tests/Unit/Service/ClearTableServiceTest.php
+++ b/typo3/sysext/install/Tests/Unit/Service/ClearTableServiceTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\Service\ClearTableService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ClearTableServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function clearSelectedTableThrowsWithInvalidTableName(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php
index 730b5c12d11ec034d8515b09e614cd20f713c73e..273e00c660b1ec204c45bf772e31739a0d2dbf76 100644
--- a/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php
+++ b/typo3/sysext/install/Tests/Unit/Service/CoreUpdateServiceTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Messaging\FlashMessageQueue;
 use TYPO3\CMS\Install\Service\CoreUpdateService;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class CoreUpdateServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getMessagesReturnsPreviouslySetMessage(): void
     {
         $instance = $this->getAccessibleMock(CoreUpdateService::class, null, [], '', false);
@@ -34,9 +33,7 @@ final class CoreUpdateServiceTest extends UnitTestCase
         self::assertSame($aMessage, $instance->getMessages());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isCoreUpdateEnabledReturnsTrueForEnvironmentVariableNotSet(): void
     {
         if (defined('TYPO3_COMPOSER_MODE') && TYPO3_COMPOSER_MODE) {
@@ -48,9 +45,7 @@ final class CoreUpdateServiceTest extends UnitTestCase
         self::assertTrue($instance->isCoreUpdateEnabled());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isCoreUpdateEnabledReturnsFalseFor_TYPO3_DISABLE_CORE_UPDATER_EnvironmentVariableSet(): void
     {
         $instance = $this->getAccessibleMock(CoreUpdateService::class, null, [], '', false);
@@ -59,9 +54,7 @@ final class CoreUpdateServiceTest extends UnitTestCase
         self::assertFalse($instance->isCoreUpdateEnabled());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isCoreUpdateEnabledReturnsFalseFor_REDIRECT_TYPO3_DISABLE_CORE_UPDATER_EnvironmentVariableSet(): void
     {
         $instance = $this->getAccessibleMock(CoreUpdateService::class, null, [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php
index c93639a3d65cf2536e73d48165ea9926326ac2c3..9e160470edf34490b09d433a2f09e4de2da14bd1 100644
--- a/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php
+++ b/typo3/sysext/install/Tests/Unit/Service/CoreVersionServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\JsonResponse;
 use TYPO3\CMS\Core\Http\RequestFactory;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -36,9 +38,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         GeneralUtility::addInstance(RequestFactory::class, $requestFactoryMock);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isVersionActivelyCommunityMaintainedReturnsFalseIfMaintainedUntilIsNotSet(): void
     {
         $this->setUpApiResponse(
@@ -58,9 +58,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isVersionActivelyCommunityMaintainedReturnsTrueIfMaintainedUntilIsAfterToday(): void
     {
         $this->setUpApiResponse(
@@ -81,9 +79,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isVersionActivelyCommunityMaintainedReturnsFalseIfMaintainedUntilWasBeforeToday(): void
     {
         $this->setUpApiResponse(
@@ -104,9 +100,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isVersionActivelyEltsMaintainedReturnsFalseIfEltsUntilIsNotSet(): void
     {
         $this->setUpApiResponse(
@@ -126,9 +120,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isVersionActivelyEltsMaintainedReturnsTrueIfEltsUntilIsAfterToday(): void
     {
         $this->setUpApiResponse(
@@ -149,9 +141,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isVersionActivelyEltsMaintainedReturnsFalseIfEltsUntilWasBeforeToday(): void
     {
         $this->setUpApiResponse(
@@ -174,8 +164,8 @@ final class CoreVersionServiceTest extends UnitTestCase
 
     /**
      * The maintenance date ranges are built relatively to avoid the need to adjust them once the dates passed
-     * @test
      */
+    #[Test]
     public function getSupportedMajorReleasesReturnsListOfVersions(): void
     {
         $this->setUpApiResponse(
@@ -235,9 +225,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertSame($expectation, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPatchReleaseSuitableForUpdateReturnsTrueIfNewerVersionExists(): void
     {
         $this->setUpApiResponse(
@@ -262,9 +250,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isPatchReleaseSuitableForUpdateReturnsFalseIfNoNewerVersionExists(): void
     {
         $this->setUpApiResponse(
@@ -289,9 +275,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isUpdateSecurityRelevantReturnsTrueIfNewerSecurityUpdateExists(): void
     {
         $coreRelease = new CoreRelease('8.7.5', new \DateTimeImmutable('2017-09-05T10:54:18+00:00'), 'security', 'e79466bffc81f270f5c262d01a125e82b2e1989a');
@@ -335,9 +319,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertTrue($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isUpdateSecurityRelevantReturnsFalseIfNewerSecurityUpdateExistsButCannotGetUpgraded(): void
     {
         $coreRelease = new CoreRelease('8.7.6', new \DateTimeImmutable('2017-09-05T10:54:18+00:00'), 'security', 'e79466bffc81f270f5c262d01a125e82b2e1989a');
@@ -381,9 +363,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isUpdateSecurityRelevantReturnsFalseIfNoNewerSecurityUpdatesExist(): void
     {
         $coreRelease = new CoreRelease('8.7.6', new \DateTimeImmutable('2017-09-05T10:54:18+00:00'), 'security', 'e79466bffc81f270f5c262d01a125e82b2e1989a');
@@ -419,10 +399,8 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     * @dataProvider isCurrentInstalledVersionEltsReturnsExpectedResultDataProvider
-     */
+    #[DataProvider('isCurrentInstalledVersionEltsReturnsExpectedResultDataProvider')]
+    #[Test]
     public function isCurrentInstalledVersionEltsReturnsExpectedResult(string $major, string $version, bool $expectation): void
     {
         $this->setUpApiResponse(
@@ -473,10 +451,8 @@ final class CoreVersionServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @dataProvider getYoungestPatchReleaseReturnsLatestReleaseForCurrentMajorVersionDataProvider
-     * @test
-     */
+    #[DataProvider('getYoungestPatchReleaseReturnsLatestReleaseForCurrentMajorVersionDataProvider')]
+    #[Test]
     public function getYoungestPatchReleaseReturnsLatestReleaseForCurrentMajorVersion(string $major, array $response): void
     {
         $this->setUpApiResponse(
@@ -526,9 +502,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getYoungestCommunityPatchReleaseReturnsLatestNonEltsRelease(): void
     {
         $this->setUpApiResponse(
@@ -581,9 +555,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertSame('8.7.30', $result->getVersion());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isInstalledVersionAReleasedVersionReturnsTrueForNonDevelopmentVersion(): void
     {
         $instance = $this->getAccessibleMock(CoreVersionService::class, ['getInstalledVersion'], [], '', false);
@@ -591,9 +563,7 @@ final class CoreVersionServiceTest extends UnitTestCase
         self::assertTrue($instance->isInstalledVersionAReleasedVersion());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isInstalledVersionAReleasedVersionReturnsFalseForDevelopmentVersion(): void
     {
         $instance = $this->getAccessibleMock(CoreVersionService::class, ['getInstalledVersion'], [], '', false);
diff --git a/typo3/sysext/install/Tests/Unit/Service/Typo3tempFileServiceTest.php b/typo3/sysext/install/Tests/Unit/Service/Typo3tempFileServiceTest.php
index 7917d6457e24ac3688add991313ea3ed468fa65b..60de68d08da5a95f8930cf9cd4d6ddc3e3e97e76 100644
--- a/typo3/sysext/install/Tests/Unit/Service/Typo3tempFileServiceTest.php
+++ b/typo3/sysext/install/Tests/Unit/Service/Typo3tempFileServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Resource\ProcessedFileRepository;
 use TYPO3\CMS\Core\Resource\StorageRepository;
 use TYPO3\CMS\Install\Service\Typo3tempFileService;
@@ -24,9 +25,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class Typo3tempFileServiceTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function clearAssetsFolderThrowsWithInvalidPath(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -37,9 +36,7 @@ final class Typo3tempFileServiceTest extends UnitTestCase
         $subject->clearAssetsFolder('../foo');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function clearAssetsFolderThrowsIfPathDoesNotStartWithTypotempAssets(): void
     {
         $this->expectException(\RuntimeException::class);
diff --git a/typo3/sysext/install/Tests/Unit/SystemEnvironment/DatabaseCheck/Platform/MySqlTest.php b/typo3/sysext/install/Tests/Unit/SystemEnvironment/DatabaseCheck/Platform/MySqlTest.php
index 869860f3357c256637b43bd02db01cf7fcf524f9..f2f89fed5297ed1d6b4811951fe8aeaf287def34 100644
--- a/typo3/sysext/install/Tests/Unit/SystemEnvironment/DatabaseCheck/Platform/MySqlTest.php
+++ b/typo3/sysext/install/Tests/Unit/SystemEnvironment/DatabaseCheck/Platform/MySqlTest.php
@@ -20,6 +20,8 @@ namespace TYPO3\CMS\Install\Tests\Unit\SystemEnvironment\DatabaseCheck\Platform;
 use Doctrine\DBAL\Platforms\AbstractPlatform;
 use Doctrine\DBAL\Platforms\MariaDBPlatform;
 use Doctrine\DBAL\Platforms\MySQLPlatform;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Database\Connection;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
@@ -79,10 +81,8 @@ final class MySqlTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider checkMySQLOrMariaDBVersionReportsExpectedStatusDataProvider
-     */
+    #[DataProvider('checkMySQLOrMariaDBVersionReportsExpectedStatusDataProvider')]
+    #[Test]
     public function checkMySQLOrMariaDBVersionReportsExpectedStatus(
         AbstractPlatform $platform,
         string $serverVersionString,
diff --git a/typo3/sysext/install/Tests/Unit/SystemEnvironment/ServerResponse/ContentSecurityPolicyHeaderTest.php b/typo3/sysext/install/Tests/Unit/SystemEnvironment/ServerResponse/ContentSecurityPolicyHeaderTest.php
index 3a828ec9613ffd1da233795065e1fdf52a1c121d..05002b44a569ad243638beda97ae9e3ca07e3948 100644
--- a/typo3/sysext/install/Tests/Unit/SystemEnvironment/ServerResponse/ContentSecurityPolicyHeaderTest.php
+++ b/typo3/sysext/install/Tests/Unit/SystemEnvironment/ServerResponse/ContentSecurityPolicyHeaderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\SystemEnvironment\ServerResponse;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\TestCase;
 use TYPO3\CMS\Install\SystemEnvironment\ServerResponse\ContentSecurityPolicyHeader;
 
@@ -93,10 +95,8 @@ final class ContentSecurityPolicyHeaderTest extends TestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider mitigatesCrossSiteScriptingDataProvider
-     */
+    #[DataProvider('mitigatesCrossSiteScriptingDataProvider')]
+    #[Test]
     public function mitigatesCrossSiteScripting(string $header, ?string $fileName, $expectation): void
     {
         $subject = new ContentSecurityPolicyHeader($header);
diff --git a/typo3/sysext/install/Tests/Unit/Updates/RowUpdater/L18nDiffsourceToJsonMigrationTest.php b/typo3/sysext/install/Tests/Unit/Updates/RowUpdater/L18nDiffsourceToJsonMigrationTest.php
index 0518bf8a648c21a0dcd13536ea09fedfdc98b61c..56f2fbf13bacad9a1d331499606b5ca88a932a58 100644
--- a/typo3/sysext/install/Tests/Unit/Updates/RowUpdater/L18nDiffsourceToJsonMigrationTest.php
+++ b/typo3/sysext/install/Tests/Unit/Updates/RowUpdater/L18nDiffsourceToJsonMigrationTest.php
@@ -17,23 +17,21 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Install\Tests\Unit\Updates\RowUpdater;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Install\Updates\RowUpdater\L18nDiffsourceToJsonMigration;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class L18nDiffsourceToJsonMigrationTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function hasPotentialUpdateForTableReturnsFalseIfTableIsNotLocalizable(): void
     {
         $GLOBALS['TCA']['testTable'] = [];
         self::assertFalse((new L18nDiffsourceToJsonMigration())->hasPotentialUpdateForTable('testTable'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function hasPotentialUpdateForTableReturnsTrueIfTableIsLocalizable(): void
     {
         $GLOBALS['TCA']['testTable'] = [
@@ -46,9 +44,7 @@ final class L18nDiffsourceToJsonMigrationTest extends UnitTestCase
         self::assertTrue((new L18nDiffsourceToJsonMigration())->hasPotentialUpdateForTable('testTable'));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function updateTableRowDoesNothingIfFieldIsNotSet(): void
     {
         $GLOBALS['TCA']['testTable'] = [
@@ -107,12 +103,11 @@ final class L18nDiffsourceToJsonMigrationTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider updateTableRowUpdatesFieldDataProvider
-     *
      * @param mixed $input
      * @param mixed $expected
      */
+    #[DataProvider('updateTableRowUpdatesFieldDataProvider')]
+    #[Test]
     public function updateTableRowUpdatesField($input, $expected): void
     {
         $GLOBALS['TCA']['testTable'] = [
diff --git a/typo3/sysext/linkvalidator/Tests/Unit/Linktype/ExternalLinktypeTest.php b/typo3/sysext/linkvalidator/Tests/Unit/Linktype/ExternalLinktypeTest.php
index 048cec02a9a83b380da85453ac7ecd67fa41e474..545c1861f9f8f6ee4898643fa69339f895b9c38f 100644
--- a/typo3/sysext/linkvalidator/Tests/Unit/Linktype/ExternalLinktypeTest.php
+++ b/typo3/sysext/linkvalidator/Tests/Unit/Linktype/ExternalLinktypeTest.php
@@ -20,6 +20,8 @@ namespace TYPO3\CMS\Linkvalidator\Tests\Unit\Linktype;
 use GuzzleHttp\Cookie\CookieJar;
 use GuzzleHttp\Exception\ClientException;
 use GuzzleHttp\Psr7\Response;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Http\Client\GuzzleClientFactory;
 use TYPO3\CMS\Core\Http\RequestFactory;
@@ -42,9 +44,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         return $languageServiceMock;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkLinkWithExternalUrlNotFoundReturnsFalse(): void
     {
         $response = new Response(404);
@@ -68,9 +68,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         self::assertFalse($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkLinkWithExternalUrlNotFoundResultsNotFoundErrorType(): void
     {
         $response = new Response(404);
@@ -172,10 +170,8 @@ final class ExternalLinktypeTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider preprocessUrlsDataProvider
-     */
+    #[DataProvider('preprocessUrlsDataProvider')]
+    #[Test]
     public function preprocessUrlReturnsCorrectString(string $inputUrl, $expectedResult): void
     {
         $subject = new ExternalLinktype(new RequestFactory(new GuzzleClientFactory()));
@@ -184,9 +180,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         self::assertEquals($result, $expectedResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdditionalConfigMergesHeaders(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
@@ -213,8 +207,8 @@ final class ExternalLinktypeTest extends UnitTestCase
     /**
      * If the timeout is not set via TSconfig, core $GLOBALS['TYPO3_CONF_VARS']['HTTP']['timeout'] should
      * be used. Which is the case if timeout is not passed to the request() function.
-     * @test
      */
+    #[Test]
     public function requestWithNoTimeoutIsCalledIfTimeoutNotSetByTsConfig(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
@@ -238,9 +232,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdditionalConfigOverwritesUserAgent(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
@@ -264,9 +256,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdditionalConfigAppendsAgentUrlIfConfigured(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
@@ -290,9 +280,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdditionalConfigAppendsEmailIfConfigured(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
@@ -316,9 +304,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdditionalConfigAppendsEmailFromGlobalsIfConfigured(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
@@ -342,9 +328,7 @@ final class ExternalLinktypeTest extends UnitTestCase
         );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function setAdditionalConfigSetsRangeAndMethod(): void
     {
         $requestFactoryMock = $this->getMockBuilder(RequestFactory::class)->disableOriginalConstructor()->getMock();
diff --git a/typo3/sysext/linkvalidator/Tests/Unit/Linktype/LinktypeRegistryTest.php b/typo3/sysext/linkvalidator/Tests/Unit/Linktype/LinktypeRegistryTest.php
index 0342055d1ff8acb0ffb232bcf2cdf1e66a6b67cc..cdfe5597a9ddf9206012a6f9bf3892c926327c58 100644
--- a/typo3/sysext/linkvalidator/Tests/Unit/Linktype/LinktypeRegistryTest.php
+++ b/typo3/sysext/linkvalidator/Tests/Unit/Linktype/LinktypeRegistryTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Linkvalidator\Tests\Unit\Linktype;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Linkvalidator\Linktype\LinktypeInterface;
 use TYPO3\CMS\Linkvalidator\Linktype\LinktypeRegistry;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class LinktypeRegistryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function registrationRequiresInterface(): void
     {
         $linktypes = [
@@ -40,9 +39,7 @@ final class LinktypeRegistryTest extends UnitTestCase
         self::assertEquals(['valid-identifier'], $linkTypeRegistry->getIdentifiers());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registrationThrowsExceptionOnEmptyIdentifier(): void
     {
         $linktypes = [
@@ -55,9 +52,7 @@ final class LinktypeRegistryTest extends UnitTestCase
         new LinktypeRegistry($linktypes);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function registrationThrowsExceptionOnDuplicateIdentifier(): void
     {
         $linktypes = [
diff --git a/typo3/sysext/linkvalidator/Tests/Unit/Repository/PagesRepositoryTest.php b/typo3/sysext/linkvalidator/Tests/Unit/Repository/PagesRepositoryTest.php
index e7e50ce333978d2b5ff70a9cc353187fb94503f3..991181cc3e50a60a44bbea78478c33a985fde327 100644
--- a/typo3/sysext/linkvalidator/Tests/Unit/Repository/PagesRepositoryTest.php
+++ b/typo3/sysext/linkvalidator/Tests/Unit/Repository/PagesRepositoryTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Linkvalidator\Tests\Unit\Repository;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Linkvalidator\Repository\PagesRepository;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class PagesRepositoryTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function doesRootLineContainHiddenPagesReturnTrueForCurrentPage(): void
     {
         $subject = new PagesRepository();
diff --git a/typo3/sysext/lowlevel/Tests/Unit/Controller/DatabaseIntegrityControllerTest.php b/typo3/sysext/lowlevel/Tests/Unit/Controller/DatabaseIntegrityControllerTest.php
index 33edf0366ded45386d9777d039eac3853dc3342d..c25692e21af3f6c5c0433b2d0eae6740f33a77dc 100644
--- a/typo3/sysext/lowlevel/Tests/Unit/Controller/DatabaseIntegrityControllerTest.php
+++ b/typo3/sysext/lowlevel/Tests/Unit/Controller/DatabaseIntegrityControllerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Lowlevel\Tests\Unit\Controller;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Lowlevel\Controller\DatabaseIntegrityController;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -104,10 +106,8 @@ final class DatabaseIntegrityControllerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getSubscriptReturnsExpectedValuesDataProvider
-     */
+    #[DataProvider('getSubscriptReturnsExpectedValuesDataProvider')]
+    #[Test]
     public function getSubscriptReturnsExpectedValues($input, array $expectedArray): void
     {
         $subject = $this->getAccessibleMock(DatabaseIntegrityController::class, null, [], '', false);
diff --git a/typo3/sysext/lowlevel/Tests/Unit/Event/ModifyBlindedConfigurationOptionsEventTest.php b/typo3/sysext/lowlevel/Tests/Unit/Event/ModifyBlindedConfigurationOptionsEventTest.php
index 192643b3a2cda004c12d8a752699664f986d03ca..0042e941a991044be0dd84fc44ab21cfaf9b1c2f 100644
--- a/typo3/sysext/lowlevel/Tests/Unit/Event/ModifyBlindedConfigurationOptionsEventTest.php
+++ b/typo3/sysext/lowlevel/Tests/Unit/Event/ModifyBlindedConfigurationOptionsEventTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Lowlevel\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Lowlevel\Event\ModifyBlindedConfigurationOptionsEvent;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ModifyBlindedConfigurationOptionsEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $identifier = 'myidentifier';
diff --git a/typo3/sysext/opendocs/Tests/Unit/Service/OpenDocumentServiceTest.php b/typo3/sysext/opendocs/Tests/Unit/Service/OpenDocumentServiceTest.php
index ee355c7da85036ab18628161dcf1a595f30891d1..c91cf0153a12a2eb56a23951ed331ccfbea710b0 100644
--- a/typo3/sysext/opendocs/Tests/Unit/Service/OpenDocumentServiceTest.php
+++ b/typo3/sysext/opendocs/Tests/Unit/Service/OpenDocumentServiceTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Opendocs\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Opendocs\Service\OpenDocumentService;
@@ -33,9 +34,7 @@ final class OpenDocumentServiceTest extends UnitTestCase
         $GLOBALS['BE_USER'] = $this->backendUser;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getsOpenDocumentsFromUserSession(): void
     {
         $this->backendUser->method('getModuleData')->with('FormEngine', 'ses')->willReturn([
@@ -54,9 +53,7 @@ final class OpenDocumentServiceTest extends UnitTestCase
         self::assertEquals($expected, $openDocuments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function handlesUserSessionWithoutOpenDocuments(): void
     {
         $this->backendUser->method('getModuleData')->with('FormEngine', 'ses')->willReturn(null);
@@ -65,9 +62,7 @@ final class OpenDocumentServiceTest extends UnitTestCase
         self::assertEquals([], $openDocuments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getsRecentDocumentsFromUserSession(): void
     {
         $this->backendUser->method('getModuleData')->with('opendocs::recent')->willReturn([
@@ -81,9 +76,7 @@ final class OpenDocumentServiceTest extends UnitTestCase
         self::assertEquals($expected, $recentDocuments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function handlesUserSessionWithoutRecentDocuments(): void
     {
         $this->backendUser->method('getModuleData')->with('opendocs::recent')->willReturn(null);
@@ -92,9 +85,7 @@ final class OpenDocumentServiceTest extends UnitTestCase
         self::assertEquals([], $recentDocuments);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function closesDocument(): void
     {
         $this->backendUser->method('getModuleData')->willReturnMap([
diff --git a/typo3/sysext/redirects/Tests/Unit/Evaluation/SourceHostTest.php b/typo3/sysext/redirects/Tests/Unit/Evaluation/SourceHostTest.php
index f2b5096ad482d6159a7720f31e2137567923801e..e22ee39153840e754d05da4d208b3cf8e292dd53 100644
--- a/typo3/sysext/redirects/Tests/Unit/Evaluation/SourceHostTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Evaluation/SourceHostTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Evaluation;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Redirects\Evaluation\SourceHost;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -66,10 +68,8 @@ final class SourceHostTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider evaluateFieldValueWorksWithDifferentInputsDataProvider
-     */
+    #[DataProvider('evaluateFieldValueWorksWithDifferentInputsDataProvider')]
+    #[Test]
     public function evaluateFieldValueWorksWithDifferentInputs(string $input, string $expected): void
     {
         $subject = new SourceHost();
diff --git a/typo3/sysext/redirects/Tests/Unit/Event/AfterAutoCreateRedirectHasBeenPersistedEventTest.php b/typo3/sysext/redirects/Tests/Unit/Event/AfterAutoCreateRedirectHasBeenPersistedEventTest.php
index 0a96449f1da3d089dcc06de3bfc60946f6af4e08..339bb5252b4724a70daffb56a99f926c078bdc63 100644
--- a/typo3/sysext/redirects/Tests/Unit/Event/AfterAutoCreateRedirectHasBeenPersistedEventTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Event/AfterAutoCreateRedirectHasBeenPersistedEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
 use TYPO3\CMS\Redirects\Event\AfterAutoCreateRedirectHasBeenPersistedEvent;
@@ -27,9 +28,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AfterAutoCreateRedirectHasBeenPersistedEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function afterAutoCreateRedirectHasBeenPersistedGettersReturnsCreationValues(): void
     {
         $source = new PlainSlugReplacementRedirectSource(
diff --git a/typo3/sysext/redirects/Tests/Unit/Event/BeforeRedirectMatchDomainEventTest.php b/typo3/sysext/redirects/Tests/Unit/Event/BeforeRedirectMatchDomainEventTest.php
index 62e3cb0e77327d918e3a928c4863eedacf8551dc..a4f541f8ff9975b3b58ef5646e2788c202157e26 100644
--- a/typo3/sysext/redirects/Tests/Unit/Event/BeforeRedirectMatchDomainEventTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Event/BeforeRedirectMatchDomainEventTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Redirects\Event\BeforeRedirectMatchDomainEvent;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class BeforeRedirectMatchDomainEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function getterReturnsConstructorSetValues(): void
     {
         $event = new BeforeRedirectMatchDomainEvent('acme.com', '/some-path', '?param=value', '*');
@@ -36,9 +35,7 @@ final class BeforeRedirectMatchDomainEventTest extends UnitTestCase
         self::assertNull($event->getMatchedRedirect());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchedRedirectSetterReturnsSetMatchedRedirectAndCanBeSetToNull(): void
     {
         $redirect = ['some-redirect'];
diff --git a/typo3/sysext/redirects/Tests/Unit/Event/ModifyAutoCreateRedirectRecordBeforePersistingEventTest.php b/typo3/sysext/redirects/Tests/Unit/Event/ModifyAutoCreateRedirectRecordBeforePersistingEventTest.php
index 0edd3b3d34b1978b7c701376e35acfba678e816e..d7a8c107a2fa96907cc713137a0ccaa4a1cdcc47 100644
--- a/typo3/sysext/redirects/Tests/Unit/Event/ModifyAutoCreateRedirectRecordBeforePersistingEventTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Event/ModifyAutoCreateRedirectRecordBeforePersistingEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
 use TYPO3\CMS\Redirects\Event\ModifyAutoCreateRedirectRecordBeforePersistingEvent;
@@ -56,9 +57,7 @@ final class ModifyAutoCreateRedirectRecordBeforePersistingEventTest extends Unit
         self::assertSame($redirectRecord, $event->getRedirectRecord());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function modifyAutoCreateRedirectRecordBeforePersistingRedirectRecordCanBeSet(): void
     {
         $source = new PlainSlugReplacementRedirectSource(
diff --git a/typo3/sysext/redirects/Tests/Unit/Event/ModifyRedirectManagementControllerViewDataEventTest.php b/typo3/sysext/redirects/Tests/Unit/Event/ModifyRedirectManagementControllerViewDataEventTest.php
index 63976acb0f9d5e72c8115b589d73966a2f62e583..9c5cde8ca76963abbbe5f0b81c90cc219bd7a53c 100644
--- a/typo3/sysext/redirects/Tests/Unit/Event/ModifyRedirectManagementControllerViewDataEventTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Event/ModifyRedirectManagementControllerViewDataEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\View\ViewInterface;
 use TYPO3\CMS\Redirects\Event\ModifyRedirectManagementControllerViewDataEvent;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ModifyRedirectManagementControllerViewDataEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnsSetValues(): void
     {
         $demand = $this->createMock(Demand::class);
diff --git a/typo3/sysext/redirects/Tests/Unit/Event/SlugRedirectChangeItemCreatedEventTest.php b/typo3/sysext/redirects/Tests/Unit/Event/SlugRedirectChangeItemCreatedEventTest.php
index 32b810e03bdd0db95186ddbdb276e22175d47250..07eeadef78f7b1786b331ffe8c1c7b214d44343f 100644
--- a/typo3/sysext/redirects/Tests/Unit/Event/SlugRedirectChangeItemCreatedEventTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Event/SlugRedirectChangeItemCreatedEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
 use TYPO3\CMS\Redirects\Event\SlugRedirectChangeItemCreatedEvent;
@@ -26,9 +27,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SlugRedirectChangeItemCreatedEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function slugRedirectChangeItemGetterReturnsChangeItemUsedForInstantiation(): void
     {
         $changeItem = new SlugRedirectChangeItem(
@@ -46,9 +45,7 @@ final class SlugRedirectChangeItemCreatedEventTest extends UnitTestCase
         self::assertSame($changeItem, $event->getSlugRedirectChangeItem());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function slugRedirectChangeItemGetterReturnsChangedItemSetBySetter(): void
     {
         $changeItem = new SlugRedirectChangeItem(
diff --git a/typo3/sysext/redirects/Tests/Unit/FormDataProvider/ValuePickerItemDataProviderTest.php b/typo3/sysext/redirects/Tests/Unit/FormDataProvider/ValuePickerItemDataProviderTest.php
index e9f483b4d94f14b19011a6abca1eb58582f35691..42008ad7151dd857d24ef470038b76e90bef41c2 100644
--- a/typo3/sysext/redirects/Tests/Unit/FormDataProvider/ValuePickerItemDataProviderTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/FormDataProvider/ValuePickerItemDataProviderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\FormDataProvider;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Core\Site\SiteFinder;
 use TYPO3\CMS\Redirects\FormDataProvider\ValuePickerItemDataProvider;
@@ -39,9 +40,7 @@ final class ValuePickerItemDataProviderTest extends UnitTestCase
         ],
     ];
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNothingIfNoRedirectDataGiven(): void
     {
         $result = [
@@ -54,9 +53,7 @@ final class ValuePickerItemDataProviderTest extends UnitTestCase
         self::assertSame($result, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataAddsHostsAsKeyAndValueToRedirectValuePicker(): void
     {
         // no results for now
@@ -75,9 +72,7 @@ final class ValuePickerItemDataProviderTest extends UnitTestCase
         self::assertSame($expected, $actualResult);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function addDataDoesNotChangeResultSetIfNoSitesAreFound(): void
     {
         $siteFinderMock = $this->getMockBuilder(SiteFinder::class)->disableOriginalConstructor()->getMock();
diff --git a/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/RedirectSourceCollectionTest.php b/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/RedirectSourceCollectionTest.php
index 8e44201bb00327448164457d6e3312310308cce5..6d0656703a1be234f4eb45de8b94873eeb742d2b 100644
--- a/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/RedirectSourceCollectionTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/RedirectSourceCollectionTest.php
@@ -17,24 +17,21 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\RedirectUpdate;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Redirects\RedirectUpdate\RedirectSourceCollection;
 use TYPO3\CMS\Redirects\RedirectUpdate\RedirectSourceInterface;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class RedirectSourceCollectionTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function countReturnsZeroIfNoItemsAdded(): void
     {
         $count = (new RedirectSourceCollection())->count();
         self::assertSame(0, $count);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function countReturnsCorrectCountOfItemsAdded(): void
     {
         $item = $this->createMock(RedirectSourceInterface::class);
@@ -42,9 +39,7 @@ final class RedirectSourceCollectionTest extends UnitTestCase
         self::assertSame(3, $subject->count());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function allReturnsItemsInTheSameOrderTheyHaveBeenAdded(): void
     {
         $item1 = $this->createMock(RedirectSourceInterface::class);
@@ -54,9 +49,7 @@ final class RedirectSourceCollectionTest extends UnitTestCase
         self::assertSame([$item3, $item1, $item2], $subject->all());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function throwsTypeExceptionIfInvalidItemIsAdded(): void
     {
         $this->expectException(\TypeError::class);
diff --git a/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/SlugRedirectChangeItemTest.php b/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/SlugRedirectChangeItemTest.php
index a8702d1b61971bc7070738ae8c749ed285c6372f..61dfc88d55d428ede663eb1b76aeb90a1fddfca9 100644
--- a/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/SlugRedirectChangeItemTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/RedirectUpdate/SlugRedirectChangeItemTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\RedirectUpdate;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Site\Entity\Site;
 use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
 use TYPO3\CMS\Redirects\RedirectUpdate\RedirectSourceCollection;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class SlugRedirectChangeItemTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function withChangedReturnsNewInstanceWithChangedSet(): void
     {
         $changeItem = $this->createInitialChangeItem();
@@ -36,9 +35,7 @@ final class SlugRedirectChangeItemTest extends UnitTestCase
         self::assertSame('/changed', $extendedChangeItem->getChanged()['slug'] ?? null);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function withSourcesCollectionReturnsNewInstanceWithCorrectSourcesCollection(): void
     {
         $changeItem = $this->createInitialChangeItem();
diff --git a/typo3/sysext/redirects/Tests/Unit/Repository/DemandTest.php b/typo3/sysext/redirects/Tests/Unit/Repository/DemandTest.php
index 40011c67d98738d2f52c94e3fc914e68b25b64d7..7a0f8ad5d3a2ba2a9688ca18230458fba0afcde9 100644
--- a/typo3/sysext/redirects/Tests/Unit/Repository/DemandTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Repository/DemandTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Repository;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Redirects\Repository\Demand;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -36,10 +38,8 @@ final class DemandTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getParametersRespectsDemandStateStateDataProvider
-     */
+    #[DataProvider('getParametersRespectsDemandStateStateDataProvider')]
+    #[Test]
     public function getParametersRespectsDemandState(array $input, array $expected): void
     {
         self::assertEquals($expected, (new Demand(...$input))->getParameters());
diff --git a/typo3/sysext/redirects/Tests/Unit/Service/RedirectServiceTest.php b/typo3/sysext/redirects/Tests/Unit/Service/RedirectServiceTest.php
index 4805bcd4b8b36b97eb3e2fd6da97402d5faa5ba6..148b7d7f59de09853c84b71cdcb789420de89188 100644
--- a/typo3/sysext/redirects/Tests/Unit/Service/RedirectServiceTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/Service/RedirectServiceTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\Service;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Log\NullLogger;
 use TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher;
@@ -61,9 +63,7 @@ final class RedirectServiceTest extends UnitTestCase
         $GLOBALS['SIM_ACCESS_TIME'] = 42;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsNullIfNoRedirectsExist(): void
     {
         $this->redirectCacheServiceMock->method('getRedirects')->willReturnMap([
@@ -76,10 +76,8 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertNull($result);
     }
 
-    /**
-     * @test
-     * @dataProvider matchRedirectReturnsRedirectOnFlatMatchDataProvider
-     */
+    #[DataProvider('matchRedirectReturnsRedirectOnFlatMatchDataProvider')]
+    #[Test]
     public function matchRedirectReturnsRedirectOnFlatMatch(string $path = ''): void
     {
         $row = [
@@ -137,9 +135,7 @@ final class RedirectServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsRedirectOnRespectQueryParametersMatch(): void
     {
         $row = [
@@ -174,9 +170,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertSame($row, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsRedirectOnRespectQueryParametersMatchWithSlash(): void
     {
         $row = [
@@ -211,9 +205,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertSame($row, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsRedirectOnFullRespectQueryParametersMatch(): void
     {
         $row = [
@@ -248,9 +240,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertSame($row, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsNullOnPartialRespectQueryParametersMatch(): void
     {
         $row = [
@@ -285,9 +275,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertNull($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsMatchingRedirectWithMatchingQueryParametersOverMatchingPath(): void
     {
         $row1 = [
@@ -338,9 +326,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertSame($row2, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsRedirectSpecificToDomainOnFlatMatchIfSpecificAndNonSpecificExist(): void
     {
         $row1 = [
@@ -390,9 +376,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertSame($row1, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsRedirectOnRegexMatch(): void
     {
         $row = [
@@ -427,9 +411,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertSame($row, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function matchRedirectReturnsOnlyActiveRedirects(): void
     {
         $row1 = [
@@ -473,9 +455,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertSame($row2, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlReturnsNullIfUrlCouldNotBeResolved(): void
     {
         $this->linkServiceMock->method('resolve')->with(self::anything())->willThrowException(new InvalidPathException('', 1516531195));
@@ -485,9 +465,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertNull($result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlReturnsUrlForTypeUrl(): void
     {
         $redirectTargetMatch = [
@@ -510,9 +488,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertEquals($uri, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlReturnsUrlForTypeFile(): void
     {
         $fileMock = $this->getMockBuilder(File::class)->disableOriginalConstructor()->getMock();
@@ -537,9 +513,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertEquals($uri, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlReturnsUrlForTypeFolder(): void
     {
         $folderMock = $this->getMockBuilder(Folder::class)->disableOriginalConstructor()->getMock();
@@ -565,9 +539,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertEquals($uri, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlRespectsForceHttps(): void
     {
         $redirectTargetMatch = [
@@ -590,9 +562,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertEquals($uri, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlAddsExistingQueryParams(): void
     {
         $redirectTargetMatch = [
@@ -616,9 +586,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertEquals($uri, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlRespectsAdditionalParametersFromTypolink(): void
     {
         $redirectService = $this->getAccessibleMock(
@@ -663,9 +631,7 @@ final class RedirectServiceTest extends UnitTestCase
         self::assertEquals($uri, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTargetUrlReplaceRegExpCaptureGroup(): void
     {
         $redirectTargetMatch = [
@@ -733,10 +699,8 @@ final class RedirectServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getTargetUrlWithQueryReplaceRegExpCaptureGroupDataProvider
-     */
+    #[DataProvider('getTargetUrlWithQueryReplaceRegExpCaptureGroupDataProvider')]
+    #[Test]
     public function getTargetUrlWithQueryReplaceRegExpCaptureGroup(
         string $redirectSourcePath,
         string $redirectTarget,
@@ -814,10 +778,8 @@ final class RedirectServiceTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider getTargetUrlWithQueryAndSlashReplaceRegExpCaptureGroupDataProvider
-     */
+    #[DataProvider('getTargetUrlWithQueryAndSlashReplaceRegExpCaptureGroupDataProvider')]
+    #[Test]
     public function getTargetUrlWithQueryAndSlashReplaceRegExpCaptureGroup(
         string $redirectSourcePath,
         string $redirectTarget,
diff --git a/typo3/sysext/redirects/Tests/Unit/ViewHelpers/TargetPageIdViewHelperTest.php b/typo3/sysext/redirects/Tests/Unit/ViewHelpers/TargetPageIdViewHelperTest.php
index 67eb486e6d8977d28967ff02a555bc2a3bf9f138..85a7083cbee69c5ce32f91792f94850d46b6ddf2 100644
--- a/typo3/sysext/redirects/Tests/Unit/ViewHelpers/TargetPageIdViewHelperTest.php
+++ b/typo3/sysext/redirects/Tests/Unit/ViewHelpers/TargetPageIdViewHelperTest.php
@@ -17,15 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Redirects\Tests\Unit\ViewHelpers;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Fluid\Core\Rendering\RenderingContext;
 use TYPO3\CMS\Redirects\ViewHelpers\TargetPageIdViewHelper;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TargetPageIdViewHelperTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function nonTypo3TargetInRenderStaticReturnsEmptyString(): void
     {
         $renderingContext = new class () extends RenderingContext {
@@ -35,9 +34,7 @@ final class TargetPageIdViewHelperTest extends UnitTestCase
         self::assertSame('', TargetPageIdViewHelper::renderStatic($args, static fn() => '', $renderingContext));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function emptyTargetInRenderStaticReturnsEmptyString(): void
     {
         $renderingContext = new class () extends RenderingContext {
diff --git a/typo3/sysext/reports/Tests/Unit/Report/Status/StatusTest.php b/typo3/sysext/reports/Tests/Unit/Report/Status/StatusTest.php
index c213eb401f3add9a6a34bb289a8ab3ab4f7ddaac..39d2e6a0062a652e77613a2d7b80d20bc807bcee 100644
--- a/typo3/sysext/reports/Tests/Unit/Report/Status/StatusTest.php
+++ b/typo3/sysext/reports/Tests/Unit/Report/Status/StatusTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Reports\Tests\Unit\Report\Status;
 
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Container\ContainerInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\View\BackendViewFactory;
@@ -43,9 +44,7 @@ final class StatusTest extends UnitTestCase
         $GLOBALS['LANG'] = $mockLanguageService;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getSystemStatusCollectsAllStatusProvider(): void
     {
         $statusProviderArguments = [
@@ -87,9 +86,7 @@ final class StatusTest extends UnitTestCase
         self::assertSame($httpHeader[1], $result[$statusProviderArguments[2][1]][0]->getValue());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getDetailedSystemStatusReturnsOnlyExtendedStatuses(): void
     {
         $statusProviderArguments = [
diff --git a/typo3/sysext/reports/Tests/Unit/Report/Status/Typo3StatusTest.php b/typo3/sysext/reports/Tests/Unit/Report/Status/Typo3StatusTest.php
index 4cf6ead46819bbef4ab2672430baebcec48b4e19..5c374c60b6f3d36e3233de83496ea6ebe9cfc753 100644
--- a/typo3/sysext/reports/Tests/Unit/Report/Status/Typo3StatusTest.php
+++ b/typo3/sysext/reports/Tests/Unit/Report/Status/Typo3StatusTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Reports\Tests\Unit\Report\Status;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Localization\LanguageService;
 use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
 use TYPO3\CMS\Reports\Report\Status\Typo3Status;
@@ -31,9 +32,7 @@ final class Typo3StatusTest extends UnitTestCase
         $GLOBALS['LANG'] = $mockLanguageService;
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsXclassStatusObjectWithSeverityOkIfNoXclassExists(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'] = [];
@@ -43,9 +42,7 @@ final class Typo3StatusTest extends UnitTestCase
         self::assertSame(ContextualFeedbackSeverity::OK, $statusObject->getSeverity());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getStatusReturnsXclassStatusObjectWithSeverityNoticeIfXclassExists(): void
     {
         $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'] = [
diff --git a/typo3/sysext/scheduler/Tests/Unit/CronCommand/CronCommandTest.php b/typo3/sysext/scheduler/Tests/Unit/CronCommand/CronCommandTest.php
index bb43db833119b5154f5091536b13612ae27a2158..abb340deffb34490104a75541eb7af7daf34f4eb 100644
--- a/typo3/sysext/scheduler/Tests/Unit/CronCommand/CronCommandTest.php
+++ b/typo3/sysext/scheduler/Tests/Unit/CronCommand/CronCommandTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Scheduler\Tests\Unit\CronCommand;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Scheduler\CronCommand\CronCommand;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
@@ -51,18 +53,14 @@ final class CronCommandTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsNormalizedCronCommandSections(): void
     {
         $instance = new CronCommand('2-3 * * * *');
         self::assertSame(['2,3', '*', '*', '*', '*'], $instance->getCronCommandSections());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorThrowsExceptionForInvalidCronCommand(): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -70,9 +68,7 @@ final class CronCommandTest extends UnitTestCase
         new CronCommand('61 * * * *');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTimestampToNowPlusOneMinuteRoundedDownToSixtySeconds(): void
     {
         $instance = new CronCommand('* * * * *');
@@ -81,18 +77,14 @@ final class CronCommandTest extends UnitTestCase
         self::assertSame($expectedTime, $instance->getTimestamp());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTimestampToGivenTimestampPlusSixtySeconds(): void
     {
         $instance = new CronCommand('* * * * *', self::TIMESTAMP);
         self::assertSame(self::TIMESTAMP + 60, $instance->getTimestamp());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function constructorSetsTimestampToGiveTimestampRoundedDownToSixtySeconds(): void
     {
         $instance = new CronCommand('* * * * *', self::TIMESTAMP + 1);
@@ -232,12 +224,12 @@ final class CronCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider expectedTimestampDataProvider
      * @param string $cronCommand Cron command
      * @param int $startTimestamp Timestamp for start of calculation
      * @param int $expectedTimestamp Expected result (next time of execution)
      */
+    #[DataProvider('expectedTimestampDataProvider')]
+    #[Test]
     public function calculateNextValueDeterminesCorrectNextTimestamp(string $cronCommand, int $startTimestamp, int $expectedTimestamp): void
     {
         $instance = new CronCommand($cronCommand, $startTimestamp);
@@ -246,12 +238,12 @@ final class CronCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider expectedCalculatedTimestampDataProvider
      * @param string $cronCommand Cron command
      * @param int $startTimestamp Timestamp for start of calculation
      * @param string $expectedTimestamp Expected result (next time of execution), to be fed to strtotime
      */
+    #[DataProvider('expectedCalculatedTimestampDataProvider')]
+    #[Test]
     public function calculateNextValueDeterminesCorrectNextCalculatedTimestamp(string $cronCommand, int $startTimestamp, string $expectedTimestamp): void
     {
         $instance = new CronCommand($cronCommand, $startTimestamp);
@@ -260,13 +252,13 @@ final class CronCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider expectedTimestampDataProvider
      * @param string $cronCommand Cron command
      * @param int $startTimestamp [unused] Timestamp for start of calculation
      * @param int $firstTimestamp Timestamp of the next execution
      * @param int $secondTimestamp Timestamp of the further execution
      */
+    #[DataProvider('expectedTimestampDataProvider')]
+    #[Test]
     public function calculateNextValueDeterminesCorrectNextTimestampOnConsecutiveCall(string $cronCommand, int $startTimestamp, int $firstTimestamp, int $secondTimestamp): void
     {
         $instance = new CronCommand($cronCommand, $firstTimestamp);
@@ -275,13 +267,13 @@ final class CronCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider expectedCalculatedTimestampDataProvider
      * @param string $cronCommand Cron command
      * @param int $startTimestamp [unused] Timestamp for start of calculation
      * @param string $firstTimestamp Timestamp of the next execution, to be fed to strtotime
      * @param string $secondTimestamp Timestamp of the further execution, to be fed to strtotime
      */
+    #[DataProvider('expectedCalculatedTimestampDataProvider')]
+    #[Test]
     public function calculateNextValueDeterminesCorrectNextCalculatedTimestampOnConsecutiveCall(string $cronCommand, int $startTimestamp, string $firstTimestamp, string $secondTimestamp): void
     {
         $instance = new CronCommand($cronCommand, strtotime($firstTimestamp));
@@ -289,9 +281,7 @@ final class CronCommandTest extends UnitTestCase
         self::assertSame(strtotime($secondTimestamp), $instance->getTimestamp());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function calculateNextValueDeterminesCorrectNextTimestampOnChangeToSummertime(): void
     {
         $backupTimezone = date_default_timezone_get();
@@ -302,9 +292,7 @@ final class CronCommandTest extends UnitTestCase
         self::assertSame(1269741600, $instance->getTimestamp());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function calculateNextValueThrowsExceptionWithImpossibleCronCommand(): void
     {
         $this->expectException(\RuntimeException::class);
@@ -313,18 +301,14 @@ final class CronCommandTest extends UnitTestCase
         $instance->calculateNextValue();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getTimestampReturnsInteger(): void
     {
         $instance = new CronCommand('* * * * *');
         self::assertIsInt($instance->getTimestamp());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCronCommandSectionsReturnsArray(): void
     {
         $instance = new CronCommand('* * * * *');
diff --git a/typo3/sysext/scheduler/Tests/Unit/CronCommand/NormalizeCommandTest.php b/typo3/sysext/scheduler/Tests/Unit/CronCommand/NormalizeCommandTest.php
index 7f6c32ce2f6bdf74116b136825cefbb6e3a6348c..5e6204093a68da5880c2c619c9b142c9e6b3d1d8 100644
--- a/typo3/sysext/scheduler/Tests/Unit/CronCommand/NormalizeCommandTest.php
+++ b/typo3/sysext/scheduler/Tests/Unit/CronCommand/NormalizeCommandTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Scheduler\Tests\Unit\CronCommand;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Scheduler\CronCommand\NormalizeCommand;
 use TYPO3\CMS\Scheduler\Tests\Unit\CronCommand\AccessibleProxies\NormalizeCommandAccessibleProxy;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
@@ -56,11 +58,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider normalizeValidDataProvider
      * @param string $expression Cron command to test
      * @param string $expected Expected result (normalized cron command syntax)
      */
+    #[DataProvider('normalizeValidDataProvider')]
+    #[Test]
     public function normalizeConvertsCronCommand(string $expression, string $expected): void
     {
         $result = NormalizeCommand::normalize($expression);
@@ -81,20 +83,18 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validSpecialKeywordsDataProvider
      * @param string $keyword Cron command keyword
      * @param string $expectedCronCommand Expected result (normalized cron command syntax)
      */
+    #[DataProvider('validSpecialKeywordsDataProvider')]
+    #[Test]
     public function convertKeywordsToCronCommandConvertsValidKeywords(string $keyword, string $expectedCronCommand): void
     {
         $result = NormalizeCommandAccessibleProxy::convertKeywordsToCronCommand($keyword);
         self::assertEquals($expectedCronCommand, $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function convertKeywordsToCronCommandReturnsUnchangedCommandIfKeywordWasNotFound(): void
     {
         $invalidKeyword = 'foo';
@@ -114,11 +114,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider normalizeFieldsValidDataProvider
      * @param string $expression Cron command to normalize
      * @param string $expected Expected result (normalized cron command syntax)
      */
+    #[DataProvider('normalizeFieldsValidDataProvider')]
+    #[Test]
     public function normalizeFieldsConvertsField(string $expression, string $expected): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeFields($expression);
@@ -151,12 +151,12 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider normalizeMonthAndWeekdayFieldValidDataProvider
      * @param string $expression Cron command partial expression for month and weekday fields
      * @param bool $isMonthField Flag to designate month field or not
      * @param string $expected Expected result (normalized months or weekdays)
      */
+    #[DataProvider('normalizeMonthAndWeekdayFieldValidDataProvider')]
+    #[Test]
     public function normalizeMonthAndWeekdayFieldReturnsNormalizedListForValidExpression(
         string $expression,
         bool $isMonthField,
@@ -179,12 +179,12 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider normalizeMonthAndWeekdayFieldInvalidDataProvider
      * @param string $expression Cron command partial expression for month and weekday fields (invalid)
      * @param bool $isMonthField Flag to designate month field or not
      * @param int $expectedExceptionCode Expected exception code from provider
      */
+    #[DataProvider('normalizeMonthAndWeekdayFieldInvalidDataProvider')]
+    #[Test]
     public function normalizeMonthAndWeekdayFieldThrowsExceptionForInvalidExpression(
         string $expression,
         bool $isMonthField,
@@ -215,11 +215,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider normalizeIntegerFieldValidDataProvider
      * @param string|int $expression Cron command partial integer expression
      * @param string $expected Expected result (normalized integer or integer list)
      */
+    #[DataProvider('normalizeIntegerFieldValidDataProvider')]
+    #[Test]
     public function normalizeIntegerFieldReturnsNormalizedListForValidExpression($expression, string $expected): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeIntegerField($expression);
@@ -243,13 +243,13 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider normalizeIntegerFieldInvalidDataProvider
      * @param string $expression Cron command partial integer expression (invalid)
      * @param int $lowerBound Lower limit
      * @param int $upperBound Upper limit
      * @param int $expectedExceptionCode Expected exception code
      */
+    #[DataProvider('normalizeIntegerFieldInvalidDataProvider')]
+    #[Test]
     public function normalizeIntegerFieldThrowsExceptionForInvalidExpressions(
         string $expression,
         int $lowerBound,
@@ -262,9 +262,7 @@ final class NormalizeCommandTest extends UnitTestCase
         NormalizeCommandAccessibleProxy::normalizeIntegerField($expression, $lowerBound, $upperBound);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function splitFieldsReturnsIntegerArrayWithFieldsSplitByWhitespace(): void
     {
         $result = NormalizeCommandAccessibleProxy::splitFields('12,13 * 1-12/2,14 jan fri');
@@ -290,10 +288,10 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider invalidCronCommandFieldsDataProvider
      * @param string|int $cronCommand Invalid cron command
      */
+    #[DataProvider('invalidCronCommandFieldsDataProvider')]
+    #[Test]
     public function splitFieldsThrowsExceptionIfCronCommandDoesNotContainFiveFields($cronCommand): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -314,11 +312,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validRangeDataProvider
      * @param string|int $range Cron command range expression
      * @param string $expected Expected result (normalized range)
      */
+    #[DataProvider('validRangeDataProvider')]
+    #[Test]
     public function convertRangeToListOfValuesReturnsCorrectListForValidRanges($range, string $expected): void
     {
         $result = NormalizeCommandAccessibleProxy::convertRangeToListOfValues($range);
@@ -342,11 +340,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider invalidRangeDataProvider
      * @param string $range Cron command range expression (invalid)
      * @param int $expectedExceptionCode Expected exception code from provider
      */
+    #[DataProvider('invalidRangeDataProvider')]
+    #[Test]
     public function convertRangeToListOfValuesThrowsExceptionForInvalidRanges(string $range, int $expectedExceptionCode): void
     {
         $this->expectException(\InvalidArgumentException::class);
@@ -365,11 +363,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validStepsDataProvider
      * @param string $stepExpression Cron command step expression
      * @param string $expected Expected result (normalized range)
      */
+    #[DataProvider('validStepsDataProvider')]
+    #[Test]
     public function reduceListOfValuesByStepValueReturnsCorrectListOfValues(string $stepExpression, string $expected): void
     {
         $result = NormalizeCommandAccessibleProxy::reduceListOfValuesByStepValue($stepExpression);
@@ -392,11 +390,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider invalidStepsDataProvider
      * @param string $stepExpression Cron command step expression (invalid)
      * @param int $expectedExceptionCode Expected exception code
      */
+    #[DataProvider('invalidStepsDataProvider')]
+    #[Test]
     public function reduceListOfValuesByStepValueThrowsExceptionForInvalidStepExpressions(
         string $stepExpression,
         int $expectedExceptionCode
@@ -407,27 +405,21 @@ final class NormalizeCommandTest extends UnitTestCase
         NormalizeCommandAccessibleProxy::reduceListOfValuesByStepValue($stepExpression);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function normalizeMonthAndWeekdayNormalizesAMonth(): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeMonthAndWeekday('feb', true);
         self::assertSame('2', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function normalizeMonthAndWeekdayNormalizesAWeekday(): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeMonthAndWeekday('fri', false);
         self::assertSame('5', $result);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function normalizeMonthAndWeekdayLeavesValueUnchanged(): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeMonthAndWeekday('2');
@@ -457,11 +449,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validMonthNamesDataProvider
      * @param string|int $monthName Month name
      * @param int $expectedInteger Number of the month
      */
+    #[DataProvider('validMonthNamesDataProvider')]
+    #[Test]
     public function normalizeMonthConvertsName($monthName, int $expectedInteger): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeMonth($monthName);
@@ -469,10 +461,10 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validMonthNamesDataProvider
      * @param string|int $monthName Month name
      */
+    #[DataProvider('validMonthNamesDataProvider')]
+    #[Test]
     public function normalizeMonthReturnsInteger($monthName): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeMonth($monthName);
@@ -505,11 +497,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider invalidMonthNamesDataProvider
      * @param string|int $invalidMonthName Month name (invalid)
      * @param int $expectedExceptionCode Expected exception code
      */
+    #[DataProvider('invalidMonthNamesDataProvider')]
+    #[Test]
     public function normalizeMonthThrowsExceptionForInvalidMonthRepresentation(
         $invalidMonthName,
         int $expectedExceptionCode
@@ -553,11 +545,11 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validWeekdayDataProvider
      * @param string|int $weekday Weekday expression
      * @param int $expectedInteger Number of weekday
      */
+    #[DataProvider('validWeekdayDataProvider')]
+    #[Test]
     public function normalizeWeekdayConvertsName($weekday, int $expectedInteger): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeWeekday($weekday);
@@ -565,10 +557,10 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider validWeekdayDataProvider
      * @param string|int $weekday Weekday expression
      */
+    #[DataProvider('validWeekdayDataProvider')]
+    #[Test]
     public function normalizeWeekdayReturnsInteger($weekday): void
     {
         $result = NormalizeCommandAccessibleProxy::normalizeWeekday($weekday);
@@ -599,10 +591,10 @@ final class NormalizeCommandTest extends UnitTestCase
     }
 
     /**
-     * @test
-     * @dataProvider invalidWeekdayDataProvider
      * @param string|int $weekday Weekday expression (invalid)
      */
+    #[DataProvider('invalidWeekdayDataProvider')]
+    #[Test]
     public function normalizeWeekdayThrowsExceptionForInvalidWeekdayRepresentation($weekday): void
     {
         $this->expectException(\InvalidArgumentException::class);
diff --git a/typo3/sysext/scheduler/Tests/Unit/Task/CachingFrameworkGarbageCollectionTest.php b/typo3/sysext/scheduler/Tests/Unit/Task/CachingFrameworkGarbageCollectionTest.php
index 90d52995b318d44c9d2c2382e9f6010698a0837e..14dbcef87510a474c29774819bc9b4daa3d45c81 100644
--- a/typo3/sysext/scheduler/Tests/Unit/Task/CachingFrameworkGarbageCollectionTest.php
+++ b/typo3/sysext/scheduler/Tests/Unit/Task/CachingFrameworkGarbageCollectionTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Scheduler\Tests\Unit\Task;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Cache\Backend\AbstractBackend;
 use TYPO3\CMS\Core\Cache\Backend\NullBackend;
 use TYPO3\CMS\Core\Cache\CacheManager;
@@ -29,9 +30,7 @@ final class CachingFrameworkGarbageCollectionTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function executeCallsCollectGarbageOfConfiguredBackend(): void
     {
         $cache = $this->createMock(VariableFrontend::class);
@@ -54,9 +53,7 @@ final class CachingFrameworkGarbageCollectionTest extends UnitTestCase
         $subject->execute();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function executeDoesNotCallCollectGarbageOfNotConfiguredBackend(): void
     {
         $cache = $this->createMock(VariableFrontend::class);
diff --git a/typo3/sysext/scheduler/Tests/Unit/Task/ExecuteSchedulableCommandAdditionalFieldProviderTest.php b/typo3/sysext/scheduler/Tests/Unit/Task/ExecuteSchedulableCommandAdditionalFieldProviderTest.php
index 9dc656f40edd0b4b6c434c846f1d0c347b6fde84..45f675337d6cfc920ed7fb083d4a4afcdba2cc8f 100644
--- a/typo3/sysext/scheduler/Tests/Unit/Task/ExecuteSchedulableCommandAdditionalFieldProviderTest.php
+++ b/typo3/sysext/scheduler/Tests/Unit/Task/ExecuteSchedulableCommandAdditionalFieldProviderTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Scheduler\Tests\Unit\Task;
 
+use PHPUnit\Framework\Attributes\Test;
 use Symfony\Component\Console\Command\Command;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Console\CommandRegistry;
@@ -36,9 +37,7 @@ final class ExecuteSchedulableCommandAdditionalFieldProviderTest extends UnitTes
 {
     protected bool $resetSingletonInstances = true;
 
-    /**
-     * @test
-     */
+    #[Test]
     public function argumentsAndOptionsWithSameNameAreAdded(): void
     {
         $GLOBALS['BE_USER'] = new BackendUserAuthentication();
diff --git a/typo3/sysext/scheduler/Tests/Unit/Task/TaskSerializerTest.php b/typo3/sysext/scheduler/Tests/Unit/Task/TaskSerializerTest.php
index f30d66e47620907a73ec9348d51497e43b3b198c..0fe9be99dab60a82653c1e3aa6c88c676a9663bd 100644
--- a/typo3/sysext/scheduler/Tests/Unit/Task/TaskSerializerTest.php
+++ b/typo3/sysext/scheduler/Tests/Unit/Task/TaskSerializerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Scheduler\Tests\Unit\Task;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Log\Writer\NullWriter;
 use TYPO3\CMS\Scheduler\Exception\InvalidTaskException;
 use TYPO3\CMS\Scheduler\Task\TaskSerializer;
@@ -45,10 +47,8 @@ final class TaskSerializerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider dataIsDeserializedDataProvider
-     */
+    #[DataProvider('dataIsDeserializedDataProvider')]
+    #[Test]
     public function dataIsDeserialized(string $data, $expectation): void
     {
         $taskSerializer = new TaskSerializer();
@@ -85,10 +85,8 @@ final class TaskSerializerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider deserializationThrowsExceptionDataProvider
-     */
+    #[DataProvider('deserializationThrowsExceptionDataProvider')]
+    #[Test]
     public function deserializationThrowsException(string $data, int $exceptionCode): void
     {
         $this->expectException(InvalidTaskException::class);
@@ -114,10 +112,8 @@ final class TaskSerializerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider classNameIsResolvedDataProvider
-     */
+    #[DataProvider('classNameIsResolvedDataProvider')]
+    #[Test]
     public function classNameIsResolved(?object $task, ?string $expectation): void
     {
         $taskSerializer = new TaskSerializer();
@@ -142,10 +138,8 @@ final class TaskSerializerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider classNameIsExtractedDataProvider
-     */
+    #[DataProvider('classNameIsExtractedDataProvider')]
+    #[Test]
     public function classNameIsExtracted(string $serializedTask, ?string $expectation): void
     {
         $taskSerializer = new TaskSerializer();
diff --git a/typo3/sysext/scheduler/Tests/Unit/Validation/Validator/TaskValidatorTest.php b/typo3/sysext/scheduler/Tests/Unit/Validation/Validator/TaskValidatorTest.php
index 09ea011490b54f4884c9a712987283d95228b468..5e89f560e09929cf75805939f39092fca284f6f4 100644
--- a/typo3/sysext/scheduler/Tests/Unit/Validation/Validator/TaskValidatorTest.php
+++ b/typo3/sysext/scheduler/Tests/Unit/Validation/Validator/TaskValidatorTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Scheduler\Tests\Unit\Validation\Validator;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Scheduler\Execution;
 use TYPO3\CMS\Scheduler\Task\AbstractTask;
 use TYPO3\CMS\Scheduler\Validation\Validator\TaskValidator;
@@ -24,18 +25,14 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TaskValidatorTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidReturnsFalseWithClassNotExtendingAbstractTask(): void
     {
         $subject = new TaskValidator();
         self::assertFalse($subject->isValid($subject));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidReturnsFalseWithClassNotProperlyImplementingGetExecution(): void
     {
         $subject = new TaskValidator();
@@ -49,9 +46,7 @@ final class TaskValidatorTest extends UnitTestCase
         self::assertFalse($subject->isValid($input));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isValidReturnsTrueWithClassProperlyImplementingAbstractTask(): void
     {
         $subject = new TaskValidator();
diff --git a/typo3/sysext/seo/Tests/Unit/Event/ModifyUrlForCanonicalTagEventTest.php b/typo3/sysext/seo/Tests/Unit/Event/ModifyUrlForCanonicalTagEventTest.php
index 0607b423feaa9149310cc91fa5859eeab3263881..62433e1f692a4558f211d0fa8132accf1a074b3c 100644
--- a/typo3/sysext/seo/Tests/Unit/Event/ModifyUrlForCanonicalTagEventTest.php
+++ b/typo3/sysext/seo/Tests/Unit/Event/ModifyUrlForCanonicalTagEventTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Seo\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Domain\Page;
 use TYPO3\CMS\Core\Http\ServerRequest;
 use TYPO3\CMS\Core\Http\Uri;
@@ -25,9 +26,7 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class ModifyUrlForCanonicalTagEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $url = (string)new Uri('https://example.com');
diff --git a/typo3/sysext/seo/Tests/Unit/HrefLang/HrefLangGeneratorTest.php b/typo3/sysext/seo/Tests/Unit/HrefLang/HrefLangGeneratorTest.php
index ff17349e75751943d07b476783ba8b1eb5562543..3b6ee3735818caf5db9787482c7a1a2dc4112422 100644
--- a/typo3/sysext/seo/Tests/Unit/HrefLang/HrefLangGeneratorTest.php
+++ b/typo3/sysext/seo/Tests/Unit/HrefLang/HrefLangGeneratorTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Seo\Tests\Unit\HrefLang;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use Psr\Http\Message\UriInterface;
 use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
@@ -65,10 +67,8 @@ final class HrefLangGeneratorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider urlPathWithoutHostDataProvider
-     */
+    #[DataProvider('urlPathWithoutHostDataProvider')]
+    #[Test]
     public function checkIfSiteLanguageGetBaseIsCalledForUrlsWithoutHost(string $url): void
     {
         $mockUriInterface = $this->getMockBuilder(UriInterface::class)->getMock();
@@ -95,10 +95,8 @@ final class HrefLangGeneratorTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     * @dataProvider urlPathWithHostDataProvider
-     */
+    #[DataProvider('urlPathWithHostDataProvider')]
+    #[Test]
     public function checkIfSiteLanguageGetBaseIsNotCalledForUrlsWithHost(string $url): void
     {
         $mockUriInterface = $this->getMockBuilder(UriInterface::class)->getMock();
diff --git a/typo3/sysext/seo/Tests/Unit/MetaTag/OpenGraphMetaTagManagerTest.php b/typo3/sysext/seo/Tests/Unit/MetaTag/OpenGraphMetaTagManagerTest.php
index 95235ed872f991ac5fd4be16264e753605784778..de29b9d0d0c1f7ea548eb4ff1321719a009bd3ea 100644
--- a/typo3/sysext/seo/Tests/Unit/MetaTag/OpenGraphMetaTagManagerTest.php
+++ b/typo3/sysext/seo/Tests/Unit/MetaTag/OpenGraphMetaTagManagerTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Seo\Tests\Unit\MetaTag;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Seo\MetaTag\OpenGraphMetaTagManager;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class OpenGraphMetaTagManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfGetAllHandledPropertiesReturnsNonEmptyArray(): void
     {
         $manager = new OpenGraphMetaTagManager();
@@ -33,11 +33,8 @@ final class OpenGraphMetaTagManagerTest extends UnitTestCase
         self::assertNotEmpty($handledProperties);
     }
 
-    /**
-     * @dataProvider propertiesProvider
-     *
-     * @test
-     */
+    #[DataProvider('propertiesProvider')]
+    #[Test]
     public function checkIfPropertyIsStoredAfterAddingProperty(array $property, array $expected, string $expectedRenderedTag): void
     {
         $manager = new OpenGraphMetaTagManager();
@@ -51,9 +48,7 @@ final class OpenGraphMetaTagManagerTest extends UnitTestCase
         self::assertEquals($expectedRenderedTag, $manager->renderProperty($property['property']));
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfAddingOnlySubPropertyAndNoMainPropertyIsReturningException(): void
     {
         $manager = new OpenGraphMetaTagManager();
@@ -62,9 +57,7 @@ final class OpenGraphMetaTagManagerTest extends UnitTestCase
         $manager->addProperty('og:image:width', '400');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRenderAllPropertiesRendersCorrectMetaTags(): void
     {
         $properties = [
@@ -127,9 +120,7 @@ final class OpenGraphMetaTagManagerTest extends UnitTestCase
         self::assertEquals($expected, $manager->renderAllProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfRemovePropertyReallyRemovesProperty(): void
     {
         $manager = new OpenGraphMetaTagManager();
diff --git a/typo3/sysext/seo/Tests/Unit/MetaTag/TwitterCardMetaTagManagerTest.php b/typo3/sysext/seo/Tests/Unit/MetaTag/TwitterCardMetaTagManagerTest.php
index d8ab1ea6108e2c779125a09921f27877adc31085..7676723bb9dbe619653a378089ee9a7e78a624db 100644
--- a/typo3/sysext/seo/Tests/Unit/MetaTag/TwitterCardMetaTagManagerTest.php
+++ b/typo3/sysext/seo/Tests/Unit/MetaTag/TwitterCardMetaTagManagerTest.php
@@ -17,14 +17,14 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Seo\Tests\Unit\MetaTag;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Seo\MetaTag\TwitterCardMetaTagManager;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class TwitterCardMetaTagManagerTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfGetAllHandledPropertiesReturnsNonEmptyArray(): void
     {
         $manager = new TwitterCardMetaTagManager();
@@ -33,11 +33,8 @@ final class TwitterCardMetaTagManagerTest extends UnitTestCase
         self::assertNotEmpty($handledProperties);
     }
 
-    /**
-     * @dataProvider propertiesProvider
-     *
-     * @test
-     */
+    #[DataProvider('propertiesProvider')]
+    #[Test]
     public function checkIfPropertyIsStoredAfterAddingProperty(array $property, array $expected, string $expectedRenderedTag): void
     {
         $manager = new TwitterCardMetaTagManager();
@@ -116,9 +113,7 @@ final class TwitterCardMetaTagManagerTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfAddingOnlySubPropertyAndNoMainPropertyIsReturningException(): void
     {
         $manager = new TwitterCardMetaTagManager();
@@ -127,9 +122,7 @@ final class TwitterCardMetaTagManagerTest extends UnitTestCase
         $manager->addProperty('og:image:width', '400');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkRenderAllPropertiesRendersCorrectMetaTags(): void
     {
         $properties = [
@@ -182,9 +175,7 @@ final class TwitterCardMetaTagManagerTest extends UnitTestCase
         self::assertEquals($expected, $manager->renderAllProperties());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfRemovePropertyReallyRemovesProperty(): void
     {
         $manager = new TwitterCardMetaTagManager();
diff --git a/typo3/sysext/seo/Tests/Unit/XmlSitemap/PagesXmlSitemapDataProviderTest.php b/typo3/sysext/seo/Tests/Unit/XmlSitemap/PagesXmlSitemapDataProviderTest.php
index 2e34aad403f5ad71773c23b5bbcaf790fdfba900..288a9473f60727822b79e012cd3ab80f908da582 100644
--- a/typo3/sysext/seo/Tests/Unit/XmlSitemap/PagesXmlSitemapDataProviderTest.php
+++ b/typo3/sysext/seo/Tests/Unit/XmlSitemap/PagesXmlSitemapDataProviderTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Seo\Tests\Unit\XmlSitemap;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
 use TYPO3\CMS\Seo\XmlSitemap\PagesXmlSitemapDataProvider;
@@ -51,9 +53,7 @@ final class PagesXmlSitemapDataProviderTest extends UnitTestCase
         ];
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkIfCorrectKeyIsGivenAfterConstruct(): void
     {
         $key = 'dummyKey';
@@ -69,10 +69,8 @@ final class PagesXmlSitemapDataProviderTest extends UnitTestCase
         self::assertEquals($key, $subject->getKey());
     }
 
-    /**
-     * @dataProvider numberOfItemsPerPageProvider
-     * @test
-     */
+    #[DataProvider('numberOfItemsPerPageProvider')]
+    #[Test]
     public function checkGetItemsReturnsDefinedItems(int $numberOfItemsPerPage): void
     {
         $key = 'dummyKey';
@@ -103,9 +101,7 @@ final class PagesXmlSitemapDataProviderTest extends UnitTestCase
         self::assertEquals($expectedReturnedItems, $returnedItems);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function checkGetLastModReturnsRightDate(): void
     {
         $key = 'dummyKey';
diff --git a/typo3/sysext/t3editor/Tests/Unit/Registry/AddonRegistryTest.php b/typo3/sysext/t3editor/Tests/Unit/Registry/AddonRegistryTest.php
index 6a7417324a0db260c3ffb4d01bdaefc7cdfe9e43..180484532c3898313df164b47ba21d504b549929 100644
--- a/typo3/sysext/t3editor/Tests/Unit/Registry/AddonRegistryTest.php
+++ b/typo3/sysext/t3editor/Tests/Unit/Registry/AddonRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\T3editor\Tests\Unit\Registry;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\T3editor\Addon;
 use TYPO3\CMS\T3editor\Registry\AddonRegistry;
@@ -64,9 +65,7 @@ final class AddonRegistryTest extends UnitTestCase
             );
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function globalAddonsGetReturned(): void
     {
         $expected = [
@@ -84,9 +83,7 @@ final class AddonRegistryTest extends UnitTestCase
         self::assertSame($expected, $actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function settingsAreProperlyCompiled(): void
     {
         $expected = [
diff --git a/typo3/sysext/t3editor/Tests/Unit/Registry/ModeRegistryTest.php b/typo3/sysext/t3editor/Tests/Unit/Registry/ModeRegistryTest.php
index 930b1f5df323731864c04195ff7edac11d9c4781..e6bff59f67fbf133f711662af427070ab17fdc39 100644
--- a/typo3/sysext/t3editor/Tests/Unit/Registry/ModeRegistryTest.php
+++ b/typo3/sysext/t3editor/Tests/Unit/Registry/ModeRegistryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\T3editor\Tests\Unit\Registry;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\T3editor\Mode;
@@ -36,9 +37,7 @@ final class ModeRegistryTest extends UnitTestCase
         $this->subject = new ModeRegistry();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function latestDefaultModeIsReturned(): void
     {
         $module = JavaScriptModuleInstruction::create('@test/foo', 'bar')->invoke();
@@ -50,9 +49,7 @@ final class ModeRegistryTest extends UnitTestCase
         self::assertSame($expected, $actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function formatCodeReturnsCorrectMode(): void
     {
         $module = JavaScriptModuleInstruction::create('@test/mode', 'formatCode')->invoke();
@@ -63,9 +60,7 @@ final class ModeRegistryTest extends UnitTestCase
         self::assertSame($expected, $actual);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function modeIsFetchedByFileExtension(): void
     {
         $module = JavaScriptModuleInstruction::create('@test/mode', 'extension')->invoke();
diff --git a/typo3/sysext/webhooks/Tests/Unit/Factory/WebhookInstructionFactoryTest.php b/typo3/sysext/webhooks/Tests/Unit/Factory/WebhookInstructionFactoryTest.php
index 1f4d9ff0de906af0b189cbd7df0d28fa153196cf..6967cc4423e8600dc3f2f0071972a3d5ec3ffc5f 100644
--- a/typo3/sysext/webhooks/Tests/Unit/Factory/WebhookInstructionFactoryTest.php
+++ b/typo3/sysext/webhooks/Tests/Unit/Factory/WebhookInstructionFactoryTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Webhooks\Tests\Unit\Factory;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Webhooks\Factory\WebhookInstructionFactory;
 use TYPO3\CMS\Webhooks\Model\WebhookType;
@@ -52,9 +53,7 @@ final class WebhookInstructionFactoryTest extends UnitTestCase
         $this->webhookType = new WebhookType('typo3/test-webhook', 'My WebhookType description', 'My\Webhook\Type', 'myFactoryMethod');
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createWebhookInstructionWithMinimalData(): void
     {
         $webhookInstruction = WebhookInstructionFactory::create(
@@ -74,9 +73,7 @@ final class WebhookInstructionFactoryTest extends UnitTestCase
         self::assertSame([], $webhookInstruction->getRow());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createWebhookInstructionWithAllData(): void
     {
         $this->mockRecord['webhook_type'] = $this->webhookType;
@@ -107,9 +104,7 @@ final class WebhookInstructionFactoryTest extends UnitTestCase
         self::assertSame([], $webhookInstruction->getRow());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function createWebhookInstructionFromRow(): void
     {
         $webhookTypesRegistryMock = $this->createMock(WebhookTypesRegistry::class);
diff --git a/typo3/sysext/workspaces/Tests/Unit/Controller/Remote/RemoteServerTest.php b/typo3/sysext/workspaces/Tests/Unit/Controller/Remote/RemoteServerTest.php
index c32b9885932f797354b8b49bc3d4e0eaff0a8458..291692a5735ce2d5c738546c8bf2422d26d1a8ac 100644
--- a/typo3/sysext/workspaces/Tests/Unit/Controller/Remote/RemoteServerTest.php
+++ b/typo3/sysext/workspaces/Tests/Unit/Controller/Remote/RemoteServerTest.php
@@ -17,6 +17,8 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Workspaces\Tests\Unit\Controller\Remote;
 
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\Attributes\Test;
 use PHPUnit\Framework\MockObject\MockObject;
 use TYPO3\CMS\Core\Resource\File;
 use TYPO3\CMS\Core\Resource\FileReference;
@@ -94,9 +96,9 @@ final class RemoteServerTest extends UnitTestCase
 
     /**
      * @param array|null $expected
-     * @dataProvider prepareFileReferenceDifferencesAreCorrectDataProvider
-     * @test
      */
+    #[DataProvider('prepareFileReferenceDifferencesAreCorrectDataProvider')]
+    #[Test]
     public function prepareFileReferenceDifferencesAreCorrect(string $fileFileReferenceList, string $versionFileReferenceList, bool $useThumbnails, array $expected = null): void
     {
         $liveFileReferences = $this->getFileReferenceMocks($fileFileReferenceList);
diff --git a/typo3/sysext/workspaces/Tests/Unit/Domain/Model/WorkspaceRecordTest.php b/typo3/sysext/workspaces/Tests/Unit/Domain/Model/WorkspaceRecordTest.php
index 324cce5f98a54fef3ec8ab148a51014525d6f159..44b99d365ecafa4a1e03ac1dda39df6228a10146 100644
--- a/typo3/sysext/workspaces/Tests/Unit/Domain/Model/WorkspaceRecordTest.php
+++ b/typo3/sysext/workspaces/Tests/Unit/Domain/Model/WorkspaceRecordTest.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Workspaces\Tests\Unit\Domain\Model;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Workspaces\Domain\Record\AbstractRecord;
 use TYPO3\CMS\Workspaces\Domain\Record\WorkspaceRecord;
@@ -36,9 +37,7 @@ final class WorkspaceRecordTest extends UnitTestCase
         parent::tearDown();
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function isAbstractRecord(): void
     {
         $subject = new WorkspaceRecord([]);
@@ -46,9 +45,7 @@ final class WorkspaceRecordTest extends UnitTestCase
         self::assertInstanceOf(AbstractRecord::class, $subject);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getReturnsWorkspaceRecordInstance(): void
     {
         $instance = WorkspaceRecord::get(1, ['title' => '']);
@@ -56,9 +53,7 @@ final class WorkspaceRecordTest extends UnitTestCase
         self::assertInstanceOf(WorkspaceRecord::class, $instance);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getWithNonZeroUidAndNonEmptyDataReturnsInstanceWithTheProvidedData(): void
     {
         $title = 'some record title';
@@ -68,9 +63,7 @@ final class WorkspaceRecordTest extends UnitTestCase
         self::assertSame($title, $instance->getTitle());
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getCalledTwoTimesWithTheSameUidAndDataDataReturnsDifferentInstancesForEachCall(): void
     {
         $uid = 1;
@@ -82,9 +75,7 @@ final class WorkspaceRecordTest extends UnitTestCase
         self::assertNotSame($instance1, $instance2);
     }
 
-    /**
-     * @test
-     */
+    #[Test]
     public function getForConfiguredXclassReturnsInstanceOfXclass(): void
     {
         $xclassInstance = new class ([]) extends WorkspaceRecord {};
diff --git a/typo3/sysext/workspaces/Tests/Unit/Event/AfterRecordPublishedEventTest.php b/typo3/sysext/workspaces/Tests/Unit/Event/AfterRecordPublishedEventTest.php
index 7b6def29f08db2ed9bddcb0e5e172895e2a58f75..881298d0fa4de1432657ef53dd88774e1f72aa11 100644
--- a/typo3/sysext/workspaces/Tests/Unit/Event/AfterRecordPublishedEventTest.php
+++ b/typo3/sysext/workspaces/Tests/Unit/Event/AfterRecordPublishedEventTest.php
@@ -17,14 +17,13 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Workspaces\Tests\Unit\Event;
 
+use PHPUnit\Framework\Attributes\Test;
 use TYPO3\CMS\Workspaces\Event\AfterRecordPublishedEvent;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class AfterRecordPublishedEventTest extends UnitTestCase
 {
-    /**
-     * @test
-     */
+    #[Test]
     public function gettersReturnInitializedObjects(): void
     {
         $table = 'some_table';