From 7e84231b50d58a34cf3e1bd69be2766b2b8a23d5 Mon Sep 17 00:00:00 2001
From: Christian Kuhn <lolli@schwarzbu.ch>
Date: Fri, 23 Feb 2024 15:18:23 +0100
Subject: [PATCH] [TASK] Use phpunit attributes over annotations

phpunit 11 deprecates annotations like `@test` and
`@dataProvider` in favor of their attribute counterparts.

We'll adapt core main & v12 to keep v12 backports
simple. The patch takes care of Tests/Unit and
Tests/UnitDeprecated, functional test need some
additional quirk for the test splitter to
continue to work.

> composer req --dev rector/rector
> wget https://forge.typo3.org/attachments/download/38273/rector.php
> find typo3/ -name \*Test.php | grep Tests/Unit | xargs bin/rector process
> rm rector.php
> composer rem --dev rector/rector

Minor manual adaption in ErrorHandlerTest.php and
GeneralUtilityTest.php, and `runTests.sh -s cglGit`.

Number of executed unit tests and unitDeprecated tests
should stay the same.

Change-Id: I63d2be40b8aa022f0918edd8dc1c360017316c46
Resolves: #103180
Releases: main, 12.4
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/83091
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: core-ci <typo3@b13.com>
---
 Build/phpstan/phpstan-baseline.neon           |   2 +-
 .../Middleware/AdminPanelInitiatorTest.php    |  13 +-
 .../Tests/Unit/Modules/PreviewModuleTest.php  |  12 +-
 .../Unit/Service/ConfigurationServiceTest.php |  36 +-
 .../Tests/Unit/Service/ModuleLoaderTest.php   |  26 +-
 .../Tests/Unit/Utility/StateUtilityTest.php   |  48 +-
 .../BackendUserConfigurationTest.php          |  29 +-
 .../TranslationConfigurationProviderTest.php  |  13 +-
 .../Controller/EditDocumentControllerTest.php |  20 +-
 .../AfterPageTreeItemsPreparedEventTest.php   |   5 +-
 ...yNewContentElementWizardItemsEventTest.php |  12 +-
 .../Controller/File/FileControllerTest.php    |  25 +-
 .../File/ThumbnailControllerTest.php          |  12 +-
 .../FormInlineAjaxControllerTest.php          |  43 +-
 .../FormSelectTreeAjaxControllerTest.php      |   9 +-
 .../Unit/Controller/LoginControllerTest.php   |   9 +-
 .../SiteConfigurationControllerTest.php       |   9 +-
 .../Controller/SwitchUserControllerTest.php   |   9 +-
 .../Wizard/SuggestWizardControllerTest.php    |  22 +-
 .../ElementBrowserRegistryTest.php            |  17 +-
 .../Event/IsFileSelectableEventTest.php       |   5 +-
 .../Container/ListOfFieldsContainerTest.php   |  17 +-
 .../PaletteAndSingleContainerTest.php         |  13 +-
 .../Form/Element/AbstractFormElementTest.php  |   8 +-
 .../Unit/Form/Element/DatetimeElementTest.php |   8 +-
 .../Form/Element/InputHiddenElementTest.php   |   5 +-
 .../Unit/Form/Element/JsonElementTest.php     |   9 +-
 .../Unit/Form/Element/UuidElementTest.php     |  17 +-
 .../Form/FieldControl/ElementBrowserTest.php  |  24 +-
 .../Unit/Form/FieldWizard/TableListTest.php   |   8 +-
 .../Tests/Unit/Form/FormDataCompilerTest.php  |  45 +-
 .../FormDataGroup/FlexFormSegmentTest.php     |  13 +-
 .../Unit/Form/FormDataGroup/OnTheFlyTest.php  |  17 +-
 .../FormDataGroup/OrderedProviderListTest.php |  21 +-
 .../SiteConfigurationDataGroupTest.php        |  13 +-
 .../FormDataGroup/TcaDatabaseRecordTest.php   |  13 +-
 .../TcaInputPlaceholderRecordTest.php         |  13 +-
 .../TcaSelectTreeAjaxFieldDataTest.php        |  13 +-
 .../DatabaseDefaultLanguagePageRowTest.php    |  13 +-
 .../FormDataProvider/DatabaseEditRowTest.php  |  29 +-
 .../DatabaseEffectivePidTest.php              |  17 +-
 .../DatabaseLanguageRowsTest.php              |  29 +-
 .../DatabasePageLanguageOverlayRowsTest.php   |   5 +-
 .../DatabaseParentPageRowTest.php             |  29 +-
 .../DatabaseRecordOverrideValuesTest.php      |   9 +-
 .../DatabaseRecordTypeValueTest.php           |  57 +-
 .../DatabaseRowDateTimeFieldsTest.php         |  49 +-
 .../DatabaseRowDefaultAsReadonlyTest.php      |  12 +-
 .../DatabaseRowDefaultValuesTest.php          |  21 +-
 .../DatabaseRowInitializeNewTest.php          |  97 +--
 .../DatabaseSystemLanguageRowsTest.php        |   9 +-
 .../DatabaseUniqueUidNewRowTest.php           |  17 +-
 .../DatabaseUserPermissionCheckTest.php       |  73 +-
 .../EvaluateDisplayConditionsTest.php         | 148 +---
 .../InitializeProcessedTcaTest.php            |  17 +-
 .../InlineOverrideChildTcaTest.php            |  21 +-
 .../PageTsConfigMergedTest.php                |  17 +-
 .../SiteDatabaseEditRowTest.php               |  29 +-
 .../FormDataProvider/SiteResolvingTest.php    |   9 +-
 .../FormDataProvider/TcaCheckboxItemsTest.php |  36 +-
 .../TcaColumnsOverridesTest.php               |  20 +-
 .../TcaColumnsProcessCommonTest.php           |  33 +-
 ...TcaColumnsProcessFieldDescriptionsTest.php |  17 +-
 .../TcaColumnsProcessFieldLabelsTest.php      |  21 +-
 .../TcaColumnsProcessPlaceholdersTest.php     |  13 +-
 .../TcaColumnsProcessRecordTitleTest.php      |  17 +-
 .../TcaColumnsProcessShowitemTest.php         |  29 +-
 .../TcaColumnsRemoveUnusedTest.php            |   5 +-
 .../FormDataProvider/TcaFlexPrepareTest.php   |  24 +-
 .../FormDataProvider/TcaFlexProcessTest.php   |  85 +-
 .../Form/FormDataProvider/TcaFolderTest.php   |   9 +-
 .../Form/FormDataProvider/TcaGroupTest.php    |   9 +-
 .../TcaInlineConfigurationTest.php            |  77 +-
 .../TcaInlineExpandCollapseStateTest.php      |  16 +-
 .../TcaInlineIsOnSymmetricSideTest.php        |   9 +-
 .../Form/FormDataProvider/TcaInlineTest.php   |  13 +-
 .../TcaInputPlaceholdersTest.php              |  37 +-
 .../Form/FormDataProvider/TcaJsonTest.php     |   8 +-
 .../Form/FormDataProvider/TcaLanguageTest.php |  76 +-
 .../FormDataProvider/TcaRadioItemsTest.php    |  41 +-
 .../FormDataProvider/TcaRecordTitleTest.php   |  94 +--
 .../Form/FormDataProvider/TcaSlugTest.php     |   8 +-
 .../Form/FormDataProvider/TcaTextTest.php     |  13 +-
 .../FormDataProvider/TcaTypesShowitemTest.php |  29 +-
 .../Form/FormDataProvider/TcaUuidTest.php     |  21 +-
 .../FormDataProvider/UserTsConfigTest.php     |   5 +-
 .../Unit/Form/InlineStackProcessorTest.php    |  20 +-
 .../Form/NodeExpansion/FieldControlTest.php   |   5 +-
 .../Tests/Unit/Form/NodeFactoryTest.php       |  93 +--
 .../Tests/Unit/Http/RouteDispatcherTest.php   |  33 +-
 .../LoginProviderResolverTest.php             |  57 +-
 .../Tests/Unit/Module/ModuleFactoryTest.php   |   5 +-
 .../Tests/Unit/Module/ModuleRegistryTest.php  |  37 +-
 .../StandardPreviewRendererResolverTest.php   |  21 +-
 .../Unit/Routing/PreviewUriBuilderTest.php    |   5 +-
 .../Tests/Unit/Routing/UriBuilderTest.php     |  12 +-
 .../SearchDemand/MutableSearchDemandTest.php  |  17 +-
 .../SearchDemand/SearchDemandTest.php         |   9 +-
 .../Security/EmailLoginNotificationTest.php   |  29 +-
 .../Button/FullyRenderedButtonTest.php        |   7 +-
 .../Components/Button/InputButtonTest.php     |  19 +-
 .../Components/Button/LinkButtonTest.php      |  16 +-
 .../Components/Button/SplitButtonTest.php     |  16 +-
 .../Template/Components/Menu/MenuItemTest.php |  13 +-
 .../Unit/Template/Components/MenuTest.php     |  13 +-
 .../Tree/SortedTreeNodeCollectionTest.php     |  13 +-
 .../Unit/Tree/TreeNodeCollectionTest.php      |   5 +-
 .../backend/Tests/Unit/Tree/TreeNodeTest.php  |  13 +-
 .../Tests/Unit/Utility/BackendUtilityTest.php | 147 +---
 .../BackendLayoutCollectionTest.php           |  21 +-
 .../View/BackendLayout/BackendLayoutTest.php  |   9 +-
 .../DataProviderCollectionTest.php            |  17 +-
 .../Tests/Unit/View/BackendLayoutViewTest.php |   6 +-
 .../FormDataProvider/TcaFlexPrepareTest.php   |   9 +-
 .../Unit/Domain/Model/ConstraintTest.php      |  17 +-
 .../Tests/Unit/Domain/Model/LogEntryTest.php  |  28 +-
 .../Repository/LogEntryRepositoryTest.php     |   5 +-
 .../Unit/Domain/Model/BackendUserTest.php     |  33 +-
 .../Tests/Unit/Domain/Model/DemandTest.php    |  45 +-
 .../Repository/BackendUserRepositoryTest.php  |   5 +-
 .../Repository/FileMountRepositoryTest.php    |   5 +-
 .../AuthenticationServiceTest.php             |  32 +-
 .../BackendUserAuthenticationTest.php         |  68 +-
 .../Unit/Authentication/IpLockerTest.php      |   8 +-
 .../Mfa/Provider/RecoveryCodesTest.php        |  28 +-
 .../Authentication/Mfa/Provider/TotpTest.php  |  36 +-
 .../Cache/Backend/AbstractBackendTest.php     |   5 +-
 .../Backend/TransientMemoryBackendTest.php    |  45 +-
 .../Backend/Typo3DatabaseBackendTest.php      |  53 +-
 .../Tests/Unit/Cache/CacheManagerTest.php     |  89 +-
 .../Cache/Frontend/AbstractFrontendTest.php   |  45 +-
 .../Unit/Cache/Frontend/PhpFrontendTest.php   |  21 +-
 .../Cache/Frontend/VariableFrontendTest.php   |  37 +-
 .../Collection/CategoryCollectionTest.php     |   5 +-
 .../Unit/Charset/CharsetConverterTest.php     |  56 +-
 .../Command/Descriptor/TextDescriptorTest.php |   5 +-
 .../Unit/Command/SendEmailCommandTest.php     |   5 +-
 .../Configuration/CKEditor5MigratorTest.php   |   8 +-
 .../ConfigurationManagerTest.php              |  77 +-
 .../ExtensionConfigurationTest.php            |  25 +-
 .../Tests/Unit/Configuration/FeaturesTest.php |  17 +-
 .../FlexForm/FlexFormToolsTest.php            |   9 +-
 .../Loader/YamlFileLoaderTest.php             |  16 +-
 .../Tests/Unit/Configuration/RichtextTest.php |  36 +-
 .../Configuration/SiteConfigurationTest.php   |  24 +-
 .../Unit/Console/CommandRegistryTest.php      |   9 +-
 .../core/Tests/Unit/Context/ContextTest.php   |  46 +-
 .../Tests/Unit/Context/DateTimeAspectTest.php |  18 +-
 .../Tests/Unit/Context/SecurityAspectTest.php |  13 +-
 .../Tests/Unit/Context/UserAspectTest.php     |  48 +-
 .../Unit/Context/VisibilityAspectTest.php     |  17 +-
 .../Unit/Context/WorkspaceAspectTest.php      |  13 +-
 .../Unit/Core/ApplicationContextTest.php      |  24 +-
 .../ClassLoadingInformationGeneratorTest.php  |  30 +-
 .../Core/SystemEnvironmentBuilderTest.php     |  34 +-
 .../Unit/Country/CountryProviderTest.php      |  20 +-
 .../Argon2iPasswordHashTest.php               |  48 +-
 .../Argon2idPasswordHashTest.php              |  48 +-
 .../BcryptPasswordHashTest.php                |  54 +-
 .../BlowfishPasswordHashTest.php              |  54 +-
 .../PasswordHashing/Md5PasswordHashTest.php   |  42 +-
 .../PasswordHashFactoryTest.php               |  81 +-
 .../Pbkdf2PasswordHashTest.php                |  58 +-
 .../PhpassPasswordHashTest.php                |  54 +-
 .../core/Tests/Unit/Crypto/RandomTest.php     |  34 +-
 .../Unit/DataHandling/DataHandlerTest.php     | 218 ++---
 .../DataHandling/Localization/StateTest.php   |  14 +-
 .../DataHandling/Model/CorrelationIdTest.php  |  20 +-
 .../Unit/DataHandling/SlugHelperTest.php      |  54 +-
 .../EmailSoftReferenceParserTest.php          |  13 +-
 .../ExtensionPathSoftReferenceParserTest.php  |   9 +-
 .../NotifySoftReferenceParserTest.php         |   6 +-
 .../SubstituteSoftReferenceParserTest.php     |   6 +-
 .../TypoLinkSoftReferenceParserTest.php       |  26 +-
 .../TypoLinkTagSoftReferenceParserTest.php    |  20 +-
 .../UrlSoftReferenceParserTest.php            |  13 +-
 .../Unit/Database/ConnectionPoolTest.php      |   5 +-
 .../Tests/Unit/Database/ConnectionTest.php    |  58 +-
 .../Platform/PlatformInformationTest.php      |  18 +-
 .../Unit/Database/Query/BulkInsertTest.php    |  45 +-
 .../Expression/ExpressionBuilderTest.php      | 184 ++---
 .../Unit/Database/Query/QueryBuilderTest.php  | 294 ++-----
 .../Unit/Database/Query/QueryHelperTest.php   |  38 +-
 .../AbstractRestrictionContainerTest.php      |  21 +-
 .../DefaultRestrictionContainerTest.php       |   5 +-
 .../Restriction/DeletedRestrictionTest.php    |   5 +-
 .../DocumentTypeExclusionRestrictionTest.php  |   9 +-
 .../Restriction/EndTimeRestrictionTest.php    |   9 +-
 .../FrontendGroupRestrictionTest.php          |   9 +-
 .../FrontendRestrictionContainerTest.php      |   8 +-
 .../Restriction/HiddenRestrictionTest.php     |   5 +-
 .../LimitToTablesRestrictionContainerTest.php |  17 +-
 .../Restriction/PageIdListRestrictionTest.php |  25 +-
 .../PagePermissionRestrictionTest.php         |  21 +-
 .../Restriction/RootLevelRestrictionTest.php  |  21 +-
 .../Restriction/StartTimeRestrictionTest.php  |   9 +-
 .../Restriction/WorkspaceRestrictionTest.php  |  25 +-
 .../Unit/Database/RelationHandlerTest.php     |   9 +-
 .../Schema/ConnectionMigratorTest.php         |   9 +-
 .../Database/Schema/DefaultTcaSchemaTest.php  | 157 +---
 .../SchemaColumnDefinitionListenerTest.php    |  13 +-
 .../Parser/ColumnDefinitionAttributesTest.php |   6 +-
 .../Parser/ColumnDefinitionItemTest.php       |   8 +-
 .../Schema/Parser/CreateTableFragmentTest.php |   8 +-
 .../CharacterTypeAttributesTest.php           |   8 +-
 .../EnumerationTypeAttributesTest.php         |   8 +-
 .../NumericTypeAttributesTest.php             |   8 +-
 .../Parser/DataTypes/BinaryDataTypeTest.php   |  12 +-
 .../Parser/DataTypes/BitDataTypeTest.php      |   8 +-
 .../Schema/Parser/DataTypes/BlobTypesTest.php |   8 +-
 .../Parser/DataTypes/CharDataTypeTest.php     |  12 +-
 .../Parser/DataTypes/DateTimeTypesTest.php    |  16 +-
 .../Parser/DataTypes/EnumDataTypeTest.php     |   8 +-
 .../Parser/DataTypes/FixedPointTypesTest.php  |   8 +-
 .../DataTypes/FloatingPointTypesTest.php      |   8 +-
 .../Parser/DataTypes/IntegerTypesTest.php     |   8 +-
 .../Parser/DataTypes/JsonDataTypeTest.php     |   5 +-
 .../Parser/DataTypes/SetDataTypeTest.php      |   8 +-
 .../Schema/Parser/DataTypes/TextTypesTest.php |   8 +-
 .../Parser/ForeignKeyDefinitionTest.php       |   8 +-
 .../Schema/Parser/IndexDefinitionTest.php     |   8 +-
 .../Schema/Parser/ReferenceDefinitionTest.php |   8 +-
 .../Schema/Parser/TableBuilderTest.php        |  73 +-
 .../Schema/Parser/TableOptionsTest.php        |   8 +-
 .../Unit/Database/Schema/SqlReaderTest.php    |  28 +-
 .../Database/Schema/Types/EnumTypeTest.php    |   9 +-
 .../Database/Schema/Types/SetTypeTest.php     |   9 +-
 .../ConsoleCommandPassTest.php                |   9 +-
 .../FailsafeContainerTest.php                 |  96 +--
 .../ListenerProviderPassTest.php              |  13 +-
 .../ServiceProviderCompilationPassTest.php    |  25 +-
 .../ServiceProviderRegistryTest.php           |  37 +-
 .../Unit/Error/DebugExceptionHandlerTest.php  |  12 +-
 .../Tests/Unit/Error/ErrorHandlerTest.php     |   4 -
 .../Error/ProductionExceptionHandlerTest.php  |  16 +-
 .../EventDispatcher/EventDispatcherTest.php   |  34 +-
 .../EventDispatcher/ListenerProviderTest.php  |  40 +-
 .../NoopEventDispatcherTest.php               |   9 +-
 .../Unit/ExpressionLanguage/ResolverTest.php  |  24 +-
 .../AbstractFormProtectionTest.php            |  89 +-
 .../BackendFormProtectionTest.php             |  21 +-
 .../FormProtectionFactoryTest.php             |  29 +-
 .../InstallToolFormProtectionTest.php         |   9 +-
 .../Hooks/TcaItemsProcessorFunctionsTest.php  |  48 +-
 .../core/Tests/Unit/Html/HtmlCropperTest.php  |  12 +-
 .../core/Tests/Unit/Html/HtmlParserTest.php   |  74 +-
 .../Tests/Unit/Html/Parser/ParserTest.php     |   9 +-
 .../Tests/Unit/Html/RteHtmlParserTest.php     |  62 +-
 .../Tests/Unit/Http/ApplicationTypeTest.php   |  29 +-
 .../core/Tests/Unit/Http/ClientTest.php       |  29 +-
 .../core/Tests/Unit/Http/MessageTest.php      |  92 +--
 .../Unit/Http/MiddlewareDispatcherTest.php    |  29 +-
 .../Unit/Http/MiddlewareStackResolverTest.php |  17 +-
 .../Tests/Unit/Http/NormalizedParamsTest.php  | 126 +--
 .../Tests/Unit/Http/RedirectResponseTest.php  |  21 +-
 .../Tests/Unit/Http/RequestFactoryTest.php    |  17 +-
 .../core/Tests/Unit/Http/RequestTest.php      | 136 +---
 .../Tests/Unit/Http/ResponseFactoryTest.php   |  21 +-
 .../core/Tests/Unit/Http/ResponseTest.php     |  58 +-
 .../Http/Security/ReferrerEnforcerTest.php    |  19 +-
 .../Unit/Http/ServerRequestFactoryTest.php    |  33 +-
 .../Tests/Unit/Http/ServerRequestTest.php     |  49 +-
 .../Tests/Unit/Http/StreamFactoryTest.php     |  49 +-
 .../core/Tests/Unit/Http/StreamTest.php       | 156 +---
 .../Unit/Http/UploadedFileFactoryTest.php     |  21 +-
 .../core/Tests/Unit/Http/UploadedFileTest.php |  44 +-
 .../core/Tests/Unit/Http/UriFactoryTest.php   |   9 +-
 typo3/sysext/core/Tests/Unit/Http/UriTest.php | 184 ++---
 .../core/Tests/Unit/Imaging/DimensionTest.php |   9 +-
 .../Unit/Imaging/GraphicalFunctionsTest.php   |  16 +-
 .../IconProvider/BitmapIconProviderTest.php   |  13 +-
 .../IconProvider/SvgIconProviderTest.php      |  17 +-
 .../SvgSpriteIconProviderTest.php             |  17 +-
 .../Tests/Unit/Imaging/IconRegistryTest.php   |  69 +-
 .../core/Tests/Unit/Imaging/IconTest.php      |  28 +-
 .../Tests/Unit/Imaging/ImageDimensionTest.php |   8 +-
 .../Imaging/ImageManipulation/AreaTest.php    |  16 +-
 .../CropVariantCollectionTest.php             |  17 +-
 .../ImageManipulation/CropVariantTest.php     |  13 +-
 .../LinkHandling/EmailLinkHandlerTest.php     |  14 +-
 .../Unit/LinkHandling/FileLinkHandlerTest.php |  16 +-
 .../LinkHandling/FolderLinkHandlerTest.php    |  12 +-
 .../LegacyLinkNotationConverterTest.php       |  41 +-
 .../Unit/LinkHandling/LinkServiceTest.php     |  14 +-
 .../Unit/LinkHandling/PageLinkHandlerTest.php |  14 +-
 .../LinkHandling/RecordLinkHandlerTest.php    |  18 +-
 .../LinkHandling/TelephoneLinkHandlerTest.php |  14 +-
 .../LinkHandling/TypoLinkCodecServiceTest.php |  14 +-
 .../Unit/LinkHandling/UrlLinkHandlerTest.php  |  28 +-
 .../Unit/Localization/DateFormatterTest.php   |   8 +-
 .../Tests/Unit/Localization/LocaleTest.php    |  21 +-
 .../Tests/Unit/Localization/LocalesTest.php   |  24 +-
 .../Localization/LocalizationFactoryTest.php  |   9 +-
 .../Localization/Parser/XliffParserTest.php   |   8 +-
 .../Unit/Locking/FileLockStrategyTest.php     |  17 +-
 .../Tests/Unit/Locking/LockFactoryTest.php    |  25 +-
 .../Locking/SemaphoreLockStrategyTest.php     |  13 +-
 .../Unit/Locking/SimpleLockStrategyTest.php   |  32 +-
 .../core/Tests/Unit/Log/LogLevelTest.php      |  26 +-
 .../core/Tests/Unit/Log/LogManagerTest.php    |  25 +-
 .../core/Tests/Unit/Log/LogRecordTest.php     |  53 +-
 .../sysext/core/Tests/Unit/Log/LoggerTest.php |  40 +-
 .../Processor/AbstractMemoryProcessorTest.php |   9 +-
 .../Log/Processor/AbstractProcessorTest.php   |   9 +-
 .../Processor/IntrospectionProcessorTest.php  |  24 +-
 .../MemoryPeakUsageProcessorTest.php          |   5 +-
 .../Processor/MemoryUsageProcessorTest.php    |   5 +-
 .../Unit/Log/Processor/WebProcessorTest.php   |   5 +-
 .../Unit/Log/Writer/AbstractWriterTest.php    |   5 +-
 .../Unit/Log/Writer/DatabaseWriterTest.php    |   5 +-
 .../Tests/Unit/Log/Writer/FileWriterTest.php  |  42 +-
 .../Event/AfterMailerSentMessageEventTest.php |   5 +-
 .../BeforeMailerSentMessageEventTest.php      |   9 +-
 .../core/Tests/Unit/Mail/FileSpoolTest.php    |   8 +-
 .../core/Tests/Unit/Mail/MailMessageTest.php  |  94 +--
 .../core/Tests/Unit/Mail/MailerTest.php       |  38 +-
 .../Tests/Unit/Mail/TransportFactoryTest.php  |  45 +-
 .../FlashMessageRendererResolverTest.php      |   5 +-
 .../Messaging/FlashMessageServiceTest.php     |   5 +-
 .../Tests/Unit/Messaging/FlashMessageTest.php |   5 +-
 .../Renderer/BootstrapRendererTest.php        |   9 +-
 .../Messaging/Renderer/ListRendererTest.php   |   9 +-
 .../Renderer/PlaintextRendererTest.php        |   9 +-
 .../MetaTag/GenericMetaTagManagerTest.php     |  25 +-
 .../MetaTag/MetaTagManagerRegistryTest.php    |  16 +-
 .../Unit/Middleware/VerifyHostHeaderTest.php  |  38 +-
 .../Unit/Migrations/TcaMigrationTest.php      | 166 ++--
 .../Package/AbstractServiceProviderTest.php   |  25 +-
 .../core/Tests/Unit/Package/MetaDataTest.php  |   8 +-
 .../Tests/Unit/Package/PackageManagerTest.php |  58 +-
 .../core/Tests/Unit/Package/PackageTest.php   |  22 +-
 .../Tests/Unit/Page/AssetCollectorTest.php    |  32 +-
 .../Tests/Unit/Page/AssetRendererTest.php     |  32 +-
 .../core/Tests/Unit/Page/ImportMapTest.php    |  41 +-
 .../Page/JavaScriptModuleInstructionTest.php  |   8 +-
 .../core/Tests/Unit/Page/PageRendererTest.php |  52 +-
 .../Unit/Pagination/ArrayPaginatorTest.php    |  32 +-
 .../Unit/Pagination/SimplePaginationTest.php  |  21 +-
 .../SlidingWindowPaginationTest.php           |  21 +-
 .../Validator/CorePasswordValidatorTest.php   |   8 +-
 .../Validator/Dto/ContextDataTest.php         |  17 +-
 .../Unit/Preparations/TcaPreparationTest.php  |  26 +-
 typo3/sysext/core/Tests/Unit/RegistryTest.php |  25 +-
 .../Tests/Unit/Resource/AbstractFileTest.php  |   8 +-
 .../Collection/FileCollectionRegistryTest.php |  45 +-
 .../Resource/Driver/AbstractDriverTest.php    |   5 +-
 ...stractHierarchicalFilesystemDriverTest.php |  14 +-
 .../Resource/Driver/DriverRegistryTest.php    |  33 +-
 .../Tests/Unit/Resource/FileReferenceTest.php |  50 +-
 .../core/Tests/Unit/Resource/FileTest.php     |  69 +-
 .../Resource/Filter/FileNameFilterTest.php    |  10 +-
 .../core/Tests/Unit/Resource/FolderTest.php   |  33 +-
 .../Resource/Index/ExtractorRegistryTest.php  |  29 +-
 .../Tests/Unit/Resource/Index/IndexerTest.php |   5 +-
 .../Unit/Resource/MetaDataAspectTest.php      |  32 +-
 .../AfterVideoPreviewFetchedEventTest.php     |   5 +-
 .../OnlineMedia/Helpers/VimeoHelperTest.php   |   8 +-
 .../Tests/Unit/Resource/ProcessedFileTest.php |  13 +-
 .../Processing/LocalPreviewHelperTest.php     |  13 +-
 .../Processing/ProcessorRegistryTest.php      |  13 +-
 .../Resource/RelativeCssPathFixerTest.php     |   8 +-
 .../Rendering/AudioTagRendererTest.php        |  20 +-
 .../Rendering/RendererRegistryTest.php        |  29 +-
 .../Rendering/VideoTagRendererTest.php        |  20 +-
 .../Resource/Rendering/VimeoRendererTest.php  |  73 +-
 .../Rendering/YouTubeRendererTest.php         |  72 +-
 .../Repository/AbstractRepositoryTest.php     |   5 +-
 .../Unit/Resource/ResourceCompressorTest.php  |  56 +-
 .../Unit/Resource/ResourceFactoryTest.php     |  30 +-
 .../Security/FileNameValidatorTest.php        |  41 +-
 .../Service/ConfigurationServiceTest.php      |   5 +-
 .../Resource/Service/ExtractorServiceTest.php |  24 +-
 .../Unit/Resource/StorageRepositoryTest.php   |  12 +-
 .../TextExtraction/PlainTextExtractorTest.php |   9 +-
 .../TextExtractorRegistryTest.php             |  13 +-
 .../Utility/FileExtensionFilterTest.php       |  12 +-
 .../Unit/Routing/Aspect/AspectFactoryTest.php |  15 +-
 .../Enhancer/VariableProcessorTest.php        |  32 +-
 .../Tests/Unit/Routing/PageRouterTest.php     |  11 +-
 .../Tests/Unit/Routing/RouteSorterTest.php    |   7 +-
 .../Tests/Unit/Routing/SiteMatcherTest.php    |  14 +-
 .../Unit/Schema/Struct/SelectItemTest.php     |  58 +-
 .../ConsumableNonceTest.php                   |  12 +-
 .../Reporting/ReportTest.php                  |  13 +-
 .../ContentSecurityPolicy/ScopeTest.php       |  28 +-
 .../SourceCollectionTest.php                  |   9 +-
 .../ContentSecurityPolicy/UriValueTest.php    |  20 +-
 .../Tests/Unit/Security/NoncePoolTest.php     |  20 +-
 .../core/Tests/Unit/Security/NonceTest.php    |  20 +-
 .../Tests/Unit/Security/RequestTokenTest.php  |  30 +-
 .../Unit/Serializer/Typo3XmlParserTest.php    |  70 +-
 .../Serializer/Typo3XmlSerializerTest.php     |  84 +-
 .../Service/DependencyOrderingServiceTest.php |  34 +-
 .../Unit/Service/FlexFormServiceTest.php      |   5 +-
 .../MarkerBasedTemplateServiceTest.php        |  36 +-
 .../Backend/DatabaseSessionBackendTest.php    |   5 +-
 .../Backend/RedisSessionBackendTest.php       |   9 +-
 .../Tests/Unit/Session/SessionManagerTest.php |  17 +-
 .../Unit/Session/UserSessionManagerTest.php   |  24 +-
 .../Tests/Unit/Session/UserSessionTest.php    |   9 +-
 .../Unit/Site/Entity/SiteLanguageTest.php     |  16 +-
 .../core/Tests/Unit/Site/Entity/SiteTest.php  |  33 +-
 .../core/Tests/Unit/Text/TextCropperTest.php  |  12 +-
 .../Unit/TimeTracker/TimeTrackerTest.php      |   5 +-
 .../DatabaseTreeDataProviderTest.php          |   9 +-
 .../TreeDataProviderFactoryTest.php           |  16 +-
 .../core/Tests/Unit/Type/BitSetTest.php       |  45 +-
 .../core/Tests/Unit/Type/EnumerationTest.php  | 108 +--
 .../Tests/Unit/Type/File/ImageInfoTest.php    |  22 +-
 typo3/sysext/core/Tests/Unit/Type/MapTest.php |  17 +-
 .../AST/AstBuilderInterfaceTest.php           | 163 ++--
 .../CurrentObjectPathTest.php                 |  41 +-
 .../TypoScript/AST/Node/ChildNodeTest.php     |  13 +-
 .../AST/Node/ReferenceChildNodeTest.php       |  13 +-
 .../Unit/TypoScript/AST/Node/RootNodeTest.php |  13 +-
 .../AST/Traverser/AstTraverserTest.php        |   5 +-
 .../IncludeNode/ConditionElseIncludeTest.php  |   9 +-
 .../IncludeNode/ConditionIncludeTest.php      |   9 +-
 .../ConditionIncludeTyposcriptIncludeTest.php |   9 +-
 .../IncludeTree/IncludeNode/RootNodeTest.php  |  13 +-
 ...onVerdictAwareIncludeTreeTraverserTest.php |   5 +-
 .../Traverser/IncludeTreeTraverserTest.php    |   5 +-
 .../Tokenizer/Line/ConditionLineTest.php      |   5 +-
 .../Line/IdentifierAssignmentLineTest.php     |   9 +-
 .../Line/IdentifierBlockOpenLineTest.php      |   5 +-
 .../Tokenizer/Line/IdentifierCopyLineTest.php |   9 +-
 .../Line/IdentifierFunctionLineTest.php       |  13 +-
 .../Line/IdentifierReferenceLineTest.php      |   9 +-
 .../Line/IdentifierUnsetLineTest.php          |   5 +-
 .../Tokenizer/Line/ImportLineTest.php         |   5 +-
 .../Tokenizer/Line/ImportOldLineTest.php      |   5 +-
 .../Token/IdentifierTokenStreamTest.php       |  17 +-
 .../Tokenizer/Token/TokenStreamTest.php       |  17 +-
 .../TypoScript/Tokenizer/Token/TokenTest.php  |  21 +-
 .../Tokenizer/TokenizerInterfaceTest.php      |  20 +-
 .../Unit/TypoScript/TypoScriptServiceTest.php |  14 +-
 .../Tests/Unit/Utility/ArrayUtilityTest.php   | 340 +++-----
 .../Unit/Utility/ClassNamingUtilityTest.php   |  21 +-
 .../Tests/Unit/Utility/CommandUtilityTest.php |  14 +-
 .../Tests/Unit/Utility/CsvUtilityTest.php     |  14 +-
 .../Tests/Unit/Utility/DebugUtilityTest.php   |  14 +-
 .../ExtensionManagementUtilityTest.php        | 256 ++----
 .../Tests/Unit/Utility/GeneralUtilityTest.php | 761 +++++-------------
 .../Tests/Unit/Utility/HttpUtilityTest.php    |  34 +-
 .../Utility/IpAnonymizationUtilityTest.php    |  10 +-
 .../Tests/Unit/Utility/MailUtilityTest.php    |  34 +-
 .../Tests/Unit/Utility/MathUtilityTest.php    |  78 +-
 .../Utility/PathUtilityPublicPathsTest.php    |  14 +-
 .../Tests/Unit/Utility/PathUtilityTest.php    |  56 +-
 .../Unit/Utility/PermutationUtilityTest.php   |  12 +-
 .../Unit/Utility/RootlineUtilityTest.php      |  77 +-
 .../String/StringFragmentCollectionTest.php   |  16 +-
 .../String/StringFragmentSplitterTest.php     |   7 +-
 .../Tests/Unit/Utility/StringUtilityTest.php  | 111 +--
 .../Unit/Utility/VersionNumberUtilityTest.php |  13 +-
 .../PublicMethodDeprecationTraitTest.php      |  25 +-
 .../PublicPropertyDeprecationTraitTest.php    |  20 +-
 .../FlexForm/FlexFormToolsTest.php            |   8 +-
 .../Loader/PageTsConfigLoaderTest.php         |  17 +-
 .../Parser/PageTsConfigParserTest.php         |  17 +-
 .../AbstractConditionMatcherTest.php          |  40 +-
 .../BackendWorkspaceRestrictionTest.php       |  17 +-
 .../FrontendWorkspaceRestrictionTest.php      |  13 +-
 .../Domain/Repository/PageRepositoryTest.php  |  21 +-
 .../FormProtectionFactoryTest.php             |  29 +-
 .../Utility/FileExtensionFilterTest.php       |   6 +-
 .../Parser/TypoScriptParserTest.php           |  76 +-
 .../TypoScript/TemplateServiceTest.php        |   9 +-
 .../Utility/GeneralUtilityTest.php            |  26 +-
 .../Utility/PathUtilityPublicPathsTest.php    |   6 +-
 .../Utility/ResourceUtilityTest.php           |   8 +-
 .../Unit/DashboardPresetRegistryTest.php      |  13 +-
 .../DashboardWidgetPassTest.php               |  25 +-
 .../Tests/Unit/WidgetGroupRegistryTest.php    |  17 +-
 .../FrontendConfigurationManagerTest.php      | 125 +--
 .../Tests/Unit/Domain/Model/CategoryTest.php  |  25 +-
 .../Unit/DomainObject/AbstractEntityTest.php  |  17 +-
 .../extbase/Tests/Unit/Error/ErrorTest.php    |   9 +-
 .../extbase/Tests/Unit/Error/MessageTest.php  |  29 +-
 .../extbase/Tests/Unit/Error/ResultTest.php   |  70 +-
 ...FlexFormConfigurationOverrideEventTest.php |   9 +-
 .../Unit/Mvc/Controller/ArgumentTest.php      |  50 +-
 .../Unit/Mvc/Controller/ArgumentsTest.php     |  65 +-
 ...ropertyMappingConfigurationServiceTest.php |  58 +-
 .../extbase/Tests/Unit/Mvc/RequestTest.php    |  56 +-
 .../Tests/Unit/Mvc/View/JsonViewTest.php      |  76 +-
 .../Web/RequestBuilderDefaultValuesTest.php   |  57 +-
 .../Unit/Mvc/Web/Routing/UriBuilderTest.php   | 184 ++---
 .../ClassesConfigurationFactoryTest.php       |   5 +-
 .../Persistence/ClassesConfigurationTest.php  |  24 +-
 .../Unit/Persistence/Generic/BackendTest.php  |  17 +-
 .../Generic/Mapper/DataMapFactoryTest.php     |  12 +-
 .../Generic/Mapper/DataMapperTest.php         |  33 +-
 .../Generic/PersistenceManagerTest.php        |  52 +-
 .../Persistence/Generic/QueryFactoryTest.php  |   7 +-
 .../Persistence/Generic/QueryResultTest.php   |  53 +-
 .../Unit/Persistence/Generic/QueryTest.php    |  46 +-
 .../Unit/Persistence/Generic/SessionTest.php  |  41 +-
 .../Generic/Typo3QuerySettingsTest.php        |  66 +-
 .../Unit/Persistence/ObjectStorageTest.php    | 156 +---
 .../Tests/Unit/Persistence/RepositoryTest.php |  65 +-
 ...ropertyMappingConfigurationBuilderTest.php |   5 +-
 .../PropertyMappingConfigurationTest.php      |  88 +-
 .../TypeConverter/ArrayConverterTest.php      |  24 +-
 .../TypeConverter/BooleanConverterTest.php    |  13 +-
 .../TypeConverter/DateTimeConverterTest.php   |  88 +-
 .../TypeConverter/FloatConverterTest.php      |  25 +-
 .../TypeConverter/IntegerConverterTest.php    |  21 +-
 .../TypeConverter/StringConverterTest.php     |   9 +-
 .../Property/TypeConverterRegistryTest.php    |  48 +-
 .../ClassSchema/MethodParameterTest.php       |  33 +-
 .../Reflection/ClassSchema/MethodTest.php     |  13 +-
 .../PropertyWithTypeDeclarationsTest.php      |  72 +-
 .../PropertyWithoutTypeDeclarationsTest.php   |  76 +-
 .../Reflection/ClassSchema/PropertyTest.php   |  77 +-
 .../Tests/Unit/Reflection/ClassSchemaTest.php |  89 +-
 .../Unit/Reflection/ObjectAccessTest.php      | 151 +---
 .../Unit/Reflection/ReflectionServiceTest.php |  17 +-
 .../Routing/Aspect/StaticRangeMapperTest.php  |   8 +-
 .../Security/Cryptography/HashServiceTest.php |  41 +-
 .../Tests/Unit/Service/CacheServiceTest.php   |  25 +-
 .../Unit/Service/ExtensionServiceTest.php     |  70 +-
 .../Unit/Service/ImageScriptServiceTest.php   |  18 +-
 .../Unit/Utility/DebuggerUtilityTest.php      |  65 +-
 .../Unit/Utility/ExtensionUtilityTest.php     |  61 +-
 .../AbstractCompositeValidatorTest.php        |  17 +-
 .../Validator/AbstractValidatorTest.php       |  17 +-
 .../Validator/DisjunctionValidatorTest.php    |   9 +-
 .../Validator/GenericObjectValidatorTest.php  |  31 +-
 .../ValidatorClassNameResolverTest.php        |  44 +-
 .../Mvc/Web/Routing/UriBuilderTest.php        |  17 +-
 .../Persistence/RepositoryTest.php            |  21 +-
 .../Reflection/ReflectionServiceTest.php      |   8 +-
 .../Unit/Controller/ActionControllerTest.php  |   4 +-
 .../Controller/DownloadControllerTest.php     |   5 +-
 .../UploadExtensionFileControllerTest.php     |   8 +-
 .../Unit/Domain/Model/DependencyTest.php      |   9 +-
 .../Unit/Domain/Model/DownloadQueueTest.php   |  25 +-
 .../Tests/Unit/Domain/Model/ExtensionTest.php |  32 +-
 .../Repository/ExtensionRepositoryTest.php    |  13 +-
 .../Unit/Parser/ExtensionXmlParserTest.php    |   8 +-
 .../Tests/Unit/Report/ExtensionStatusTest.php |  53 +-
 .../ExtensionManagementServiceTest.php        |  29 +-
 .../Unit/Utility/DependencyUtilityTest.php    |  73 +-
 .../Tests/Unit/Utility/EmConfUtilityTest.php  |  13 +-
 .../Unit/Utility/FileHandlingUtilityTest.php  |  53 +-
 .../Tests/Unit/Utility/InstallUtilityTest.php |  28 +-
 .../Tests/Unit/Utility/ListUtilityTest.php    |  14 +-
 .../RecoveryConfigurationTest.php             |  45 +-
 .../Unit/Redirect/RedirectHandlerTest.php     |  44 +-
 .../Unit/Service/RecoveryServiceTest.php      |   8 +-
 .../Service/ValidatorResolverServiceTest.php  |  12 +-
 .../Validation/RedirectUrlValidatorTest.php   |  40 +-
 .../Event/ModifyEditFileFormDataEventTest.php |   5 +-
 .../filelist/Tests/Unit/FileListTest.php      |   9 +-
 .../ResourceFileExtensionMatcherTest.php      |   9 +-
 .../Core/Cache/FluidTemplateCacheTest.php     |  17 +-
 .../Core/Rendering/RenderingContextTest.php   |  14 +-
 .../ViewHelper/ViewHelperResolverTest.php     |   6 +-
 .../Unit/View/AbstractTemplateViewTest.php    |   5 +-
 .../Tests/Unit/View/TemplatePathsTest.php     |  22 +-
 .../Link/TypolinkViewHelperTest.php           |   8 +-
 .../Uri/TypolinkViewHelperTest.php            |  14 +-
 .../Controller/FormEditorControllerTest.php   |  37 +-
 .../Controller/FormFrontendControllerTest.php |  13 +-
 .../Controller/FormManagerControllerTest.php  |  49 +-
 .../ConfigurationServiceTest.php              | 128 +--
 ...ableFormElementPropertiesValidatorTest.php |  22 +-
 ...llectionElementPropertiesValidatorTest.php |  22 +-
 .../FormDefinitionConversionServiceTest.php   |   9 +-
 .../FormDefinitionValidationServiceTest.php   |  38 +-
 .../Domain/Factory/ArrayFormFactoryTest.php   |   9 +-
 .../Domain/Finishers/AbstractFinisherTest.php |  77 +-
 .../Domain/Finishers/ClosureFinisherTest.php  |   5 +-
 .../Domain/Finishers/RedirectFinisherTest.php |   6 +-
 .../Finishers/SaveToDatabaseFinisherTest.php  |  30 +-
 .../FormElements/AbstractFormElementTest.php  |  57 +-
 .../FormElements/AbstractSectionTest.php      |  29 +-
 .../Unit/Domain/FormElements/SectionTest.php  |  48 +-
 .../Renderable/AbstractRenderableTest.php     |  21 +-
 .../Renderable/RenderableVariantTest.php      |   9 +-
 .../DataStructureIdentifierListenerTest.php   |  28 +-
 .../ConfigurationManagerTest.php              |   5 +-
 .../InheritancesResolverServiceTest.php       |  42 +-
 .../Configuration/TypoScriptServiceTest.php   |   5 +-
 .../Unit/Mvc/Configuration/YamlSourceTest.php |  21 +-
 .../FormPersistenceManagerTest.php            | 138 +---
 .../Tests/Unit/Mvc/ProcessingRuleTest.php     |  21 +-
 .../PropertyMappingConfigurationTest.php      |  27 +-
 .../FormDefinitionArrayConverterTest.php      |  21 +-
 .../Form/DatePickerViewHelperTest.php         |   8 +-
 .../FrontendUserAuthenticationTest.php        |   7 +-
 .../ContentObject/CaseContentObjectTest.php   |   9 +-
 .../ContentDataProcessorTest.php              |  21 +-
 .../ContentObjectRendererTest.php             | 618 ++++++--------
 .../ProductionExceptionHandlerTest.php        |  21 +-
 .../ContentObject/ImageContentObjectTest.php  |  37 +-
 .../Menu/AbstractMenuContentObjectTest.php    |  42 +-
 .../Menu/MenuContentObjectFactoryTest.php     |  21 +-
 .../Unit/Controller/ErrorControllerTest.php   |  53 +-
 .../TypoScriptFrontendControllerTest.php      |   8 +-
 .../DataProcessing/FlexFormProcessorTest.php  |  25 +-
 .../SiteLanguageProcessorTest.php             |   9 +-
 .../Unit/DataProcessing/SiteProcessorTest.php |   9 +-
 .../Tests/Unit/Http/RequestHandlerTest.php    |  33 +-
 .../Tests/Unit/Imaging/GifBuilderTest.php     |  31 +-
 .../Middleware/PageArgumentValidatorTest.php  |  21 +-
 .../SiteBaseRedirectResolverTest.php          |  28 +-
 .../Unit/Middleware/SiteResolverTest.php      |  18 +-
 .../Middleware/StaticRouteResolverTest.php    |   5 +-
 .../Unit/Page/CacheHashCalculatorTest.php     |  41 +-
 .../Unit/Page/CacheHashConfigurationTest.php  |  44 +-
 .../Page/PageAccessFailureReasonsTest.php     |   9 +-
 .../Unit/Page/PageLayoutResolverTest.php      |  25 +-
 .../Unit/Processor/GalleryProcessorTest.php   |  32 +-
 .../Unit/Resource/FilePathSanitizerTest.php   |  30 +-
 .../Typolink/AbstractTypolinkBuilderTest.php  |  17 +-
 .../DatabaseRecordLinkBuilderTest.php         |   7 +-
 .../Unit/Typolink/LinkVarsCalculatorTest.php  |  14 +-
 .../Unit/Typolink/PageLinkBuilderTest.php     |   8 +-
 .../Resource/FilePathSanitizerTest.php        |   5 +-
 typo3/sysext/impexp/Tests/Unit/ExportTest.php |  45 +-
 .../indexed_search/Tests/Unit/IndexerTest.php |  31 +-
 .../Unit/Controller/UpgradeControllerTest.php |   8 +-
 .../Php/CodeStatisticsTest.php                |   5 +-
 .../Php/GeneratorClassesResolverTest.php      |   9 +-
 .../Php/Matcher/AbstractCoreMatcherTest.php   |  21 +-
 .../Php/Matcher/ArrayDimensionMatcherTest.php |  12 +-
 .../Php/Matcher/ArrayGlobalMatcherTest.php    |  12 +-
 .../Php/Matcher/ClassConstantMatcherTest.php  |  12 +-
 .../Php/Matcher/ClassNameMatcherTest.php      |   5 +-
 .../Php/Matcher/ConstantMatcherTest.php       |  12 +-
 .../ConstructorArgumentMatcherTest.php        |   8 +-
 .../Php/Matcher/FunctionCallMatcherTest.php   |   9 +-
 .../InterfaceMethodChangedMatcherTest.php     |   5 +-
 .../Matcher/MethodAnnotationMatcherTest.php   |   5 +-
 .../MethodArgumentDroppedMatcherTest.php      |  12 +-
 ...MethodArgumentDroppedStaticMatcherTest.php |  12 +-
 .../MethodArgumentRequiredMatcherTest.php     |  12 +-
 ...ethodArgumentRequiredStaticMatcherTest.php |  12 +-
 .../MethodArgumentUnusedMatcherTest.php       |  12 +-
 .../Php/Matcher/MethodCallMatcherTest.php     |  16 +-
 .../Matcher/MethodCallStaticMatcherTest.php   |  12 +-
 .../Matcher/PropertyAnnotationMatcherTest.php |   5 +-
 .../PropertyExistsStaticMatcherTest.php       |   5 +-
 .../Matcher/PropertyProtectedMatcherTest.php  |  12 +-
 .../Php/Matcher/PropertyPublicMatcherTest.php |  12 +-
 .../Php/MatcherFactoryTest.php                |  29 +-
 .../Unit/FolderStructure/AbstractNodeTest.php |  81 +-
 .../FolderStructure/DefaultFactoryTest.php    |   5 +-
 .../FolderStructure/DirectoryNodeTest.php     | 121 +--
 .../Unit/FolderStructure/FileNodeTest.php     | 157 +---
 .../Unit/FolderStructure/LinkNodeTest.php     |  85 +-
 .../Unit/FolderStructure/RootNodeTest.php     |  45 +-
 .../FolderStructure/StructureFacadeTest.php   |   9 +-
 .../Unit/Service/ClearTableServiceTest.php    |   5 +-
 .../Unit/Service/CoreUpdateServiceTest.php    |  17 +-
 .../Unit/Service/CoreVersionServiceTest.php   |  72 +-
 .../Unit/Service/Typo3tempFileServiceTest.php |   9 +-
 .../DatabaseCheck/Platform/MySqlTest.php      |   8 +-
 .../ContentSecurityPolicyHeaderTest.php       |   8 +-
 .../L18nDiffsourceToJsonMigrationTest.php     |  19 +-
 .../Unit/Linktype/ExternalLinktypeTest.php    |  42 +-
 .../Unit/Linktype/LinktypeRegistryTest.php    |  13 +-
 .../Unit/Repository/PagesRepositoryTest.php   |   5 +-
 .../DatabaseIntegrityControllerTest.php       |   8 +-
 ...fyBlindedConfigurationOptionsEventTest.php |   5 +-
 .../Unit/Service/OpenDocumentServiceTest.php  |  21 +-
 .../Tests/Unit/Evaluation/SourceHostTest.php  |   8 +-
 ...reateRedirectHasBeenPersistedEventTest.php |   5 +-
 .../BeforeRedirectMatchDomainEventTest.php    |   9 +-
 ...edirectRecordBeforePersistingEventTest.php |   5 +-
 ...tManagementControllerViewDataEventTest.php |   5 +-
 ...SlugRedirectChangeItemCreatedEventTest.php |   9 +-
 .../ValuePickerItemDataProviderTest.php       |  13 +-
 .../RedirectSourceCollectionTest.php          |  17 +-
 .../SlugRedirectChangeItemTest.php            |   9 +-
 .../Tests/Unit/Repository/DemandTest.php      |   8 +-
 .../Unit/Service/RedirectServiceTest.php      |  88 +-
 .../TargetPageIdViewHelperTest.php            |   9 +-
 .../Tests/Unit/Report/Status/StatusTest.php   |   9 +-
 .../Unit/Report/Status/Typo3StatusTest.php    |   9 +-
 .../Unit/CronCommand/CronCommandTest.php      |  54 +-
 .../Unit/CronCommand/NormalizeCommandTest.php |  94 +--
 .../CachingFrameworkGarbageCollectionTest.php |   9 +-
 ...ableCommandAdditionalFieldProviderTest.php |   5 +-
 .../Tests/Unit/Task/TaskSerializerTest.php    |  26 +-
 .../Validator/TaskValidatorTest.php           |  13 +-
 .../ModifyUrlForCanonicalTagEventTest.php     |   5 +-
 .../Unit/HrefLang/HrefLangGeneratorTest.php   |  14 +-
 .../MetaTag/OpenGraphMetaTagManagerTest.php   |  25 +-
 .../MetaTag/TwitterCardMetaTagManagerTest.php |  25 +-
 .../PagesXmlSitemapDataProviderTest.php       |  16 +-
 .../Tests/Unit/Registry/AddonRegistryTest.php |   9 +-
 .../Tests/Unit/Registry/ModeRegistryTest.php  |  13 +-
 .../Factory/WebhookInstructionFactoryTest.php |  13 +-
 .../Controller/Remote/RemoteServerTest.php    |   6 +-
 .../Unit/Domain/Model/WorkspaceRecordTest.php |  21 +-
 .../Event/AfterRecordPublishedEventTest.php   |   5 +-
 699 files changed, 6647 insertions(+), 14578 deletions(-)

diff --git a/Build/phpstan/phpstan-baseline.neon b/Build/phpstan/phpstan-baseline.neon
index 83dc831b781a..b332e03d2b5d 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 ef62c9041f9d..094a314443e0 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 1b6e361eab4a..8eb5c0082597 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 93c29777959c..1b07e45b6a86 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 4ba686f5e844..006e6706e038 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 13551dec7a81..36ce074b0811 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 66b486e001ea..3581a27519ac 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 b1172f0e9adc..3ed66a7adb62 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 7ba17662d072..ac2ff665ceaa 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 1676c8770ef8..9d914546265a 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 d2a7633e7d2c..7631ad8198b9 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 24e2954ef5f7..bf7a21c40a27 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 87e093292e38..0fc5790bdd2c 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 1a8433685e67..db7bde71f908 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 047b3624faff..93c71e5fd470 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 50eb00cd730d..571645e4e5ba 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 32bf25874abf..c3d25f4c9b56 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 fac0db2ad128..3608b7e61c6b 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 171e8b494db9..9d58fd7f7f9e 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 21c3bda2c80f..4d51b3525115 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 a5c31470baf8..3a07cc8be3e2 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 51ac5867a0bb..fcdc08a6f5cf 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 5fd21703e55a..af3b39e7ec1a 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 d4aec7d6e0ae..f4100ac81e75 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 e8c6da7d7356..bf351cd1bddc 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 ce22d19e0484..ab7e7c1b45f7 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 944edbd2a8be..ea3ff12d76f6 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('&quot;foo&quot;: &quot;bar&quot;', $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 23b8e99fec0d..37ce89ed2a0f 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 38fa68dc41a4..94021f678c3e 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 4b55fa36fcf1..db723b6c3f27 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 318c89f0d37e..47e3f6ad9ba7 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 7593640cb9cf..70f0acd002b1 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 27a6d04b8e4d..97bc28cb5527 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 b17db627a68d..8fc6614e8c40 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 5e86a791696a..bc6f5daba3fd 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 5fa252d0299a..27afc60e687f 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 c407d482208a..edb573999754 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 939985d74bab..2f8174f3a4af 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 aac23d7ed8a2..428506dca00e 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 d1a8ec91efd2..d2005304cf62 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 cbb57c013be8..3257e47fdee1 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 6c48a09e4077..50273c9b8d73 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 7e3cf8db5998..94d74b0ac635 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 9ce3abc8a185..ac90b45a0994 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 1bcadc573b3c..5593953355ec 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 52512f5420e2..9ac8a7c1883e 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 2d82edf16853..5d236652838c 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 3c42fd54939f..ef834ce214df 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 88d8a9c2b4df..38c960717897 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 5fc3c396f095..df675a6533ed 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 05217628bb2c..efc63a99c700 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 905197c15bb5..3b957386d154 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 b6f4ab457422..06e8dc35a9a2 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 c8d39a891fa5..23eef29d5b91 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 c5b2ab98fa0d..f0cb2a364c40 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 7f00b8c75fe1..a7b0c1ec1cff 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 8456244ab9c9..0c648c911f35 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 e3f3448b5942..6eb6ea55d9fb 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 6655c5dcd26a..81636726d55c 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 d705dee1c7bb..77b7ae54cf99 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 61ac2d5133bd..bc553a99c22a 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 033fa6eb0493..62e16bb44920 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 43b2461b7877..8e0bd97b7aab 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 4660411e7a44..32ba99f683d0 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 2e4f4204fe27..f1813131b48e 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 40eb5a0525f9..c571b51438d2 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 bd3143659667..84d075d2de40 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 f710a89de00f..319aa2efa337 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 ae473dab3623..179de1a6dbe4 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 29da367cd447..3deb7121dfad 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 7355602997cf..75a66b781d94 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 ace9e3d0ae61..c35324e159f2 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 f8dfcfdc4f0e..1f06151a6323 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 54d1ca9c3c16..ddea16c47930 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 a3ea9144d895..909321b40a50 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 5ae46ce5bf25..38feca91cbe1 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 d692b70baf56..e349cf459301 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 936c46285cab..4f632553bcfa 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 8c45ef8bbccd..34c9d1682d45 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 1106e44327bf..11010347b64d 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 fef5e97decdf..f2ceb48aeb8d 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 b17b691d1b49..71fde9e60fd4 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 9846565ee145..f261dabb51ab 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 49246cf19368..778520051870 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 ba29b921b709..9339bfdf959e 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 13ce205ed0c5..d613ed2b050a 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 1cde3476a094..611f3745d7dd 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 55eb6ab1f95b..29d3030339ad 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 eb1089eddf30..6f045182904a 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 46e085ba73da..460169442aec 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 a19f4d941de9..4c4bb646f557 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 c0e78f874163..c2913f7f2811 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 41cefd4ef77f..f258834a56ff 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 94772a4c392a..287708448a94 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 37c003bffc51..5340e641d8d3 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 b459f926a618..172793addffd 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 ed4a9dab1e3e..6e2b87f47ac0 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 61efa1b2b535..98818622f3ac 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 7054358e5d69..0814523b5f8d 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 083425cd33e7..54d416c4cff9 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 668e9e61b91e..273975482401 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 d7acf18d2dc3..9c47b821419c 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 673abbc364e2..838f35e0c3dd 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 0d62314f5e98..f14aec2804e9 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 f4a9c715181b..cf3ecae643c7 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 657fa840c50d..0ff147237e7b 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 a288e95a7697..16373372d5de 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 2fe971f0bfec..fff181e29c54 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 7f95a6b86d1a..8f3a8376d325 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 87df4f2c0931..b4c0b6b76bde 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 2ba7ae58f931..49dcc2fef925 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 d8b067fa2bed..c743c026b55c 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 ab89e11408f1..5e56d0c919c1 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 b33bcfc493ac..76f9f6ab71c3 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 9e991b15d5fd..d23f205e4689 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 e167a32c796c..0a5ba4c5c7f7 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 13b1a7ddce46..93af3669838b 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 7ae486856c37..4e221f7741a1 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 9688673a4124..cf8d31fe2a09 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 3b7c537dbec9..978ff9c4234a 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 ba0a104be1da..f502d3f6ba79 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 8708baf4dc0f..9ae2bd19595d 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 6ab33611fd50..8c26c185968d 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 8e2fa8d03e0b..e872fca33174 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 08f274f0aee9..195a9c7cb972 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 2ba45b6c2624..97c0598485c1 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 784d6010b280..8db959b9964e 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 cf598d914a51..81d02162c97e 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 a7c0799d997a..fe21f51a0a0b 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 9c7d2e242ff7..87b8a67d1434 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 acfb8439b2b2..0338d06de5e0 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 ec220a4ddc7e..56364d94a6c7 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 05cf05b02ef7..3e3e59d84842 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 079e88c72962..8f600f010e35 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 ae8a795092b3..8817f789b10b 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 a3e32b870726..3a41cb9babe4 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 37de735da4f1..b7939eeec5da 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 105b39c07551..233f161debad 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 35d1a854e212..1a5f4b724e80 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 fbdb6c5ad8a4..0445b319f3c0 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 0e3f62b16c53..c4c3629c26eb 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 def39baa9bed..aa80dedb9447 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 1db08de82cd6..859cacf801ec 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 c019fe1f3472..3f1e7263025e 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 1a894304f20a..eb00bcc3cd0b 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 fe4180e2ed5a..30357aaaf002 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 3f1043fb54fb..d96f63ca3872 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 4fdd1e421640..c1ab6821ad3f 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 5b597ea298f0..ab8035405a99 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 7b1c61d8f6df..91dd1882c279 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 d9b15c4fefdc..4a71962154c6 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 59e8708dc2b4..ec3a972a4459 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 d4a2cca9624e..6f0d96e6f19a 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 65309e9c0b57..8eb0c0b663f6 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 37aba07af820..2c708088a794 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 dd52f7a92230..e25a707ee6f6 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 8d31795cc026..d1a227669129 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 576f6d7c4e40..4d4bf93bdaa5 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 31121de3f7a4..dc922b789e38 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 c12fbf7f1f62..ec312953c07b 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 74acbfece14d..a67ffff8596f 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 4d98683b8efa..f72fc368a5a2 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 c56a46520f80..26034af26a14 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 cf201d689c05..48a605dbf0ba 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 40ad40f20814..c90a437bf16d 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 53ca88f55392..d4d1300c881f 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 08769f1a6378..91cff8d8b063 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 a47b7f3f0a1a..2e925a88b957 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 5cb575d3faa3..067a54287c02 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 6ae993f421f4..77d7cdbb4a4f 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 5e39326b3cd4..59d42f172df5 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 f8c6dafd1dff..c1a1a326fb1c 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 44fd2009bbf9..c7a2e5dc3199 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 e1ca423840d9..70c1cf918edc 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 eb8d7738b3dd..7b9a7a2a56e2 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 a9055139e95d..bcf625ecbd30 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 04a4a3d4474f..351362eebbf8 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 2966d0a53b0f..d12ad6e0fbbf 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 0ad587f0a7fe..8ec70f9388f3 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 39262912ad62..383ce92540a1 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 65db7019b739..48c6caae446a 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 3e154013fad8..1e49dafbc7de 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 547bebc20921..c26824279632 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 a3d60dd8e242..e2bf7c4a4c2c 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 76b01f073853..16a4b497bd44 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 db1b2f2fcb18..f2f9ef7b9620 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 07d9f5f964a2..8e133acdff74 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 d87b28f8424a..98d18c9b90e1 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 fb22b15f4eeb..e6af823c2fda 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 fa13e5bf724a..89b1e31569d2 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 fbf773f59879..fe6f98c88909 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 246486f2f60c..8aad415e233c 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 3e2962022939..81dccdaf4bde 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 dec15deb31c3..7da4877082b8 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 65259467549e..20e5654047d6 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 97e1b55d0807..ba691e934fc2 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 75790da9f183..c0f65c667b79 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 140883dcd241..a6751368ace4 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 70a210b1c369..74af9351159f 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 6f413acde3f3..86c85ccb166e 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 0a2891476eb9..67d3f2342a45 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 bae59261946d..fbe9b94c98e0 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 e34ee142a487..2a708465a195 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 01a886c2ae93..e7af6294aedc 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 7c63b22325f3..27c0acc65b26 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 04695abcd9c7..f8f4c42e2243 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 9253d8da5f0c..396aa0190e05 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 16bec2b98085..41829dab3bca 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 5715ea5e1265..504fbd932034 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 2613211ce68e..9c850d8d8ab0 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 ad0e93f86839..6e20987e69d3 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 8e8727be37c1..df23138cccf9 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 7aa41fd395eb..2705689e3101 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 7a76ec1b147e..6e23a3ae1fed 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 4b12ccaf1498..5507bec5ba10 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 0acfc5370d49..582bf98f76eb 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 2d6a473683a7..37db67b186e7 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 eee09bc09b7d..5f7378713c69 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 99ef918dd4fd..1a2a73b2a258 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 68a54cfa4967..deb75e3cbfff 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 07a985ecd372..e9f2923d9c89 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 d9bf92db056c..88aa24a36ad9 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 c62634716edc..052093deb6a7 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 670877a75262..b1eee0d1f5dd 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 23426d7dbecd..bd1e108629fa 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 30f16e23317e..bde4ab2c91d3 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 6cc9cb66baf6..dc887a9f2b66 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 e9acce06c44e..50a7543bf77a 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 027648d2b6f0..cbe4744611ed 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 0465108eec32..2ef836695776 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 20200b1c599a..6aaa6119fc27 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 386c6fdd5b44..1b7ebaca272e 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 391b016d76b9..e86ce715edd8 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 d537921e0a11..1f0aff148fbc 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 6f058be113ae..03eff59b7813 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 1f6f767a0a6e..e542839d261d 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 d6e94d5467db..06ca360fff62 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 adbfd2505de9..b540a511142b 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 abe5c89123b3..72c1109ff019 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 0e0d2b6585b0..880aa6f56332 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 2848da7385a3..ec10e991873e 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 7763a20d6342..7a3b06bc89b1 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 4571d6840708..61065b6ffd19 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 fc1f7c8bc249..1531193a9774 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 58b97ebaadd0..d547c77f16f3 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 0cb748f104ed..0e0484eacfc2 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 e13a0f13520d..4b8fa6a66be0 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 40979236d58b..fc0b40fb1b79 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 68131252a45d..f499422a178c 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 78ebd2b5f64e..89f9d9ee789c 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 f41c0d1a2b24..fa89b4710622 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 5b59e20630e4..9cba2fe4f595 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 f3093c3a4cfb..11c8bddcaf58 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 b0fa6f10d866..06f46a665bbd 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 480350e20ab7..c532503813e1 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 052d31f59c06..dd20d4269c40 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 26a85b168f1f..6579d6cf88e1 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 c9720637f751..3e258aa0414a 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 97b404e94ba2..798ce10f9dcc 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 e5a527302651..32b23da33c50 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 47c035f4effb..86154b97adf7 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 668c893b0d62..fbcb9ea72eaf 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 7a838d5cd099..fdd41521c5ed 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 07ec60cbe23e..5115f40b9dea 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 297400466e3f..ae687094edf2 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 517eebaa70ab..f71a1930bc04 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 7db7f8681212..a2e741c10bfa 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 24706bc63d77..3087eac58b50 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 b1be384dfa9b..958ab138006c 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 e307ef5007d7..4f9a11587f82 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 948397631ac1..1d37f17c1212 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 7128474511f4..c285e5a362c3 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 227e6ac5311a..b7b49798a8bc 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 ea88bf6528c3..0fb14e29e7f6 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 a04ed13ba5e8..477c52a2f678 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 e93d54d1a945..374d1c871c56 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 e1861d92f374..15591e706680 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 399908fba1f6..f2fc57384875 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 89486d949123..6656905500be 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 b6a64440a2cf..f4f64b2cb439 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 284efec7cc8f..4f05a5e71231 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 8270dd0c08f6..71c8cc47b1a9 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 5eb141034a35..671c568f0563 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 ed223edfd6c5..54bfcf4a2352 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 01b7cb321915..71fe031de2e9 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 d3182820dbe6..058e944755c1 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 7edf58338960..6d2ad3f6a307 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 7c590f26ca43..da64d857e6b8 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 97d655420618..41dabcb7d498 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 001bfe89ac08..179ef113be1f 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 5d13a3b773e7..7612b60b759c 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 69fd2cb2686d..39b37dddf253 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 23ecfe0c3d94..c892a563b2a2 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 14fc689e655d..1385ae7395c3 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 02c7f6ef5a7a..b1f5d1bb1a9b 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 a2bb9df22d44..ae7f2126591c 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 f7f798da5b2a..3d079f9ea18a 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 72a6a5cfabec..c63eb0fd8f4e 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 37ce53de281a..53ac79e8683f 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 057dc15edce7..652a442e2daa 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 852f1c6007c3..db758e8ebbbc 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 26396d010a8a..6ffff0e681ef 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 5f5f61e6e0d7..315c74846f0b 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 2ed4ea9e5588..21950d6e497c 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 519e63559dec..dbd357d4d297 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 d7aaa0e3e425..19293c1223b5 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 e92d2e07c4f1..75e0b7e1275f 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 03aa07829116..b26930009eb3 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 59068c5ef9d9..0dc198c1fea9 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 5a1f3d40c056..3d5c869d5092 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 bee01e3d8d5f..a8293cb7192e 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 946e62860b2a..baa516149da0 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 d5cef191f338..ef5df1e5e5a0 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 dc535cbabd5c..8488508e0b59 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 de1f3963d0fa..2accad81f544 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 ef82148c1c76..18bc4caf9d8a 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 6fed6dbc4f9d..ffca2de0e1de 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 1be0ea44e036..6ac1ac90c8c4 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 4e70a8374dcf..a02850935583 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 b1c57db6b81e..f89812698603 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 e4f7bd5d1825..196be30fe07c 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 d8f869323289..ca87563bf1d8 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 1e299eef9a6c..b1a5fc4aaf27 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 a6bf266762dd..0516b4cfe6ee 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 cd28dba7ddbe..708f0375c5eb 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 2d835a886de3..b16d612bd3bf 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 54b8f3c92aed..afae6f624d96 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 2d2e53cdaeef..273ab4059456 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 54e06e7ac771..a93da444f106 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 7b7f4885ed26..47c2af3a894d 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 d3ca8884f271..821e4237a23b 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 c413b217576d..3a6938469bb6 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 0661badab378..b108d7153f39 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 211d58cce5af..c80ca41f3507 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 5d81399ee2ac..6a3dab05b8a0 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 e41ad703b56a..adc012106f11 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 284a818ceb1b..afdf402b085b 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 6fb605f87303..cc353bc97acc 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 db6d893dad2b..e9383ca793d8 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 0bd38bc17114..cbdd54c927ec 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 44173273a264..5633fe5bb8ae 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 b53733bfeec4..c1f2d4f1bb5c 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 b29214edd91b..baa4d48fc7a1 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 c2e499cf1423..5d4fb359f2a1 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 46deb0860e98..3efeb7f0ddbe 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 f4125bb46218..a7cd77159c8c 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 9efb766bedbc..54e252f53a13 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 582b4c43fd65..bb56b798ee9e 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 4045c1f356ec..994437b07126 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 400c58a74eb0..63ac0e335594 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 aef49fcbacb5..c6ed59c99134 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 36676b8c5262..bc0f843824a1 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 3d1ade1edd08..ab26b5d8d214 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 3400eb8d8f70..af5a19c3895f 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 573628cf3cb5..26083383f077 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 750cf83f8b4b..4749bfe9fd95 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 649b479cd430..97f218db4e2f 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 c012b21b724a..7685e1f42cae 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 bb2a230c1d21..6370c775abaa 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 34e789d0c44a..b841c109facb 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 501c71710238..8423c3bbcc20 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 b66a9d428a97..7d2457284ffd 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 434600f9d8b4..95a4d581cba3 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 67a63d13b14c..e5ed01252e8c 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 709785eed6a7..c7a4bc2741c3 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 453c3a429f1f..15041ba470da 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 b13465377923..628477b6333c 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 88ab6b19ab73..ce9b3ccb2331 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 cc06b65b88c6..696fa8171454 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 2a7b156ab34c..58e7a1573936 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 96d4a07f2c22..92f92ea941ad 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 95a25853861c..ebfadc1dd4c7 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 fe1173231d49..c6ae2d299246 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 86faf6e4e3d8..da956524eefb 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 ee9ddd705cf5..e6e42a83eed7 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 39f51ba05f24..eb040356fc22 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 f917f24728a6..240865fb34f1 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 3c17b33eab85..ed86ece4be61 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 85c63359d3a7..f3f4b9a5464c 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 2973573c4c06..80f9bac8b0d7 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 8508473e7c6f..27bbe9c63a08 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 e464f9fb6669..31a441744dc4 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 f74522388239..e5ba5dc7ea50 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 3d2bc27428cb..17696f605a6f 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 5eab7f36399d..c24585c6116d 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 13df4aad1bbb..3d765dc5ae50 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 a9382743fbd0..cf7a8b716635 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 cb98690fdea4..c0741dd07133 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 dffe56eb6122..523b31874f6d 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 79aa82c36001..f0c0e6c4f1b5 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 460f8ce513b1..3d90e2b6e15a 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 7b47838f3b40..35d5844becdc 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 29b43f32ff6c..3dbc68ba4bce 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 ba3e0f5b8f79..fd50d3df9420 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 700300ea0a8e..2ae9ad023d7b 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 fe5504a3892c..aaac31790091 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 3d677e176f80..4b246f1d4539 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 46e569857aa7..461ffc11e71c 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 8650c9a0743a..4a795b6f99fb 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 ca178ca835e2..f380648c59a7 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 fc45e9812029..d5a97a2b9d11 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 0e0c9ccfbdac..7285c9be5b25 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 3faf22c8ba1a..cee32b0804fc 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 4d34f197e536..e8db9dc567b0 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 e657fbd58582..2940ed6235a3 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 771cff47863f..e363bbdc3c01 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 51b82cb0586a..5036d1e6e5bd 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 8d7e9182562b..a1b52f1fd376 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 3b151124ffe4..c40e87461cc7 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 468a670f692d..72c96a908314 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 c2929f7191df..11a42b36293d 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 a14070241118..be4adcbf179b 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 8ac189d6da02..333edab79c50 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 ff99e3b60285..44e4db32a17c 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 560c75424842..ed747c4e095e 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 486f64492ccf..8c1b3a670c26 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 92eca592fd47..b849018e46bc 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 566dc6e3adbb..ef084e9d5539 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 475b6adda2b7..10cbda561712 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 fda3be99d563..292137eb2f19 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 bef5c91a0df9..8d59dfe71b39 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 ba7ae0fbd0b2..50aea3abeac6 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 27e3f88e672a..74f64bae4cef 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 8e3ade9dd639..83394c074af8 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 9d154faf0f24..d0e9db98a9f2 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 29db4c1b8ce1..9e04fc4dbc1d 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 8a30c16754ce..8c9e7cfdc76f 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 1ce800ec29fd..097b0092f7c9 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 1509f4ab0bdb..01c14ac01c87 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 c7fec6a9c824..29c28d090777 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 6044fb84429d..8290362325ea 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 041514c0766d..f844393df98a 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 640d7c38f970..e11e9f9f63e9 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 0858314e9ee8..b03343afd8e6 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 ffef55851e23..4e1a884af4c4 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 8793a68518c1..f3802ab1ab4c 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 9e7dd5282469..cf9ddea1e563 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 8b362a27b2b4..cbef331e4b98 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 be8d6c840362..442f42240f84 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 8d82b2628ac9..56698d7f8874 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 c749f866acc7..82cb7033ee24 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 63904fd05de5..fcd83907686a 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 f511dd452e06..03e7a5848e6b 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 7dffb1c92516..dae3774ad3b1 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 594efb2583be..4baa2c21e57d 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 d2af33d33034..b21bc0adb908 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 f2fb696985be..fe058a2af517 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 71f6a1231e09..9a5d3acd3544 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 5e977c4b650f..0f887d631fbe 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 830f53344148..28ab742361c5 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 279222776a02..f09e01bb333d 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 f9df1919513d..bd8efc8b2c2d 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 c54f148de3b0..c9a06d9f0506 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 9eaeedf7d793..ea1ec3a33d88 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 0684d0c3edba..ca298ed858ba 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 07582c6c7825..23bb67d37bec 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 4c1f2de6538a..97b54b9a960e 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 9ff6b6615223..106309729c74 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 74fad1e1a25a..7d4b6a8dbdbc 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 3993a0e2cac5..acb6d5410114 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 ef769856a7ae..73b9e6f5170c 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 97b896cb308a..c86d58976aff 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 321bbccce572..af9a2f1ee6e6 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 11a3fc81c366..5d4f51e64e33 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 c87306a86a5c..8ac94151a271 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 0d34511a54e0..7eb0ce30e922 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 c2db2b2fde5e..614681076532 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 39d97a4cee01..dc0bc6f47d81 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 1bdf2cf428b1..576dcb6f8406 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 df8b34c8f427..d02e2caec604 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 3ec11a76e72e..0ee3c1316b3f 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 919869e94069..346a53cfa72e 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 acae44441c6e..0db4b7029fe8 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 f599dea70a14..f43c6f6f05b3 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 7c1110ca1f9f..88dc3f0596d7 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 2fbc31ae60e7..4f8938404fd8 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 5054a4a0c14b..82e549317db2 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 27b50442a4a7..135391b2f3af 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 839ff8eebf7c..2cc5df6c9d45 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 4c48a699dbd7..30161efcf1e7 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 be3c604e5b89..9f1523aefdde 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 5ceaf22f4c61..6baa79ed638c 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 96b2e70ba371..9e0f9108affe 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 72c7383963a6..17ec979a7de8 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 89e3b406d7b2..b62789d2af3d 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 59a7a34bb5e8..2ba2fa066c5f 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 e779b0d74c04..2cf972f82b40 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 459e9e09a6bc..ff771acbc4e6 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 8193c13a07c3..51697cd1b14b 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 a65d8ffe49bc..1e20717b24e8 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 249d3e718155..651f04c923c6 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 666f6cda4b47..07205b84c0e2 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 ac0a4592eef0..58e530646455 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 607c914a8a9d..21e84acf53d4 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 13fbd4ec434f..c24923b5ff7a 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 c72c80ac8669..0028ddc02d3f 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 860dc599721c..700fe0f6e84a 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 1933ef8d01c8..f6b2b1f1d331 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 453d86326b58..0d5a3833348b 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 707f4a54e47e..8a4add108c38 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 9cd391f7e896..fe91d66aa2f8 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 1bdd2ea02ebc..bf003a6afa54 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 7f644e2dd144..3cfd24f15614 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 2cd53266d314..cc5988b43265 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 be9fb210542f..1a9e70bbf302 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 99469c2ab24c..600262c9c82d 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 b075208e6a06..b8334562dabd 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 3465aa2c4fb0..f9c3f5dada74 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 ebdea36e5994..80babdc2d3e6 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 eb21922c8a12..68f5f2902954 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 42a39daf61ed..53ec0b01a2df 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 c744a68e4f89..04565842f23c 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 c6d021c10279..ab0f92b054ec 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 4f92e9a19fa7..83aeb22cbbd3 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 af0b4424313e..685bb7593b31 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 d183730aa1bd..a3cd9a345c97 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 0af67903fee3..ffc4cfd33ac0 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 4d04bb3253ce..a30e38b7b309 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 48ded58d030d..d614c1501fd7 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 e98bae5c0312..6a46a43890cd 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 5d9e8e3c9cf5..c28cb88fc4a2 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 a9e3ee12d5ea..ae71fb65f8e2 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 9ce7a4908006..cfbc9129dc49 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 a5300f0ee110..5b47a4b94c9a 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 0eda20b5b74f..94a895fee66b 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 885541781509..63ab750467cc 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 fe168bf1f2e6..5291cbc5bc78 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 b7ba998a3d6c..b9180166db76 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 8067d58f100a..24bc389add45 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 161d5221a0f3..179ac09aefef 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 efaea1884cba..0a0789f49741 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 c1ae789399c3..7e9ca5e1281a 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 121e4ccf7f65..e1a732eebd61 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 c6ac1964a7c3..25c2c262c555 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 4dfd3c9c88e8..5c34e2333a29 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 2810f5520be4..127f54521771 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 80f442828c98..016e18874d01 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 eceefc725e15..972062a82b50 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 285c2c83f5df..a9b89d067f90 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 57ce7d776d89..e9c52b0f7761 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 9294d752ed8c..d66d34ed523e 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 8be4122b7a70..75eacc93a651 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 ad2fc708cbeb..86134a22362a 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 de7d3e4b84a7..5c90173d6440 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 9abdf498363b..ff8a4da0b5ec 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 5c63970800b4..9d7f5282e7d5 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 73f63b41a195..1514a044d493 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 8c9bd9f33edf..aa258aec0fbd 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 d0bbb8af0afd..f472827a932d 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 b81039b19a2a..cd88321cbe22 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 77917b0dd50f..94abd71aaa2b 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 e9f6371eb7be..04f11570c3b8 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 4607d7e8b18b..3e5a5ff5b750 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 3a070c91ed15..d05a17b7f3e0 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 791708fc06ed..063b9b09b61f 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 972de9a2685b..031a0427bdc1 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 70c464c42f61..96b39bde894f 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 9181e67ec38b..064587d73a6c 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 7dac7dc7cd6e..9ddaf68721e9 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 d9103d5b43d2..12e340c3e529 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 717339658d3a..090ac1c4fb02 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 5ddbd0342f06..e5e77635006b 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 67116bb17049..4f1106cfae64 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 65ade2ec19f7..b8cdf182b525 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 939b2372ba35..94ec9a42f026 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 8133f507f3c9..49c1f3947b4a 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 1bcf22c9bb28..c60049450dc3 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 172944c955f9..44e913d66984 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 7e10e6202eb8..0d02e4103020 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 f45864c60463..e285a576cd53 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 3554fa39e7d5..00d5cb672dc6 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 f8b8673367aa..7b6f0ba76854 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 f4dc488fccfd..03fa36d93633 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 12cf552d74a4..2a1d935a0f7d 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 5894e283d7a0..ecda73cfc291 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 db6429a3c3b7..40590d072a37 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 8527340a444d..60afefc9df6e 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 6d4618c66a20..1bfaed1c3cff 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 6a2316302ad6..8706338a166e 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 b2081bd3ea60..656a4efe42f1 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 d65b26d23b0c..4c045a6dd285 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 489d0e49c2d4..d78283bcfe92 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 7cf0872fdec9..9e4ddc069a07 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 ed27e23b4147..020e0cd462ce 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 dda3e1315555..32fe8dad8019 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 e936d04132ca..eccbc535d5d2 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 535b4d707876..eff0da56f6c4 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 fa7293d61562..5f8701b7cff9 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 77c2d26b808c..760113a0d8a3 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 456503e2d26d..3d4b24d0e892 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 f34dbf10db36..c3d2d45aa71d 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 a408c5d59c7d..5c6027346150 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 237b1b9cb222..aa1d575ac350 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 3f688269f88c..db28d092159d 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 f14b55371590..85cee9032275 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 e1357fab6904..74ca20a9a327 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 de5f807ee418..b69ca64241d5 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 0fe2d887f0b4..2b3c84dfc5f8 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 c661b7b88292..6d4968bc925c 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 ac0b3b605454..9e34822ea78e 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 7be3e682f787..d03c4c4d200d 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 36f9c706b0c3..881bf0e0c066 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 b3202cb8b41d..5200e7b31a27 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 d6a8f44d9678..56d9db51f537 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 a74a8217e429..3611320346fb 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 28ed78a56e9c..d8ddca5a8970 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 19b13f4e8c19..1792a35309c7 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 c6cc712c1c1a..22ae69b4f135 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 7ce2891fb8b9..f773c43d788f 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 5d36c16b99dc..f195dc83ce6e 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 14c2c8a7e056..e4526c1bc385 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 65decc3bfbd3..e01b04385fb7 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 a23d9bfed972..ce7b4e97a6d5 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 4ed96e6a42a9..b34d24079d85 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 86366970a9da..8b34be5fca68 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 176e04b63148..b4dcc496d5df 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 9bc334f160d2..5d55f4ff5aa2 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 0ec7469fc228..2bdd9ae4ac4d 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 c8a7b08fe8b7..2312513bf709 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 0804e821e8c1..0b251c623746 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 ca5c18e99094..7af1720249d0 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 8f1a442785cc..6089c444dcdc 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 bdc69dff987c..704b0502188c 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 5f072f567894..62506527f676 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 eeae82123607..f35a8867e4ec 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 e899cfda6304..3aa535367c6f 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 d7d100ae5157..fbab6f0a1ee8 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 9f0f25101a97..264678db60ef 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 dad1a5012a18..4e4aad346126 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 1b003af86698..b6d144818e53 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 2fa4180b48bb..8e46a0831c5d 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 5ca0762515e8..337f18d334db 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 c1bc543451c3..040ca6a2ab24 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 8e19b4254a61..7e7259d74525 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 5648bc3238ef..c69ac7d97414 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 215758941d6c..f2ed09bc07f9 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 11a9f5e70f43..78d0e0c428f9 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 6f96a75057d2..083b114e480a 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 5444e65826a8..c6ac7a2b0455 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 d384c1e622c7..9c92c6cc8e81 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 a09815bc7cd5..f57591b5fa2b 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 97062abfeb1e..172af55b7a8f 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 77125199e0a1..616fbb561caa 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 50e91dcdbd45..22c74b51437a 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 676e3764f85d..e62155b7d903 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 77180b225844..bd4235a7d36e 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 f1077840c46e..0f6142226237 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 5da6a8a51104..0e3329a5c8ba 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 c0191e292c10..58afce216278 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 92ecad0b40bd..4123eb9efc14 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 347eaf30cfdb..71729b0fb085 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 fd2cd4de2f54..63c28c71a412 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 3455d04e9af3..8a65612ed297 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 10120ee61154..c4dd6a3e97f4 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 79db7e17f51e..d9fef0b0d892 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 455a74c462fc..b6efbfe20685 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 730b5c12d11e..273e00c660b1 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 c93639a3d65c..9e160470edf3 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 7917d6457e24..60de68d08da5 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 869860f3357c..f2f89fed5297 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 3a828ec9613f..05002b44a569 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 0518bf8a648c..56f2fbf13bac 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 048cec02a9a8..545c1861f9f8 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 0342055d1ff8..cdfe5597a9dd 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 e7e50ce33397..991181cc3e50 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 33edf0366ded..c25692e21af3 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 192643b3a2cd..0042e941a991 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 ee355c7da850..c91cf0153a12 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 f2b5096ad482..e22ee3915384 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 0a96449f1da3..339bb5252b47 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 62e3cb0e7732..a4f541f8ff99 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 0edd3b3d34b1..d7a8c107a2fa 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 63976acb0f9d..9c5cde8ca769 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 32b810e03bdd..07eeadef78f7 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 e9f483b4d94f..42008ad7151d 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 8e44201bb003..6d0656703a1b 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 a8702d1b6197..61dfc88d55d4 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 40011c67d987..7a0f8ad5d3a2 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 4805bcd4b8b3..148b7d7f59de 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 67eb486e6d89..85a7083cbee6 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 c213eb401f3a..39d2e6a0062a 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 4cf6ead46819..5c374c60b6f3 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 bb43db833119..abb340deffb3 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 7f6c32ce2f6b..5e6204093a68 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 90d52995b318..14dbcef87510 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 9dc656f40edd..45f675337d6c 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 f30d66e47620..0fe9be99dab6 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 09ea011490b5..5e89f560e099 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 0607b423feaa..62433e1f692a 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 ff17349e7575..3b6ee3735818 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 95235ed872f9..de29b9d0d0c1 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 d8ab1ea6108e..7676723bb9db 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 2e34aad403f5..288a9473f607 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 6a7417324a0d..180484532c38 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 930b1f5df323..e6bff59f67fb 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 1f4d9ff0de90..6967cc4423e8 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 c32b9885932f..291692a5735c 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 324cce5f98a5..44b99d365eca 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 7b6def29f08d..881298d0fa4d 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';
-- 
GitLab