From 4a0a41d89dffa3dbe6605a1f67452fbe7c17d37f Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 12:51:44 -0300
Subject: [PATCH 01/11] Raise min `PHP` version to `PHP 7.4`, check
 compatibility `PHP 8.3`.

---
 .github/workflows/build.yml                   |   32 +-
 .github/workflows/ci-mssql.yml                |    2 +
 .github/workflows/ci-mysql.yml                |    1 +
 .github/workflows/ci-pgsql.yml                |    2 +
 .github/workflows/ci-sqlite.yml               |    1 +
 composer.json                                 |   27 +-
 composer.lock                                 | 2217 +++++++++--------
 framework/composer.json                       |    5 +-
 framework/console/widgets/Table.php           |    4 +
 phpunit.xml.dist                              |   61 +-
 tests/IsOneOfAssert.php                       |   30 +-
 tests/ResultPrinter.php                       |   12 +-
 tests/TestCase.php                            |    6 +-
 tests/bootstrap.php                           |    1 -
 tests/compatibility.php                       |   75 -
 tests/framework/BaseYiiTest.php               |    6 +-
 tests/framework/ChangeLogTest.php             |    2 +-
 tests/framework/base/ActionFilterTest.php     |    2 +-
 tests/framework/base/BaseObjectTest.php       |    4 +-
 tests/framework/base/BehaviorTest.php         |    4 +-
 tests/framework/base/ComponentTest.php        |    4 +-
 tests/framework/base/DynamicModelTest.php     |    2 +-
 tests/framework/base/EventTest.php            |    4 +-
 tests/framework/base/ModelTest.php            |    2 +-
 tests/framework/base/ModuleTest.php           |    2 +-
 tests/framework/base/SecurityTest.php         |   24 +-
 tests/framework/base/ThemeTest.php            |    2 +-
 tests/framework/base/ViewTest.php             |    4 +-
 tests/framework/base/WidgetTest.php           |    2 +-
 .../behaviors/AttributeBehaviorTest.php       |    6 +-
 .../AttributeTypecastBehaviorTest.php         |    6 +-
 .../behaviors/AttributesBehaviorTest.php      |    6 +-
 .../BlameableBehaviorConsoleTest.php          |    6 +-
 .../behaviors/BlameableBehaviorTest.php       |    6 +-
 .../behaviors/CacheableWidgetBehaviorTest.php |    2 +-
 .../behaviors/OptimisticLockBehaviorTest.php  |   23 +-
 .../behaviors/SluggableBehaviorTest.php       |    6 +-
 .../behaviors/TimestampBehaviorTest.php       |    6 +-
 tests/framework/caching/CacheTestCase.php     |    4 +-
 tests/framework/caching/DbCacheTest.php       |    2 +-
 tests/framework/caching/DbDependencyTest.php  |    2 +-
 .../caching/DbQueryDependencyTest.php         |    2 +-
 tests/framework/caching/FileCacheTest.php     |    2 +-
 tests/framework/caching/MssqlCacheTest.php    |    2 +-
 tests/framework/caching/PgSQLCacheTest.php    |    2 +-
 tests/framework/console/ControllerTest.php    |    4 +-
 .../console/UnknownCommandExceptionTest.php   |    2 +-
 .../controllers/AssetControllerTest.php       |   22 +-
 .../controllers/BaseMessageControllerTest.php |    4 +-
 .../controllers/CacheControllerTest.php       |    7 +-
 .../controllers/DbMessageControllerTest.php   |    6 +-
 .../controllers/FixtureControllerTest.php     |    4 +-
 .../controllers/HelpControllerTest.php        |   59 +-
 .../controllers/MigrateControllerTest.php     |    4 +-
 .../MigrateControllerTestTrait.php            |    8 +-
 .../controllers/PHPMessageControllerTest.php  |    6 +-
 .../controllers/POMessageControllerTest.php   |    4 +-
 tests/framework/console/widgets/TableTest.php |    4 +-
 tests/framework/data/ActiveDataFilterTest.php |    2 +-
 .../framework/data/ActiveDataProviderTest.php |    4 +-
 .../framework/data/ArrayDataProviderTest.php  |    2 +-
 tests/framework/data/DataFilterTest.php       |    2 +-
 tests/framework/data/PaginationTest.php       |    2 +-
 tests/framework/data/SortTest.php             |    2 +-
 .../db/ActiveQueryModelConnectionTest.php     |    2 +-
 tests/framework/db/ActiveQueryTest.php        |    2 +-
 tests/framework/db/ActiveRecordTest.php       |   64 +-
 tests/framework/db/BaseActiveRecordTest.php   |    2 +-
 tests/framework/db/BatchQueryResultTest.php   |    2 +-
 tests/framework/db/CommandTest.php            |   28 +-
 tests/framework/db/ConnectionTest.php         |   17 +-
 tests/framework/db/DatabaseTestCase.php       |    4 +-
 tests/framework/db/QueryTest.php              |    3 +-
 tests/framework/db/SchemaTest.php             |   17 +-
 tests/framework/db/mssql/CommandTest.php      |    8 +-
 tests/framework/db/mysql/QueryTest.php        |    4 +-
 tests/framework/db/pgsql/ArrayParserTest.php  |    2 +-
 tests/framework/db/pgsql/ConnectionTest.php   |    2 +-
 tests/framework/di/ContainerTest.php          |   39 +-
 tests/framework/di/InstanceTest.php           |   14 +-
 tests/framework/filters/AccessRuleTest.php    |    2 +-
 .../filters/ContentNegotiatorTest.php         |    9 +-
 tests/framework/filters/HostControlTest.php   |    2 +-
 tests/framework/filters/HttpCacheTest.php     |    2 +-
 tests/framework/filters/PageCacheTest.php     |    4 +-
 tests/framework/filters/RateLimiterTest.php   |    4 +-
 .../framework/filters/auth/AuthMethodTest.php |    2 +-
 tests/framework/filters/auth/AuthTest.php     |    2 +-
 .../filters/auth/CompositeAuthTest.php        |    2 +-
 tests/framework/grid/ActionColumnTest.php     |   10 +-
 tests/framework/grid/CheckboxColumnTest.php   |   38 +-
 tests/framework/grid/GridViewTest.php         |    5 +-
 .../framework/grid/RadiobuttonColumnTest.php  |   15 +-
 tests/framework/helpers/ArrayHelperTest.php   |   13 +-
 tests/framework/helpers/BaseConsoleTest.php   |    2 +-
 tests/framework/helpers/ConsoleTest.php       |    2 +-
 tests/framework/helpers/FileHelperTest.php    |   30 +-
 .../framework/helpers/FormatConverterTest.php |    6 +-
 tests/framework/helpers/HtmlTest.php          |   38 +-
 tests/framework/helpers/InflectorTest.php     |    2 +-
 tests/framework/helpers/IpHelperTest.php      |    2 +
 tests/framework/helpers/JsonTest.php          |    9 +-
 tests/framework/helpers/MarkdownTest.php      |   11 +-
 tests/framework/helpers/StringHelperTest.php  |    2 +-
 tests/framework/helpers/UrlTest.php           |    6 +-
 tests/framework/helpers/VarDumperTest.php     |   18 +-
 tests/framework/i18n/DbMessageSourceTest.php  |    4 +-
 tests/framework/i18n/FormatterDateTest.php    |   24 +-
 tests/framework/i18n/FormatterNumberTest.php  |    4 +-
 tests/framework/i18n/FormatterTest.php        |    4 +-
 tests/framework/i18n/GettextPoFileTest.php    |    2 +-
 tests/framework/i18n/I18NTest.php             |    2 +-
 tests/framework/i18n/LocaleTest.php           |    4 +-
 tests/framework/log/DbTargetTest.php          |    4 +-
 tests/framework/log/DispatcherTest.php        |    2 +-
 tests/framework/log/EmailTargetTest.php       |    9 +-
 tests/framework/log/FileTargetTest.php        |   30 +-
 tests/framework/log/LoggerTest.php            |    2 +-
 tests/framework/log/SyslogTargetTest.php      |    2 +-
 tests/framework/log/TargetTest.php            |   34 +-
 tests/framework/mail/BaseMailerTest.php       |   12 +-
 tests/framework/mail/BaseMessageTest.php      |    4 +-
 tests/framework/mutex/FileMutexTest.php       |    2 +-
 tests/framework/rbac/DbManagerTestCase.php    |   27 +-
 tests/framework/rbac/PhpManagerTest.php       |   16 +-
 tests/framework/rest/IndexActionTest.php      |    2 +-
 tests/framework/rest/SerializerTest.php       |    2 +-
 tests/framework/rest/UrlRuleTest.php          |    4 +-
 tests/framework/test/ActiveFixtureTest.php    |    8 +-
 tests/framework/test/ArrayFixtureTest.php     |    8 +-
 tests/framework/test/FixtureTest.php          |    4 +-
 .../validators/BooleanValidatorTest.php       |    2 +-
 .../validators/CompareValidatorTest.php       |    2 +-
 .../validators/DateValidatorTest.php          |    4 +-
 .../validators/DefaultValueValidatorTest.php  |    2 +-
 .../validators/EachValidatorTest.php          |    6 +-
 .../validators/EmailValidatorTest.php         |    2 +-
 .../validators/ExistValidatorTest.php         |    2 +-
 .../validators/FileValidatorTest.php          |   11 +-
 .../validators/FilterValidatorTest.php        |    2 +-
 .../framework/validators/IpValidatorTest.php  |    2 +-
 .../validators/NumberValidatorTest.php        |   18 +-
 .../validators/RangeValidatorTest.php         |    4 +-
 .../RegularExpressionValidatorTest.php        |    4 +-
 .../validators/RequiredValidatorTest.php      |    2 +-
 .../validators/StringValidatorTest.php        |    8 +-
 .../validators/UniqueValidatorTest.php        |    4 +-
 .../framework/validators/UrlValidatorTest.php |    2 +-
 tests/framework/validators/ValidatorTest.php  |    2 +-
 tests/framework/web/AssetBundleTest.php       |   18 +-
 tests/framework/web/AssetConverterTest.php    |    4 +-
 tests/framework/web/ControllerTest.php        |    2 +-
 tests/framework/web/ErrorActionTest.php       |    7 +-
 tests/framework/web/ErrorHandlerTest.php      |    8 +-
 tests/framework/web/FormatterTest.php         |    2 +-
 tests/framework/web/GroupUrlRuleTest.php      |    2 +-
 tests/framework/web/RequestTest.php           |   12 +-
 tests/framework/web/ResponseTest.php          |    2 +-
 tests/framework/web/UploadedFileTest.php      |    2 +-
 .../framework/web/UrlManagerParseUrlTest.php  |    2 +-
 tests/framework/web/UrlNormalizerTest.php     |    2 +-
 tests/framework/web/UrlRuleTest.php           |    4 +-
 tests/framework/web/UserTest.php              |    6 +-
 tests/framework/web/ViewTest.php              |  158 +-
 .../web/session/AbstractDbSessionTest.php     |    4 +-
 .../web/session/CacheSessionTest.php          |    2 +-
 .../web/session/pgsql/DbSessionTest.php       |    2 +-
 .../web/session/sqlite/DbSessionTest.php      |    2 +-
 tests/framework/widgets/ActiveFieldTest.php   |   17 +-
 tests/framework/widgets/ActiveFormTest.php    |    5 +-
 tests/framework/widgets/BlockTest.php         |    2 +-
 tests/framework/widgets/BreadcrumbsTest.php   |    2 +-
 .../widgets/ContentDecoratorTest.php          |    2 +-
 tests/framework/widgets/DetailViewTest.php    |    2 +-
 tests/framework/widgets/FragmentCacheTest.php |    2 +-
 tests/framework/widgets/LinkPagerTest.php     |   45 +-
 tests/framework/widgets/LinkSorterTest.php    |    2 +-
 tests/framework/widgets/ListViewTest.php      |    2 +-
 tests/framework/widgets/MenuTest.php          |    2 +-
 tests/framework/widgets/PjaxTest.php          |    2 +-
 180 files changed, 2018 insertions(+), 1822 deletions(-)
 delete mode 100644 tests/compatibility.php

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 30b988edb4f..ac2bb585fc6 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -21,34 +21,6 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - php: 5.4
-            coverage: none
-            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
-            os: ubuntu-latest
-          - php: 5.5
-            coverage: none
-            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
-            os: ubuntu-latest
-          - php: 5.6
-            coverage: none
-            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
-            os: ubuntu-latest
-          - php: 7.0
-            coverage: none
-            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
-            os: ubuntu-latest
-          - php: 7.1
-            coverage: none
-            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
-            os: ubuntu-latest
-          - php: 7.2
-            coverage: none
-            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
-            os: ubuntu-latest
-          - php: 7.3
-            coverage: none
-            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
-            os: ubuntu-latest
           - php: 7.4
             coverage: xdebug
             extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
@@ -65,6 +37,10 @@ jobs:
             extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached
             coverage: none
             os: ubuntu-latest
+          - php: 8.3
+            extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached
+            coverage: none
+            os: ubuntu-latest
 
     steps:
       - name: Generate french locale.
diff --git a/.github/workflows/ci-mssql.yml b/.github/workflows/ci-mssql.yml
index 94255d93ebe..0df2a6b70b0 100644
--- a/.github/workflows/ci-mssql.yml
+++ b/.github/workflows/ci-mssql.yml
@@ -29,6 +29,8 @@ jobs:
             mssql: server:2019-latest
           - php: 8.2
             mssql: server:2022-latest
+          - php: 8.3
+            mssql: server:2022-latest
 
     services:
       mssql:
diff --git a/.github/workflows/ci-mysql.yml b/.github/workflows/ci-mysql.yml
index a948a9e4cae..28e33b92e52 100644
--- a/.github/workflows/ci-mysql.yml
+++ b/.github/workflows/ci-mysql.yml
@@ -27,6 +27,7 @@ jobs:
           - 8.0
           - 8.1
           - 8.2
+          - 8.3
 
         mysql:
           - 5.7
diff --git a/.github/workflows/ci-pgsql.yml b/.github/workflows/ci-pgsql.yml
index edaf4a5df5d..e41a01c3f88 100644
--- a/.github/workflows/ci-pgsql.yml
+++ b/.github/workflows/ci-pgsql.yml
@@ -26,6 +26,7 @@ jobs:
           - 7.4
           - 8.0
           - 8.1
+          - 8.3
 
         pgsql:
           - 10
@@ -34,6 +35,7 @@ jobs:
           - 13
           - 14
           - 15
+          - 16
 
     services:
       postgres:
diff --git a/.github/workflows/ci-sqlite.yml b/.github/workflows/ci-sqlite.yml
index b82d187ef9a..07c6057416c 100644
--- a/.github/workflows/ci-sqlite.yml
+++ b/.github/workflows/ci-sqlite.yml
@@ -28,6 +28,7 @@ jobs:
               - 8.0
               - 8.1
               - 8.2
+              - 8.3
 
     steps:
       - name: Checkout.
diff --git a/composer.json b/composer.json
index 8a78d259b26..79c07885295 100644
--- a/composer.json
+++ b/composer.json
@@ -68,7 +68,7 @@
         "yiisoft/yii2": "self.version"
     },
     "require": {
-        "php": ">=5.4.0",
+        "php": ">=7.4.0",
         "ext-mbstring": "*",
         "ext-ctype": "*",
         "lib-pcre": "*",
@@ -78,15 +78,13 @@
         "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable",
         "bower-asset/inputmask": "~3.2.2 | ~3.3.5",
         "bower-asset/punycode": "1.3.*",
-        "bower-asset/yii2-pjax": "~2.0.1",
-        "paragonie/random_compat": ">=1"
+        "bower-asset/yii2-pjax": "~2.0.1"
     },
     "require-dev": {
-        "cweagans/composer-patches": "^1.7",
-        "phpunit/phpunit": "4.8.34",
+        "dms/phpunit-arraysubset-asserts": "^0.5",
+        "phpunit/phpunit": "^9.6.0",
         "cebe/indent": "~1.0.2",
-        "friendsofphp/php-cs-fixer": "~2.2.3 | ^3.0",
-        "johnkary/phpunit-speedtrap": "^1.0"
+        "friendsofphp/php-cs-fixer": "~2.2.3 | ^3.0"
     },
     "repositories": [
         {
@@ -111,7 +109,6 @@
     },
     "config": {
         "allow-plugins": {
-            "cweagans/composer-patches": true,
             "yiisoft/yii2-composer": true
         }
     },
@@ -121,20 +118,6 @@
     "extra": {
         "branch-alias": {
             "dev-master": "2.0.x-dev"
-        },
-        "composer-exit-on-patch-failure": true,
-        "patches": {
-            "phpunit/phpunit-mock-objects": {
-                "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch"
-            },
-            "phpunit/php-file-iterator": {
-                "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_path_file_iterator.patch"
-            },
-            "phpunit/phpunit": {
-                "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch",
-                "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch",
-                "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch"
-            }
         }
     }
 }
diff --git a/composer.lock b/composer.lock
index 9f827e28afb..e2571b4c557 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,14 +4,14 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "fc0abacf592fc59d2c2e99a0a746f7ef",
+    "content-hash": "463e103d1fbcf182a6bb1ce8487cfb88",
     "packages": [
         {
             "name": "bower-asset/inputmask",
             "version": "3.3.11",
             "source": {
                 "type": "git",
-                "url": "git@github.com:RobinHerbots/Inputmask.git",
+                "url": "https://github.com/RobinHerbots/Inputmask.git",
                 "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b"
             },
             "dist": {
@@ -29,16 +29,16 @@
         },
         {
             "name": "bower-asset/jquery",
-            "version": "3.6.3",
+            "version": "3.7.1",
             "source": {
                 "type": "git",
-                "url": "git@github.com:jquery/jquery-dist.git",
-                "reference": "da0f228131a578aea168b799fe4d7fe01764c98b"
+                "url": "https://github.com/jquery/jquery-dist.git",
+                "reference": "fde1f76e2799dd877c176abde0ec836553246991"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/da0f228131a578aea168b799fe4d7fe01764c98b",
-                "reference": "da0f228131a578aea168b799fe4d7fe01764c98b"
+                "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/fde1f76e2799dd877c176abde0ec836553246991",
+                "reference": "fde1f76e2799dd877c176abde0ec836553246991"
             },
             "type": "bower-asset",
             "license": [
@@ -50,12 +50,12 @@
             "version": "v1.3.2",
             "source": {
                 "type": "git",
-                "url": "git@github.com:bestiejs/punycode.js.git",
+                "url": "https://github.com/mathiasbynens/punycode.js.git",
                 "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3",
+                "url": "https://api.github.com/repos/mathiasbynens/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3",
                 "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3"
             },
             "type": "bower-asset"
@@ -206,56 +206,6 @@
             },
             "time": "2022-09-18T07:06:19+00:00"
         },
-        {
-            "name": "paragonie/random_compat",
-            "version": "v9.99.100",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/paragonie/random_compat.git",
-                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
-                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">= 7"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "4.*|5.*",
-                "vimeo/psalm": "^1"
-            },
-            "suggest": {
-                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
-            },
-            "type": "library",
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Paragon Initiative Enterprises",
-                    "email": "security@paragonie.com",
-                    "homepage": "https://paragonie.com"
-                }
-            ],
-            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
-            "keywords": [
-                "csprng",
-                "polyfill",
-                "pseudorandom",
-                "random"
-            ],
-            "support": {
-                "email": "info@paragonie.com",
-                "issues": "https://github.com/paragonie/random_compat/issues",
-                "source": "https://github.com/paragonie/random_compat"
-            },
-            "time": "2020-10-15T08:29:30+00:00"
-        },
         {
             "name": "yiisoft/yii2-composer",
             "version": "2.0.10",
@@ -444,16 +394,16 @@
         },
         {
             "name": "composer/semver",
-            "version": "3.3.2",
+            "version": "3.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/semver.git",
-                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
-                "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+                "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
+                "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
                 "shasum": ""
             },
             "require": {
@@ -503,9 +453,9 @@
                 "versioning"
             ],
             "support": {
-                "irc": "irc://irc.freenode.org/composer",
+                "irc": "ircs://irc.libera.chat:6697/composer",
                 "issues": "https://github.com/composer/semver/issues",
-                "source": "https://github.com/composer/semver/tree/3.3.2"
+                "source": "https://github.com/composer/semver/tree/3.4.0"
             },
             "funding": [
                 {
@@ -521,7 +471,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-04-01T19:23:25+00:00"
+            "time": "2023-08-31T09:50:34+00:00"
         },
         {
             "name": "composer/xdebug-handler",
@@ -590,89 +540,31 @@
             "time": "2022-02-25T21:32:43+00:00"
         },
         {
-            "name": "cweagans/composer-patches",
-            "version": "1.7.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/cweagans/composer-patches.git",
-                "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
-                "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
-                "shasum": ""
-            },
-            "require": {
-                "composer-plugin-api": "^1.0 || ^2.0",
-                "php": ">=5.3.0"
-            },
-            "require-dev": {
-                "composer/composer": "~1.0 || ~2.0",
-                "phpunit/phpunit": "~4.6"
-            },
-            "type": "composer-plugin",
-            "extra": {
-                "class": "cweagans\\Composer\\Patches"
-            },
-            "autoload": {
-                "psr-4": {
-                    "cweagans\\Composer\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Cameron Eagans",
-                    "email": "me@cweagans.net"
-                }
-            ],
-            "description": "Provides a way to patch Composer packages.",
-            "support": {
-                "issues": "https://github.com/cweagans/composer-patches/issues",
-                "source": "https://github.com/cweagans/composer-patches/tree/1.7.3"
-            },
-            "time": "2022-12-20T22:53:13+00:00"
-        },
-        {
-            "name": "doctrine/annotations",
-            "version": "1.14.2",
+            "name": "dms/phpunit-arraysubset-asserts",
+            "version": "v0.5.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/doctrine/annotations.git",
-                "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b"
+                "url": "https://github.com/rdohms/phpunit-arraysubset-asserts.git",
+                "reference": "aa6b9e858414e91cca361cac3b2035ee57d212e0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/annotations/zipball/ad785217c1e9555a7d6c6c8c9f406395a5e2882b",
-                "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b",
+                "url": "https://api.github.com/repos/rdohms/phpunit-arraysubset-asserts/zipball/aa6b9e858414e91cca361cac3b2035ee57d212e0",
+                "reference": "aa6b9e858414e91cca361cac3b2035ee57d212e0",
                 "shasum": ""
             },
             "require": {
-                "doctrine/lexer": "^1 || ^2",
-                "ext-tokenizer": "*",
-                "php": "^7.1 || ^8.0",
-                "psr/cache": "^1 || ^2 || ^3"
+                "php": "^5.4 || ^7.0 || ^8.0",
+                "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0"
             },
             "require-dev": {
-                "doctrine/cache": "^1.11 || ^2.0",
-                "doctrine/coding-standard": "^9 || ^10",
-                "phpstan/phpstan": "~1.4.10 || ^1.8.0",
-                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "symfony/cache": "^4.4 || ^5.4 || ^6",
-                "vimeo/psalm": "^4.10"
-            },
-            "suggest": {
-                "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+                "dms/coding-standard": "^9"
             },
             "type": "library",
             "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
-                }
+                "files": [
+                    "assertarraysubset-autoload.php"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -680,108 +572,43 @@
             ],
             "authors": [
                 {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Benjamin Eberlei",
-                    "email": "kontakt@beberlei.de"
-                },
-                {
-                    "name": "Jonathan Wage",
-                    "email": "jonwage@gmail.com"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "Docblock Annotations Parser",
-            "homepage": "https://www.doctrine-project.org/projects/annotations.html",
-            "keywords": [
-                "annotations",
-                "docblock",
-                "parser"
-            ],
-            "support": {
-                "issues": "https://github.com/doctrine/annotations/issues",
-                "source": "https://github.com/doctrine/annotations/tree/1.14.2"
-            },
-            "time": "2022-12-15T06:48:22+00:00"
-        },
-        {
-            "name": "doctrine/deprecations",
-            "version": "v1.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/deprecations.git",
-                "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
-                "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1|^8.0"
-            },
-            "require-dev": {
-                "doctrine/coding-standard": "^9",
-                "phpunit/phpunit": "^7.5|^8.5|^9.5",
-                "psr/log": "^1|^2|^3"
-            },
-            "suggest": {
-                "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+                    "name": "Rafael Dohms",
+                    "email": "rdohms@gmail.com"
                 }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
             ],
-            "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
-            "homepage": "https://www.doctrine-project.org/",
+            "description": "This package provides ArraySubset and related asserts once deprecated in PHPUnit 8",
             "support": {
-                "issues": "https://github.com/doctrine/deprecations/issues",
-                "source": "https://github.com/doctrine/deprecations/tree/v1.0.0"
+                "issues": "https://github.com/rdohms/phpunit-arraysubset-asserts/issues",
+                "source": "https://github.com/rdohms/phpunit-arraysubset-asserts/tree/v0.5.0"
             },
-            "time": "2022-05-02T15:47:09+00:00"
+            "time": "2023-06-02T17:33:53+00:00"
         },
         {
             "name": "doctrine/instantiator",
-            "version": "1.5.0",
+            "version": "2.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/instantiator.git",
-                "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
+                "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
-                "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+                "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1 || ^8.0"
+                "php": "^8.1"
             },
             "require-dev": {
-                "doctrine/coding-standard": "^9 || ^11",
+                "doctrine/coding-standard": "^11",
                 "ext-pdo": "*",
                 "ext-phar": "*",
-                "phpbench/phpbench": "^0.16 || ^1",
-                "phpstan/phpstan": "^1.4",
-                "phpstan/phpstan-phpunit": "^1",
-                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "vimeo/psalm": "^4.30 || ^5.4"
+                "phpbench/phpbench": "^1.2",
+                "phpstan/phpstan": "^1.9.4",
+                "phpstan/phpstan-phpunit": "^1.3",
+                "phpunit/phpunit": "^9.5.27",
+                "vimeo/psalm": "^5.4"
             },
             "type": "library",
             "autoload": {
@@ -808,7 +635,7 @@
             ],
             "support": {
                 "issues": "https://github.com/doctrine/instantiator/issues",
-                "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+                "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
             },
             "funding": [
                 {
@@ -824,133 +651,55 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-12-30T00:15:36+00:00"
-        },
-        {
-            "name": "doctrine/lexer",
-            "version": "2.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/lexer.git",
-                "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
-                "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/deprecations": "^1.0",
-                "php": "^7.1 || ^8.0"
-            },
-            "require-dev": {
-                "doctrine/coding-standard": "^9 || ^10",
-                "phpstan/phpstan": "^1.3",
-                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "psalm/plugin-phpunit": "^0.18.3",
-                "vimeo/psalm": "^4.11 || ^5.0"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Common\\Lexer\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Guilherme Blanco",
-                    "email": "guilhermeblanco@gmail.com"
-                },
-                {
-                    "name": "Roman Borschel",
-                    "email": "roman@code-factory.org"
-                },
-                {
-                    "name": "Johannes Schmitt",
-                    "email": "schmittjoh@gmail.com"
-                }
-            ],
-            "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
-            "homepage": "https://www.doctrine-project.org/projects/lexer.html",
-            "keywords": [
-                "annotations",
-                "docblock",
-                "lexer",
-                "parser",
-                "php"
-            ],
-            "support": {
-                "issues": "https://github.com/doctrine/lexer/issues",
-                "source": "https://github.com/doctrine/lexer/tree/2.1.0"
-            },
-            "funding": [
-                {
-                    "url": "https://www.doctrine-project.org/sponsorship.html",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://www.patreon.com/phpdoctrine",
-                    "type": "patreon"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2022-12-14T08:49:07+00:00"
+            "time": "2022-12-30T00:23:10+00:00"
         },
         {
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v3.9.5",
+            "version": "v3.27.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
-                "reference": "4465d70ba776806857a1ac2a6f877e582445ff36"
+                "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+                "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/4465d70ba776806857a1ac2a6f877e582445ff36",
-                "reference": "4465d70ba776806857a1ac2a6f877e582445ff36",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/e73ccaae1208f017bb7860986eebb3da48bd25d6",
+                "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6",
                 "shasum": ""
             },
             "require": {
-                "composer/semver": "^3.2",
+                "composer/semver": "^3.3",
                 "composer/xdebug-handler": "^3.0.3",
-                "doctrine/annotations": "^1.13",
                 "ext-json": "*",
                 "ext-tokenizer": "*",
                 "php": "^7.4 || ^8.0",
-                "php-cs-fixer/diff": "^2.0",
+                "sebastian/diff": "^4.0 || ^5.0",
                 "symfony/console": "^5.4 || ^6.0",
                 "symfony/event-dispatcher": "^5.4 || ^6.0",
                 "symfony/filesystem": "^5.4 || ^6.0",
                 "symfony/finder": "^5.4 || ^6.0",
                 "symfony/options-resolver": "^5.4 || ^6.0",
-                "symfony/polyfill-mbstring": "^1.23",
-                "symfony/polyfill-php80": "^1.25",
-                "symfony/polyfill-php81": "^1.25",
+                "symfony/polyfill-mbstring": "^1.27",
+                "symfony/polyfill-php80": "^1.27",
+                "symfony/polyfill-php81": "^1.27",
                 "symfony/process": "^5.4 || ^6.0",
                 "symfony/stopwatch": "^5.4 || ^6.0"
             },
             "require-dev": {
+                "facile-it/paraunit": "^1.3 || ^2.0",
                 "justinrainbow/json-schema": "^5.2",
-                "keradus/cli-executor": "^1.5",
-                "mikey179/vfsstream": "^1.6.10",
-                "php-coveralls/php-coveralls": "^2.5.2",
+                "keradus/cli-executor": "^2.0",
+                "mikey179/vfsstream": "^1.6.11",
+                "php-coveralls/php-coveralls": "^2.5.3",
                 "php-cs-fixer/accessible-object": "^1.1",
                 "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
                 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
-                "phpspec/prophecy": "^1.15",
+                "phpspec/prophecy": "^1.16",
                 "phpspec/prophecy-phpunit": "^2.0",
                 "phpunit/phpunit": "^9.5",
-                "phpunitgoodpractices/polyfill": "^1.5",
-                "phpunitgoodpractices/traits": "^1.9.1",
-                "symfony/phpunit-bridge": "^6.0",
+                "phpunitgoodpractices/polyfill": "^1.6",
+                "phpunitgoodpractices/traits": "^1.9.2",
+                "symfony/phpunit-bridge": "^6.2.3",
                 "symfony/yaml": "^5.4 || ^6.0"
             },
             "suggest": {
@@ -981,9 +730,15 @@
                 }
             ],
             "description": "A tool to automatically fix PHP code style",
+            "keywords": [
+                "Static code analysis",
+                "fixer",
+                "standards",
+                "static analysis"
+            ],
             "support": {
-                "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues",
-                "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.9.5"
+                "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.27.0"
             },
             "funding": [
                 {
@@ -991,86 +746,102 @@
                     "type": "github"
                 }
             ],
-            "time": "2022-07-22T08:43:51+00:00"
+            "time": "2023-09-17T14:37:54+00:00"
         },
         {
-            "name": "johnkary/phpunit-speedtrap",
-            "version": "v1.1.0",
+            "name": "myclabs/deep-copy",
+            "version": "1.11.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/johnkary/phpunit-speedtrap.git",
-                "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361"
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/johnkary/phpunit-speedtrap/zipball/f7cfe17c5a7076ed0ccca5450fe3bb981ec56361",
-                "reference": "f7cfe17c5a7076ed0ccca5450fe3bb981ec56361",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+                "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6",
-                "phpunit/phpunit": ">=4.7,<6.0"
+                "php": "^7.1 || ^8.0"
             },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.1-dev"
-                }
+            "conflict": {
+                "doctrine/collections": "<1.6.8",
+                "doctrine/common": "<2.13.3 || >=3,<3.2.2"
             },
+            "require-dev": {
+                "doctrine/collections": "^1.6.8",
+                "doctrine/common": "^2.13.3 || ^3.2.2",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+            },
+            "type": "library",
             "autoload": {
-                "psr-0": {
-                    "JohnKary": "src/"
+                "files": [
+                    "src/DeepCopy/deep_copy.php"
+                ],
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
                 "MIT"
             ],
-            "authors": [
-                {
-                    "name": "John Kary",
-                    "email": "john@johnkary.net"
-                }
-            ],
-            "description": "Find slow tests in your PHPUnit test suite",
-            "homepage": "https://github.com/johnkary/phpunit-speedtrap",
+            "description": "Create deep copies (clones) of your objects",
             "keywords": [
-                "phpunit",
-                "profile",
-                "slow"
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
             ],
             "support": {
-                "issues": "https://github.com/johnkary/phpunit-speedtrap/issues",
-                "source": "https://github.com/johnkary/phpunit-speedtrap/tree/1.1"
+                "issues": "https://github.com/myclabs/DeepCopy/issues",
+                "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
             },
-            "time": "2017-03-25T17:14:26+00:00"
+            "funding": [
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-03-08T13:26:56+00:00"
         },
         {
-            "name": "php-cs-fixer/diff",
-            "version": "v2.0.2",
+            "name": "nikic/php-parser",
+            "version": "v4.17.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/PHP-CS-Fixer/diff.git",
-                "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3"
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/29dc0d507e838c4580d018bd8b5cb412474f7ec3",
-                "reference": "29dc0d507e838c4580d018bd8b5cb412474f7ec3",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+                "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0 || ^8.0"
+                "ext-tokenizer": "*",
+                "php": ">=7.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0",
-                "symfony/process": "^3.3"
+                "ircmaxell/php-yacc": "^0.0.7",
+                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
             },
+            "bin": [
+                "bin/php-parse"
+            ],
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.9-dev"
+                }
+            },
             "autoload": {
-                "classmap": [
-                    "src/"
-                ]
+                "psr-4": {
+                    "PhpParser\\": "lib/PhpParser"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -1078,49 +849,40 @@
             ],
             "authors": [
                 {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                },
-                {
-                    "name": "Kore Nordmann",
-                    "email": "mail@kore-nordmann.de"
+                    "name": "Nikita Popov"
                 }
             ],
-            "description": "sebastian/diff v3 backport support for PHP 5.6+",
-            "homepage": "https://github.com/PHP-CS-Fixer",
+            "description": "A PHP parser written in PHP",
             "keywords": [
-                "diff"
+                "parser",
+                "php"
             ],
             "support": {
-                "issues": "https://github.com/PHP-CS-Fixer/diff/issues",
-                "source": "https://github.com/PHP-CS-Fixer/diff/tree/v2.0.2"
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
             },
-            "abandoned": true,
-            "time": "2020-10-14T08:32:19+00:00"
+            "time": "2023-08-13T19:53:39+00:00"
         },
         {
-            "name": "phpdocumentor/reflection-docblock",
-            "version": "2.0.5",
+            "name": "phar-io/manifest",
+            "version": "2.0.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
-                "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b"
+                "url": "https://github.com/phar-io/manifest.git",
+                "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b",
-                "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b",
+                "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+                "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.0"
-            },
-            "suggest": {
-                "dflydev/markdown": "~1.0",
-                "erusev/parsedown": "~1.0"
+                "ext-dom": "*",
+                "ext-phar": "*",
+                "ext-xmlwriter": "*",
+                "phar-io/version": "^3.0.1",
+                "php": "^7.2 || ^8.0"
             },
             "type": "library",
             "extra": {
@@ -1129,127 +891,129 @@
                 }
             },
             "autoload": {
-                "psr-0": {
-                    "phpDocumentor": [
-                        "src/"
-                    ]
-                }
+                "classmap": [
+                    "src/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "Mike van Riel",
-                    "email": "mike.vanriel@naenius.com"
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
                 }
             ],
+            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
             "support": {
-                "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
-                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/2.x"
+                "issues": "https://github.com/phar-io/manifest/issues",
+                "source": "https://github.com/phar-io/manifest/tree/2.0.3"
             },
-            "time": "2016-01-25T08:17:30+00:00"
+            "time": "2021-07-20T11:28:43+00:00"
         },
         {
-            "name": "phpspec/prophecy",
-            "version": "v1.5.0",
+            "name": "phar-io/version",
+            "version": "3.2.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7"
+                "url": "https://github.com/phar-io/version.git",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7",
-                "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7",
+                "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
                 "shasum": ""
             },
             "require": {
-                "doctrine/instantiator": "^1.0.2",
-                "phpdocumentor/reflection-docblock": "~2.0",
-                "sebastian/comparator": "~1.1"
-            },
-            "require-dev": {
-                "phpspec/phpspec": "~2.0"
+                "php": "^7.2 || ^8.0"
             },
             "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4.x-dev"
-                }
-            },
             "autoload": {
-                "psr-0": {
-                    "Prophecy\\": "src/"
-                }
+                "classmap": [
+                    "src/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "Konstantin Kudryashov",
-                    "email": "ever.zet@gmail.com",
-                    "homepage": "http://everzet.com"
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
                 },
                 {
-                    "name": "Marcello Duarte",
-                    "email": "marcello.duarte@gmail.com"
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
                 }
             ],
-            "description": "Highly opinionated mocking framework for PHP 5.3+",
-            "homepage": "https://github.com/phpspec/prophecy",
-            "keywords": [
-                "Double",
-                "Dummy",
-                "fake",
-                "mock",
-                "spy",
-                "stub"
-            ],
+            "description": "Library for handling version information and constraints",
             "support": {
-                "issues": "https://github.com/phpspec/prophecy/issues",
-                "source": "https://github.com/phpspec/prophecy/tree/master"
+                "issues": "https://github.com/phar-io/version/issues",
+                "source": "https://github.com/phar-io/version/tree/3.2.1"
             },
-            "time": "2015-08-13T10:07:40+00:00"
+            "time": "2022-02-21T01:04:05+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "2.2.4",
+            "version": "9.2.29",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
-                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76",
+                "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "phpunit/php-file-iterator": "~1.3",
-                "phpunit/php-text-template": "~1.2",
-                "phpunit/php-token-stream": "~1.3",
-                "sebastian/environment": "^1.3.2",
-                "sebastian/version": "~1.0"
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "ext-xmlwriter": "*",
+                "nikic/php-parser": "^4.15",
+                "php": ">=7.3",
+                "phpunit/php-file-iterator": "^3.0.3",
+                "phpunit/php-text-template": "^2.0.2",
+                "sebastian/code-unit-reverse-lookup": "^2.0.2",
+                "sebastian/complexity": "^2.0",
+                "sebastian/environment": "^5.1.2",
+                "sebastian/lines-of-code": "^1.0.3",
+                "sebastian/version": "^3.0.1",
+                "theseer/tokenizer": "^1.2.0"
             },
             "require-dev": {
-                "ext-xdebug": ">=2.1.4",
-                "phpunit/phpunit": "~4"
+                "phpunit/phpunit": "^9.3"
             },
             "suggest": {
-                "ext-dom": "*",
-                "ext-xdebug": ">=2.2.1",
-                "ext-xmlwriter": "*"
+                "ext-pcov": "PHP extension that provides line coverage",
+                "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.2.x-dev"
+                    "dev-master": "9.2-dev"
                 }
             },
             "autoload": {
@@ -1264,7 +1028,7 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
@@ -1276,33 +1040,42 @@
                 "xunit"
             ],
             "support": {
-                "irc": "irc://irc.freenode.net/phpunit",
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/2.2"
+                "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29"
             },
-            "time": "2015-10-06T15:47:00+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-09-19T04:57:46+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "1.4.5",
+            "version": "3.0.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+                "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
-                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+                "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.4.x-dev"
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -1317,7 +1090,7 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
@@ -1328,30 +1101,47 @@
                 "iterator"
             ],
             "support": {
-                "irc": "irc://irc.freenode.net/phpunit",
                 "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
-                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5"
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
             },
-            "time": "2017-11-27T13:52:08+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-12-02T12:48:52+00:00"
         },
         {
-            "name": "phpunit/php-text-template",
-            "version": "1.2.1",
+            "name": "phpunit/php-invoker",
+            "version": "3.1.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-text-template.git",
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+                "url": "https://github.com/sebastianbergmann/php-invoker.git",
+                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "ext-pcntl": "*",
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-pcntl": "*"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                }
+            },
             "autoload": {
                 "classmap": [
                     "src/"
@@ -1368,38 +1158,49 @@
                     "role": "lead"
                 }
             ],
-            "description": "Simple template engine.",
-            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "description": "Invoke callables with a timeout",
+            "homepage": "https://github.com/sebastianbergmann/php-invoker/",
             "keywords": [
-                "template"
+                "process"
             ],
             "support": {
-                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
-                "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+                "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
             },
-            "time": "2015-06-21T13:50:34+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:58:55+00:00"
         },
         {
-            "name": "phpunit/php-timer",
-            "version": "1.0.8",
+            "name": "phpunit/php-text-template",
+            "version": "2.0.4",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-timer.git",
-                "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
-                "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4|~5"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
             "autoload": {
                 "classmap": [
                     "src/"
@@ -1412,47 +1213,51 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
+                    "email": "sebastian@phpunit.de",
                     "role": "lead"
                 }
             ],
-            "description": "Utility class for timing",
-            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
             "keywords": [
-                "timer"
+                "template"
             ],
             "support": {
-                "irc": "irc://irc.freenode.net/phpunit",
-                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
-                "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
             },
-            "time": "2016-05-12T18:03:57+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T05:33:50+00:00"
         },
         {
-            "name": "phpunit/php-token-stream",
-            "version": "1.4.12",
+            "name": "phpunit/php-timer",
+            "version": "5.0.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16"
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16",
-                "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
                 "shasum": ""
             },
             "require": {
-                "ext-tokenizer": "*",
-                "php": ">=5.3.3"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.2"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.4-dev"
+                    "dev-master": "5.0-dev"
                 }
             },
             "autoload": {
@@ -1467,58 +1272,73 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
                 }
             ],
-            "description": "Wrapper around PHP's tokenizer extension.",
-            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
             "keywords": [
-                "tokenizer"
+                "timer"
             ],
             "support": {
-                "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
-                "source": "https://github.com/sebastianbergmann/php-token-stream/tree/1.4"
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
             },
-            "abandoned": true,
-            "time": "2017-12-04T08:55:13+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:16:10+00:00"
         },
         {
             "name": "phpunit/phpunit",
-            "version": "4.8.34",
+            "version": "9.6.13",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "7eb45205d27edd94bd2b3614085ea158bd1e2bca"
+                "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7eb45205d27edd94bd2b3614085ea158bd1e2bca",
-                "reference": "7eb45205d27edd94bd2b3614085ea158bd1e2bca",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be",
+                "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be",
                 "shasum": ""
             },
             "require": {
+                "doctrine/instantiator": "^1.3.1 || ^2",
                 "ext-dom": "*",
                 "ext-json": "*",
-                "ext-pcre": "*",
-                "ext-reflection": "*",
-                "ext-spl": "*",
-                "php": ">=5.3.3",
-                "phpspec/prophecy": "^1.3.1",
-                "phpunit/php-code-coverage": "~2.1",
-                "phpunit/php-file-iterator": "~1.4",
-                "phpunit/php-text-template": "~1.2",
-                "phpunit/php-timer": "^1.0.6",
-                "phpunit/phpunit-mock-objects": "~2.3",
-                "sebastian/comparator": "~1.2.2",
-                "sebastian/diff": "~1.2",
-                "sebastian/environment": "~1.3",
-                "sebastian/exporter": "~1.2",
-                "sebastian/global-state": "~1.0",
-                "sebastian/version": "~1.0",
-                "symfony/yaml": "~2.1|~3.0"
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "ext-xmlwriter": "*",
+                "myclabs/deep-copy": "^1.10.1",
+                "phar-io/manifest": "^2.0.3",
+                "phar-io/version": "^3.0.2",
+                "php": ">=7.3",
+                "phpunit/php-code-coverage": "^9.2.28",
+                "phpunit/php-file-iterator": "^3.0.5",
+                "phpunit/php-invoker": "^3.1.1",
+                "phpunit/php-text-template": "^2.0.3",
+                "phpunit/php-timer": "^5.0.2",
+                "sebastian/cli-parser": "^1.0.1",
+                "sebastian/code-unit": "^1.0.6",
+                "sebastian/comparator": "^4.0.8",
+                "sebastian/diff": "^4.0.3",
+                "sebastian/environment": "^5.1.3",
+                "sebastian/exporter": "^4.0.5",
+                "sebastian/global-state": "^5.0.1",
+                "sebastian/object-enumerator": "^4.0.3",
+                "sebastian/resource-operations": "^3.0.3",
+                "sebastian/type": "^3.2",
+                "sebastian/version": "^3.0.2"
             },
             "suggest": {
-                "phpunit/php-invoker": "~1.1"
+                "ext-soap": "To be able to generate mocks based on WSDL files",
+                "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
             },
             "bin": [
                 "phpunit"
@@ -1526,10 +1346,13 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.8.x-dev"
+                    "dev-master": "9.6-dev"
                 }
             },
             "autoload": {
+                "files": [
+                    "src/Framework/Assert/Functions.php"
+                ],
                 "classmap": [
                     "src/"
                 ]
@@ -1554,88 +1377,94 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/4.8.34"
+                "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13"
             },
-            "time": "2017-01-26T16:15:36+00:00"
+            "funding": [
+                {
+                    "url": "https://phpunit.de/sponsors.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-09-19T05:39:22+00:00"
         },
         {
-            "name": "phpunit/phpunit-mock-objects",
-            "version": "2.3.8",
+            "name": "psr/container",
+            "version": "2.0.2",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
-                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
-                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
                 "shasum": ""
             },
             "require": {
-                "doctrine/instantiator": "^1.0.2",
-                "php": ">=5.3.3",
-                "phpunit/php-text-template": "~1.2",
-                "sebastian/exporter": "~1.2"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4.4"
-            },
-            "suggest": {
-                "ext-soap": "*"
+                "php": ">=7.4.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.3.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
-                "classmap": [
-                    "src/"
-                ]
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "BSD-3-Clause"
+                "MIT"
             ],
             "authors": [
                 {
-                    "name": "Sebastian Bergmann",
-                    "email": "sb@sebastian-bergmann.de",
-                    "role": "lead"
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
                 }
             ],
-            "description": "Mock Object library for PHPUnit",
-            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
             "keywords": [
-                "mock",
-                "xunit"
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
             ],
             "support": {
-                "irc": "irc://irc.freenode.net/phpunit",
-                "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues",
-                "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/2.3"
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/2.0.2"
             },
-            "abandoned": true,
-            "time": "2015-10-02T06:51:40+00:00"
+            "time": "2021-11-05T16:47:00+00:00"
         },
         {
-            "name": "psr/cache",
-            "version": "3.0.0",
+            "name": "psr/event-dispatcher",
+            "version": "1.0.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/php-fig/cache.git",
-                "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+                "url": "https://github.com/php-fig/event-dispatcher.git",
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
-                "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+                "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
                 "shasum": ""
             },
             "require": {
-                "php": ">=8.0.0"
+                "php": ">=7.2.0"
             },
             "type": "library",
             "extra": {
@@ -1645,7 +1474,7 @@
             },
             "autoload": {
                 "psr-4": {
-                    "Psr\\Cache\\": "src/"
+                    "Psr\\EventDispatcher\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -1655,46 +1484,47 @@
             "authors": [
                 {
                     "name": "PHP-FIG",
-                    "homepage": "https://www.php-fig.org/"
+                    "homepage": "http://www.php-fig.org/"
                 }
             ],
-            "description": "Common interface for caching libraries",
+            "description": "Standard interfaces for event handling.",
             "keywords": [
-                "cache",
+                "events",
                 "psr",
-                "psr-6"
+                "psr-14"
             ],
             "support": {
-                "source": "https://github.com/php-fig/cache/tree/3.0.0"
+                "issues": "https://github.com/php-fig/event-dispatcher/issues",
+                "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
             },
-            "time": "2021-02-03T23:26:27+00:00"
+            "time": "2019-01-08T18:20:26+00:00"
         },
         {
-            "name": "psr/container",
-            "version": "2.0.2",
+            "name": "psr/log",
+            "version": "3.0.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/php-fig/container.git",
-                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
-                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
+                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
                 "shasum": ""
             },
             "require": {
-                "php": ">=7.4.0"
+                "php": ">=8.0.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "3.x-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Psr\\Container\\": "src/"
+                    "Psr\\Log\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -1707,147 +1537,611 @@
                     "homepage": "https://www.php-fig.org/"
                 }
             ],
-            "description": "Common Container Interface (PHP FIG PSR-11)",
-            "homepage": "https://github.com/php-fig/container",
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
             "keywords": [
-                "PSR-11",
-                "container",
-                "container-interface",
-                "container-interop",
-                "psr"
+                "log",
+                "psr",
+                "psr-3"
             ],
             "support": {
-                "issues": "https://github.com/php-fig/container/issues",
-                "source": "https://github.com/php-fig/container/tree/2.0.2"
+                "source": "https://github.com/php-fig/log/tree/3.0.0"
             },
-            "time": "2021-11-05T16:47:00+00:00"
+            "time": "2021-07-14T16:46:02+00:00"
         },
         {
-            "name": "psr/event-dispatcher",
-            "version": "1.0.0",
+            "name": "sebastian/cli-parser",
+            "version": "1.0.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/php-fig/event-dispatcher.git",
-                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+                "url": "https://github.com/sebastianbergmann/cli-parser.git",
+                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
-                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
                 "shasum": ""
             },
             "require": {
-                "php": ">=7.2.0"
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "1.0-dev"
                 }
             },
             "autoload": {
-                "psr-4": {
-                    "Psr\\EventDispatcher\\": "src/"
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for parsing CLI options",
+            "homepage": "https://github.com/sebastianbergmann/cli-parser",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+                "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
                 }
+            ],
+            "time": "2020-09-28T06:08:49+00:00"
+        },
+        {
+            "name": "sebastian/code-unit",
+            "version": "1.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit.git",
+                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/code-unit",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:08:54+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "2.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:30:19+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "4.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+                "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3",
+                "sebastian/diff": "^4.0",
+                "sebastian/exporter": "^4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "https://github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/comparator/issues",
+                "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-09-14T12:41:17+00:00"
+        },
+        {
+            "name": "sebastian/complexity",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/complexity.git",
+                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.7",
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for calculating the complexity of PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/complexity",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/complexity/issues",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T15:52:27+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "4.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+                "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3",
+                "symfony/process": "^4.2 || ^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "https://github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff",
+                "udiff",
+                "unidiff",
+                "unified diff"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/diff/issues",
+                "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-05-07T05:35:17+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "5.1.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+                "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-posix": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/environment/issues",
+                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:03:51+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "4.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+                "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3",
+                "sebastian/recursion-context": "^4.0"
+            },
+            "require-dev": {
+                "ext-mbstring": "*",
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
                 }
             ],
-            "description": "Standard interfaces for event handling.",
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "https://www.github.com/sebastianbergmann/exporter",
             "keywords": [
-                "events",
-                "psr",
-                "psr-14"
+                "export",
+                "exporter"
             ],
             "support": {
-                "issues": "https://github.com/php-fig/event-dispatcher/issues",
-                "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+                "issues": "https://github.com/sebastianbergmann/exporter/issues",
+                "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
             },
-            "time": "2019-01-08T18:20:26+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-09-14T06:03:37+00:00"
         },
         {
-            "name": "psr/log",
-            "version": "3.0.0",
+            "name": "sebastian/global-state",
+            "version": "5.0.6",
             "source": {
                 "type": "git",
-                "url": "https://github.com/php-fig/log.git",
-                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "bde739e7565280bda77be70044ac1047bc007e34"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
-                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34",
+                "reference": "bde739e7565280bda77be70044ac1047bc007e34",
                 "shasum": ""
             },
             "require": {
-                "php": ">=8.0.0"
+                "php": ">=7.3",
+                "sebastian/object-reflector": "^2.0",
+                "sebastian/recursion-context": "^4.0"
+            },
+            "require-dev": {
+                "ext-dom": "*",
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-uopz": "*"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.x-dev"
+                    "dev-master": "5.0-dev"
                 }
             },
             "autoload": {
-                "psr-4": {
-                    "Psr\\Log\\": "src"
-                }
+                "classmap": [
+                    "src/"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "PHP-FIG",
-                    "homepage": "https://www.php-fig.org/"
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
                 }
             ],
-            "description": "Common interface for logging libraries",
-            "homepage": "https://github.com/php-fig/log",
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
             "keywords": [
-                "log",
-                "psr",
-                "psr-3"
+                "global state"
             ],
             "support": {
-                "source": "https://github.com/php-fig/log/tree/3.0.0"
+                "issues": "https://github.com/sebastianbergmann/global-state/issues",
+                "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6"
             },
-            "time": "2021-07-14T16:46:02+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-08-02T09:26:13+00:00"
         },
         {
-            "name": "sebastian/comparator",
-            "version": "1.2.4",
+            "name": "sebastian/lines-of-code",
+            "version": "1.0.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/comparator.git",
-                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+                "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
-                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "sebastian/diff": "~1.2",
-                "sebastian/exporter": "~1.2 || ~2.0"
+                "nikic/php-parser": "^4.6",
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.2.x-dev"
+                    "dev-master": "1.0-dev"
                 }
             },
             "autoload": {
@@ -1860,60 +2154,52 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
-                {
-                    "name": "Volker Dusch",
-                    "email": "github@wallbash.com"
-                },
-                {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@2bepublished.at"
-                },
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
                 }
             ],
-            "description": "Provides the functionality to compare PHP values for equality",
-            "homepage": "http://www.github.com/sebastianbergmann/comparator",
-            "keywords": [
-                "comparator",
-                "compare",
-                "equality"
-            ],
+            "description": "Library for counting the lines of code in PHP source code",
+            "homepage": "https://github.com/sebastianbergmann/lines-of-code",
             "support": {
-                "issues": "https://github.com/sebastianbergmann/comparator/issues",
-                "source": "https://github.com/sebastianbergmann/comparator/tree/1.2"
+                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
             },
-            "time": "2017-01-29T09:50:25+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-28T06:42:11+00:00"
         },
         {
-            "name": "sebastian/diff",
-            "version": "1.4.1",
+            "name": "sebastian/object-enumerator",
+            "version": "4.0.4",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
-                "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3",
+                "sebastian/object-reflector": "^2.0",
+                "sebastian/recursion-context": "^4.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.8"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.4-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -1926,50 +2212,49 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Kore Nordmann",
-                    "email": "mail@kore-nordmann.de"
-                },
                 {
                     "name": "Sebastian Bergmann",
                     "email": "sebastian@phpunit.de"
                 }
             ],
-            "description": "Diff implementation",
-            "homepage": "https://github.com/sebastianbergmann/diff",
-            "keywords": [
-                "diff"
-            ],
+            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
             "support": {
-                "issues": "https://github.com/sebastianbergmann/diff/issues",
-                "source": "https://github.com/sebastianbergmann/diff/tree/master"
+                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
             },
-            "time": "2015-12-08T07:14:41+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:12:34+00:00"
         },
         {
-            "name": "sebastian/environment",
-            "version": "1.3.7",
+            "name": "sebastian/object-reflector",
+            "version": "2.0.4",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
+                "url": "https://github.com/sebastianbergmann/object-reflector.git",
+                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
-                "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3.x-dev"
+                    "dev-master": "2.0-dev"
                 }
             },
             "autoload": {
@@ -1987,45 +2272,44 @@
                     "email": "sebastian@phpunit.de"
                 }
             ],
-            "description": "Provides functionality to handle HHVM/PHP environments",
-            "homepage": "http://www.github.com/sebastianbergmann/environment",
-            "keywords": [
-                "Xdebug",
-                "environment",
-                "hhvm"
-            ],
+            "description": "Allows reflection of object attributes, including inherited and non-public ones",
+            "homepage": "https://github.com/sebastianbergmann/object-reflector/",
             "support": {
-                "issues": "https://github.com/sebastianbergmann/environment/issues",
-                "source": "https://github.com/sebastianbergmann/environment/tree/1.3.7"
+                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+                "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
             },
-            "time": "2016-05-17T03:18:57+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:14:26+00:00"
         },
         {
-            "name": "sebastian/exporter",
-            "version": "1.2.2",
+            "name": "sebastian/recursion-context",
+            "version": "4.0.5",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/exporter.git",
-                "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
-                "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+                "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3",
-                "sebastian/recursion-context": "~1.0"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "ext-mbstring": "*",
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.3.x-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -2038,66 +2322,57 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
-                {
-                    "name": "Volker Dusch",
-                    "email": "github@wallbash.com"
-                },
-                {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@2bepublished.at"
-                },
                 {
                     "name": "Sebastian Bergmann",
                     "email": "sebastian@phpunit.de"
                 },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
                 {
                     "name": "Adam Harvey",
                     "email": "aharvey@php.net"
                 }
             ],
-            "description": "Provides the functionality to export PHP variables for visualization",
-            "homepage": "http://www.github.com/sebastianbergmann/exporter",
-            "keywords": [
-                "export",
-                "exporter"
-            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "https://github.com/sebastianbergmann/recursion-context",
             "support": {
-                "issues": "https://github.com/sebastianbergmann/exporter/issues",
-                "source": "https://github.com/sebastianbergmann/exporter/tree/master"
+                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+                "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
             },
-            "time": "2016-06-17T09:04:28+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:07:39+00:00"
         },
         {
-            "name": "sebastian/global-state",
-            "version": "1.1.1",
+            "name": "sebastian/resource-operations",
+            "version": "3.0.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/global-state.git",
-                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+                "url": "https://github.com/sebastianbergmann/resource-operations.git",
+                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
-                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.2"
-            },
-            "suggest": {
-                "ext-uopz": "*"
+                "phpunit/phpunit": "^9.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0-dev"
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -2115,41 +2390,44 @@
                     "email": "sebastian@phpunit.de"
                 }
             ],
-            "description": "Snapshotting of global state",
-            "homepage": "http://www.github.com/sebastianbergmann/global-state",
-            "keywords": [
-                "global state"
-            ],
+            "description": "Provides a list of PHP built-in functions that operate on resources",
+            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
             "support": {
-                "issues": "https://github.com/sebastianbergmann/global-state/issues",
-                "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1"
+                "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+                "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
             },
-            "time": "2015-10-12T03:26:01+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:45:17+00:00"
         },
         {
-            "name": "sebastian/recursion-context",
-            "version": "1.0.5",
+            "name": "sebastian/type",
+            "version": "3.2.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7"
+                "url": "https://github.com/sebastianbergmann/type.git",
+                "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
-                "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
+                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+                "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.4"
+                "phpunit/phpunit": "^9.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "3.2-dev"
                 }
             },
             "autoload": {
@@ -2162,42 +2440,49 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                },
-                {
-                    "name": "Adam Harvey",
-                    "email": "aharvey@php.net"
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
                 }
             ],
-            "description": "Provides functionality to recursively process PHP variables",
-            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+            "description": "Collection of value objects that represent the types of the PHP type system",
+            "homepage": "https://github.com/sebastianbergmann/type",
             "support": {
-                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
-                "source": "https://github.com/sebastianbergmann/recursion-context/tree/master"
+                "issues": "https://github.com/sebastianbergmann/type/issues",
+                "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
             },
-            "time": "2016-10-03T07:41:43+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-02-03T06:13:03+00:00"
         },
         {
             "name": "sebastian/version",
-            "version": "1.0.6",
+            "version": "3.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/version.git",
-                "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+                "reference": "c6c1022351a901512170118436c764e473f6de8c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
-                "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+                "reference": "c6c1022351a901512170118436c764e473f6de8c",
                 "shasum": ""
             },
+            "require": {
+                "php": ">=7.3"
+            },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
             "autoload": {
                 "classmap": [
                     "src/"
@@ -2218,29 +2503,35 @@
             "homepage": "https://github.com/sebastianbergmann/version",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/version/issues",
-                "source": "https://github.com/sebastianbergmann/version/tree/1.0.6"
+                "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
             },
-            "time": "2015-06-21T13:59:46+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:39:44+00:00"
         },
         {
             "name": "symfony/console",
-            "version": "v6.2.3",
+            "version": "v6.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "0f579613e771dba2dbb8211c382342a641f5da06"
+                "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/0f579613e771dba2dbb8211c382342a641f5da06",
-                "reference": "0f579613e771dba2dbb8211c382342a641f5da06",
+                "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6",
+                "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/deprecation-contracts": "^2.5|^3",
                 "symfony/polyfill-mbstring": "~1.0",
-                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/service-contracts": "^2.5|^3",
                 "symfony/string": "^5.4|^6.0"
             },
             "conflict": {
@@ -2262,12 +2553,6 @@
                 "symfony/process": "^5.4|^6.0",
                 "symfony/var-dumper": "^5.4|^6.0"
             },
-            "suggest": {
-                "psr/log": "For using the console logger",
-                "symfony/event-dispatcher": "",
-                "symfony/lock": "",
-                "symfony/process": ""
-            },
             "type": "library",
             "autoload": {
                 "psr-4": {
@@ -2295,12 +2580,12 @@
             "homepage": "https://symfony.com",
             "keywords": [
                 "cli",
-                "command line",
+                "command-line",
                 "console",
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v6.2.3"
+                "source": "https://github.com/symfony/console/tree/v6.3.4"
             },
             "funding": [
                 {
@@ -2316,20 +2601,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-12-28T14:26:22+00:00"
+            "time": "2023-08-16T10:10:12+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
-            "version": "v3.2.0",
+            "version": "v3.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/deprecation-contracts.git",
-                "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3"
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3",
-                "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
                 "shasum": ""
             },
             "require": {
@@ -2338,7 +2623,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.3-dev"
+                    "dev-main": "3.4-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -2367,7 +2652,7 @@
             "description": "A generic function and convention to trigger deprecation notices",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0"
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0"
             },
             "funding": [
                 {
@@ -2383,28 +2668,29 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-25T10:21:52+00:00"
+            "time": "2023-05-23T14:45:45+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v6.2.2",
+            "version": "v6.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1"
+                "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3ffeb31139b49bf6ef0bc09d1db95eac053388d1",
-                "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e",
+                "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/event-dispatcher-contracts": "^2|^3"
+                "symfony/event-dispatcher-contracts": "^2.5|^3"
             },
             "conflict": {
-                "symfony/dependency-injection": "<5.4"
+                "symfony/dependency-injection": "<5.4",
+                "symfony/service-contracts": "<2.5"
             },
             "provide": {
                 "psr/event-dispatcher-implementation": "1.0",
@@ -2417,13 +2703,9 @@
                 "symfony/error-handler": "^5.4|^6.0",
                 "symfony/expression-language": "^5.4|^6.0",
                 "symfony/http-foundation": "^5.4|^6.0",
-                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/service-contracts": "^2.5|^3",
                 "symfony/stopwatch": "^5.4|^6.0"
             },
-            "suggest": {
-                "symfony/dependency-injection": "",
-                "symfony/http-kernel": ""
-            },
             "type": "library",
             "autoload": {
                 "psr-4": {
@@ -2450,7 +2732,7 @@
             "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.2"
+                "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2"
             },
             "funding": [
                 {
@@ -2466,33 +2748,30 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-12-14T16:11:27+00:00"
+            "time": "2023-07-06T06:56:43+00:00"
         },
         {
             "name": "symfony/event-dispatcher-contracts",
-            "version": "v3.2.0",
+            "version": "v3.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher-contracts.git",
-                "reference": "0782b0b52a737a05b4383d0df35a474303cabdae"
+                "reference": "a76aed96a42d2b521153fb382d418e30d18b59df"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae",
-                "reference": "0782b0b52a737a05b4383d0df35a474303cabdae",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df",
+                "reference": "a76aed96a42d2b521153fb382d418e30d18b59df",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
                 "psr/event-dispatcher": "^1"
             },
-            "suggest": {
-                "symfony/event-dispatcher-implementation": ""
-            },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.3-dev"
+                    "dev-main": "3.4-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -2529,7 +2808,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0"
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0"
             },
             "funding": [
                 {
@@ -2545,20 +2824,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-25T10:21:52+00:00"
+            "time": "2023-05-23T14:45:45+00:00"
         },
         {
             "name": "symfony/filesystem",
-            "version": "v6.2.0",
+            "version": "v6.3.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
-                "reference": "50b2523c874605cf3d4acf7a9e2b30b6a440a016"
+                "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/filesystem/zipball/50b2523c874605cf3d4acf7a9e2b30b6a440a016",
-                "reference": "50b2523c874605cf3d4acf7a9e2b30b6a440a016",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae",
+                "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae",
                 "shasum": ""
             },
             "require": {
@@ -2592,7 +2871,7 @@
             "description": "Provides basic utilities for the filesystem",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/filesystem/tree/v6.2.0"
+                "source": "https://github.com/symfony/filesystem/tree/v6.3.1"
             },
             "funding": [
                 {
@@ -2608,20 +2887,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-20T13:01:27+00:00"
+            "time": "2023-06-01T08:30:39+00:00"
         },
         {
             "name": "symfony/finder",
-            "version": "v6.2.3",
+            "version": "v6.3.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e"
+                "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/81eefbddfde282ee33b437ba5e13d7753211ae8e",
-                "reference": "81eefbddfde282ee33b437ba5e13d7753211ae8e",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e",
+                "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e",
                 "shasum": ""
             },
             "require": {
@@ -2656,7 +2935,7 @@
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v6.2.3"
+                "source": "https://github.com/symfony/finder/tree/v6.3.3"
             },
             "funding": [
                 {
@@ -2672,25 +2951,25 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-12-22T17:55:15+00:00"
+            "time": "2023-07-31T08:31:44+00:00"
         },
         {
             "name": "symfony/options-resolver",
-            "version": "v6.2.0",
+            "version": "v6.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/options-resolver.git",
-                "reference": "d28f02acde71ff75e957082cd36e973df395f626"
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/d28f02acde71ff75e957082cd36e973df395f626",
-                "reference": "d28f02acde71ff75e957082cd36e973df395f626",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd",
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/deprecation-contracts": "^2.1|^3"
+                "symfony/deprecation-contracts": "^2.5|^3"
             },
             "type": "library",
             "autoload": {
@@ -2723,7 +3002,7 @@
                 "options"
             ],
             "support": {
-                "source": "https://github.com/symfony/options-resolver/tree/v6.2.0"
+                "source": "https://github.com/symfony/options-resolver/tree/v6.3.0"
             },
             "funding": [
                 {
@@ -2739,20 +3018,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-02T09:08:04+00:00"
+            "time": "2023-05-12T14:21:09+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
-                "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
                 "shasum": ""
             },
             "require": {
@@ -2767,7 +3046,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -2805,7 +3084,7 @@
                 "portable"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -2821,20 +3100,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-intl-grapheme",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
-                "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+                "reference": "875e90aeea2777b6f135677f618529449334a612"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
-                "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
+                "reference": "875e90aeea2777b6f135677f618529449334a612",
                 "shasum": ""
             },
             "require": {
@@ -2846,7 +3125,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -2886,7 +3165,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -2902,20 +3181,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-intl-normalizer",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
-                "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
-                "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
                 "shasum": ""
             },
             "require": {
@@ -2927,7 +3206,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -2970,7 +3249,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -2986,20 +3265,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+                "reference": "42292d99c55abe617799667f454222c54c60e229"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
-                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+                "reference": "42292d99c55abe617799667f454222c54c60e229",
                 "shasum": ""
             },
             "require": {
@@ -3014,7 +3293,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -3053,7 +3332,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -3069,20 +3348,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-07-28T09:04:16+00:00"
         },
         {
             "name": "symfony/polyfill-php80",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php80.git",
-                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
-                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
                 "shasum": ""
             },
             "require": {
@@ -3091,7 +3370,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -3136,7 +3415,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -3152,20 +3431,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/polyfill-php81",
-            "version": "v1.27.0",
+            "version": "v1.28.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php81.git",
-                "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a"
+                "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a",
-                "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a",
+                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b",
+                "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b",
                 "shasum": ""
             },
             "require": {
@@ -3174,7 +3453,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.27-dev"
+                    "dev-main": "1.28-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -3215,7 +3494,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0"
+                "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0"
             },
             "funding": [
                 {
@@ -3231,20 +3510,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-03T14:55:06+00:00"
+            "time": "2023-01-26T09:26:14+00:00"
         },
         {
             "name": "symfony/process",
-            "version": "v6.2.0",
+            "version": "v6.3.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877"
+                "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/ba6e55359f8f755fe996c58a81e00eaa67a35877",
-                "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877",
+                "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54",
+                "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54",
                 "shasum": ""
             },
             "require": {
@@ -3276,7 +3555,7 @@
             "description": "Executes commands in sub-processes",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/process/tree/v6.2.0"
+                "source": "https://github.com/symfony/process/tree/v6.3.4"
             },
             "funding": [
                 {
@@ -3292,20 +3571,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-02T09:08:04+00:00"
+            "time": "2023-08-07T10:39:22+00:00"
         },
         {
             "name": "symfony/service-contracts",
-            "version": "v3.2.0",
+            "version": "v3.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/service-contracts.git",
-                "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75"
+                "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75",
-                "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
+                "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
                 "shasum": ""
             },
             "require": {
@@ -3315,13 +3594,10 @@
             "conflict": {
                 "ext-psr": "<1.1|>=2"
             },
-            "suggest": {
-                "symfony/service-implementation": ""
-            },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "3.3-dev"
+                    "dev-main": "3.4-dev"
                 },
                 "thanks": {
                     "name": "symfony/contracts",
@@ -3361,7 +3637,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/service-contracts/tree/v3.2.0"
+                "source": "https://github.com/symfony/service-contracts/tree/v3.3.0"
             },
             "funding": [
                 {
@@ -3377,25 +3653,25 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-11-25T10:21:52+00:00"
+            "time": "2023-05-23T14:45:45+00:00"
         },
         {
             "name": "symfony/stopwatch",
-            "version": "v6.2.0",
+            "version": "v6.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/stopwatch.git",
-                "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7"
+                "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
-                "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7",
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2",
+                "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/service-contracts": "^1|^2|^3"
+                "symfony/service-contracts": "^2.5|^3"
             },
             "type": "library",
             "autoload": {
@@ -3423,7 +3699,7 @@
             "description": "Provides a way to profile code",
             "homepage": "https://symfony.com",
             "support": {
-                "source": "https://github.com/symfony/stopwatch/tree/v6.2.0"
+                "source": "https://github.com/symfony/stopwatch/tree/v6.3.0"
             },
             "funding": [
                 {
@@ -3439,20 +3715,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-09-28T16:00:52+00:00"
+            "time": "2023-02-16T10:14:28+00:00"
         },
         {
             "name": "symfony/string",
-            "version": "v6.2.2",
+            "version": "v6.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "863219fd713fa41cbcd285a79723f94672faff4d"
+                "reference": "53d1a83225002635bca3482fcbf963001313fb68"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/863219fd713fa41cbcd285a79723f94672faff4d",
-                "reference": "863219fd713fa41cbcd285a79723f94672faff4d",
+                "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68",
+                "reference": "53d1a83225002635bca3482fcbf963001313fb68",
                 "shasum": ""
             },
             "require": {
@@ -3463,13 +3739,13 @@
                 "symfony/polyfill-mbstring": "~1.0"
             },
             "conflict": {
-                "symfony/translation-contracts": "<2.0"
+                "symfony/translation-contracts": "<2.5"
             },
             "require-dev": {
                 "symfony/error-handler": "^5.4|^6.0",
                 "symfony/http-client": "^5.4|^6.0",
                 "symfony/intl": "^6.2",
-                "symfony/translation-contracts": "^2.0|^3.0",
+                "symfony/translation-contracts": "^2.5|^3.0",
                 "symfony/var-exporter": "^5.4|^6.0"
             },
             "type": "library",
@@ -3509,7 +3785,7 @@
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v6.2.2"
+                "source": "https://github.com/symfony/string/tree/v6.3.2"
             },
             "funding": [
                 {
@@ -3525,78 +3801,57 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2022-12-14T16:11:27+00:00"
+            "time": "2023-07-05T08:41:27+00:00"
         },
         {
-            "name": "symfony/yaml",
-            "version": "v3.4.47",
+            "name": "theseer/tokenizer",
+            "version": "1.2.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/yaml.git",
-                "reference": "88289caa3c166321883f67fe5130188ebbb47094"
+                "url": "https://github.com/theseer/tokenizer.git",
+                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094",
-                "reference": "88289caa3c166321883f67fe5130188ebbb47094",
+                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9|>=7.0.8",
-                "symfony/polyfill-ctype": "~1.8"
-            },
-            "conflict": {
-                "symfony/console": "<3.4"
-            },
-            "require-dev": {
-                "symfony/console": "~3.4|~4.0"
-            },
-            "suggest": {
-                "symfony/console": "For validating YAML files using the lint command"
+                "ext-dom": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": "^7.2 || ^8.0"
             },
             "type": "library",
             "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\Yaml\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
+                "classmap": [
+                    "src/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "MIT"
+                "BSD-3-Clause"
             ],
             "authors": [
                 {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
                 }
             ],
-            "description": "Symfony Yaml Component",
-            "homepage": "https://symfony.com",
+            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
             "support": {
-                "source": "https://github.com/symfony/yaml/tree/v3.4.47"
+                "issues": "https://github.com/theseer/tokenizer/issues",
+                "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
             },
             "funding": [
                 {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
+                    "url": "https://github.com/theseer",
                     "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
                 }
             ],
-            "time": "2020-10-24T10:57:07+00:00"
+            "time": "2021-07-28T10:34:58+00:00"
         }
     ],
     "aliases": [],
@@ -3607,7 +3862,7 @@
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
-        "php": ">=5.4.0",
+        "php": ">=7.4.0",
         "ext-mbstring": "*",
         "ext-ctype": "*",
         "lib-pcre": "*"
diff --git a/framework/composer.json b/framework/composer.json
index 5494cae7a24..2db0b478095 100644
--- a/framework/composer.json
+++ b/framework/composer.json
@@ -63,7 +63,7 @@
         "source": "https://github.com/yiisoft/yii2"
     },
     "require": {
-        "php": ">=5.4.0",
+        "php": ">=7.4.0",
         "ext-mbstring": "*",
         "ext-ctype": "*",
         "lib-pcre": "*",
@@ -73,8 +73,7 @@
         "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable",
         "bower-asset/inputmask": "~3.2.2 | ~3.3.5",
         "bower-asset/punycode": "1.3.*",
-        "bower-asset/yii2-pjax": "~2.0.1",
-        "paragonie/random_compat": ">=1"
+        "bower-asset/yii2-pjax": "~2.0.1"
     },
     "autoload": {
         "psr-4": {"yii\\": ""}
diff --git a/framework/console/widgets/Table.php b/framework/console/widgets/Table.php
index c0ece4d4d89..070d6c77361 100644
--- a/framework/console/widgets/Table.php
+++ b/framework/console/widgets/Table.php
@@ -113,6 +113,10 @@ class Table extends Widget
      */
     protected $listPrefix = '• ';
 
+    public function getColumnWidths()
+    {
+        return $this->columnWidths;
+    }
 
     /**
      * Set table headers.
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 2b9f7c6df55..9347786ca23 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,30 +1,35 @@
 <?xml version="1.0" encoding="utf-8"?>
-<phpunit bootstrap="./tests/bootstrap.php"
-		backupGlobals="true"
-		colors="true"
-		convertErrorsToExceptions="true"
-		convertNoticesToExceptions="true"
-		convertWarningsToExceptions="true"
-		stopOnFailure="false"
-		printerClass="yiiunit\ResultPrinter">
-		<testsuites>
-			<testsuite name="Yii Test Suite">
-				<directory>./tests</directory>
-			</testsuite>
-		</testsuites>
-		<filter>
-            <whitelist>
-                <directory suffix=".php">framework/</directory>
-            </whitelist>
-			<blacklist>
-				<file>framework/i18n/GettextFile.php</file>
-				<file>framework/web/ResponseFormatterInterface.php</file>
-				<file>framework/.phpstorm.meta.php</file>
-				<directory suffix="Exception.php">framework/base</directory>
-				<directory suffix=".php">framework/bootstrap</directory>
-			</blacklist>
-		</filter>
-        <listeners>
-            <listener class="JohnKary\PHPUnit\Listener\SpeedTrapListener" />
-        </listeners>
+<phpunit
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    backupGlobals="true"
+    bootstrap="./tests/bootstrap.php"
+    colors="true"
+	convertErrorsToExceptions="true"
+	convertNoticesToExceptions="true"
+	convertWarningsToExceptions="true"
+    executionOrder="default"
+    failOnRisky="true"
+    failOnWarning="true"
+    printerClass="yiiunit\ResultPrinter"
+    stopOnFailure="false"
+>
+    <testsuites>
+		<testsuite name="Yii Test Suite">
+			<directory>./tests</directory>
+		</testsuite>
+	</testsuites>
+
+	<coverage>
+        <include>
+            <directory suffix=".php">framework/</directory>
+        </include>
+		<exclude>
+			<file>framework/.phpstorm.meta.php</file>
+			<file>framework/i18n/GettextFile.php</file>
+			<file>framework/web/ResponseFormatterInterface.php</file>
+			<directory suffix=".php">framework/bootstrap</directory>
+			<directory suffix="Exception.php">framework/base</directory>
+            <directory suffix=".php">framework/requirements</directory>
+		</exclude>
+	</coverage>
 </phpunit>
diff --git a/tests/IsOneOfAssert.php b/tests/IsOneOfAssert.php
index 5c630b7d041..830e560c564 100644
--- a/tests/IsOneOfAssert.php
+++ b/tests/IsOneOfAssert.php
@@ -14,38 +14,32 @@
  */
 class IsOneOfAssert extends \PHPUnit\Framework\Constraint\Constraint
 {
-    private $allowedValues;
+    private array $allowedValues = [];
 
-    /**
-     * IsOneOfAssert constructor.
-     * @param array $allowedValues
-     */
+    /** @psalm-param string[] $allowedValues */
     public function __construct(array $allowedValues)
     {
-        parent::__construct();
         $this->allowedValues = $allowedValues;
     }
 
-
     /**
      * Returns a string representation of the object.
-     *
-     * @return string
      */
-    public function toString()
+    public function toString(): string
     {
-        $allowedValues = array_map(function ($value) {
-            return VarDumper::dumpAsString($value);
-        }, $this->allowedValues);
+        $allowedValues = [];
+
+        foreach ($this->allowedValues as $value) {
+            $this->allowedValues[] = VarDumper::create($value)->asString();
+        }
+
         $expectedAsString = implode(', ', $allowedValues);
+
         return "is one of $expectedAsString";
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    protected function matches($other)
+    protected function matches($other): bool
     {
-        return in_array($other, $this->allowedValues, false);
+        return in_array($other, $this->allowedValues);
     }
 }
diff --git a/tests/ResultPrinter.php b/tests/ResultPrinter.php
index 89299f0557c..6a6fca92dcc 100644
--- a/tests/ResultPrinter.php
+++ b/tests/ResultPrinter.php
@@ -12,12 +12,18 @@
  * to change default output to STDOUT and prevent some tests from fail when
  * they can not be executed after headers have been sent.
  */
-class ResultPrinter extends \PHPUnit\TextUI\ResultPrinter
+class ResultPrinter extends \PHPUnit\TextUI\DefaultResultPrinter
 {
+    private $out = null;
+
+    /**
+     * @param null|resource|string $out
+     * @param int|string $numberOfColumns
+     */
     public function __construct(
         $out = null,
         $verbose = false,
-        $colors = \PHPUnit\TextUI\ResultPrinter::COLOR_DEFAULT,
+        $colors = \PHPUnit\TextUI\DefaultResultPrinter::COLOR_DEFAULT,
         $debug = false,
         $numberOfColumns = 80,
         $reverse = false
@@ -29,7 +35,7 @@ public function __construct(
         parent::__construct($out, $verbose, $colors, $debug, $numberOfColumns, $reverse);
     }
 
-    public function flush()
+    public function flush(): void
     {
         if ($this->out !== STDOUT) {
             parent::flush();
diff --git a/tests/TestCase.php b/tests/TestCase.php
index 5a8287f1f55..192a3ccb2a7 100644
--- a/tests/TestCase.php
+++ b/tests/TestCase.php
@@ -20,7 +20,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
     /**
      * Clean up after test case.
      */
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         parent::tearDownAfterClass();
         $logger = Yii::getLogger();
@@ -46,7 +46,7 @@ public static function getParam($name, $default = null)
      * Clean up after test.
      * By default the application created with [[mockApplication]] will be destroyed.
      */
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         $this->destroyApplication();
@@ -168,7 +168,7 @@ protected function assertContainsWithoutLE($needle, $haystack, $message = '')
         $needle = str_replace("\r\n", "\n", $needle);
         $haystack = str_replace("\r\n", "\n", $haystack);
 
-        $this->assertContains($needle, $haystack, $message);
+        $this->assertStringContainsString($needle, $haystack, $message);
     }
 
     /**
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 44714ab28da..35a3b1e4a90 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -28,5 +28,4 @@
     Yii::setAlias('@runtime', getenv('TEST_RUNTIME_PATH'));
 }
 
-require_once __DIR__ . '/compatibility.php';
 require_once __DIR__ . '/TestCase.php';
diff --git a/tests/compatibility.php b/tests/compatibility.php
deleted file mode 100644
index 5a14c6e36e2..00000000000
--- a/tests/compatibility.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * @link https://www.yiiframework.com/
- * @copyright Copyright (c) 2008 Yii Software LLC
- * @license https://www.yiiframework.com/license/
- */
-
-/*
- * Ensures compatibility with PHPUnit < 6.x
- */
-
-namespace PHPUnit\Framework\Constraint {
-    if (!class_exists('PHPUnit\Framework\Constraint\Constraint') && class_exists('PHPUnit_Framework_Constraint')) {
-        abstract class Constraint extends \PHPUnit_Framework_Constraint
-        {
-        }
-    }
-}
-
-namespace PHPUnit\TextUI {
-    if (!class_exists('\PHPUnit\TextUI\ResultPrinter') && class_exists('PHPUnit_TextUI_ResultPrinter')) {
-        class ResultPrinter extends \PHPUnit_TextUI_ResultPrinter
-        {
-        }
-    }
-}
-
-namespace PHPUnit\Framework\Error {
-    if (!class_exists('PHPUnit\Framework\Error\Notice') && class_exists('PHPUnit_Framework_Error_Notice')) {
-        class Notice extends \PHPUnit_Framework_Error_Notice
-        {
-        }
-    }
-}
-
-namespace PHPUnit\Framework {
-    if (!class_exists('PHPUnit\Framework\TestCase') && class_exists('PHPUnit_Framework_TestCase')) {
-        abstract class TestCase extends \PHPUnit_Framework_TestCase
-        {
-            /**
-             * @param string $exception
-             */
-            public function expectException($exception)
-            {
-                $this->setExpectedException($exception);
-            }
-
-            /**
-             * @param string $message
-             */
-            public function expectExceptionMessage($message)
-            {
-                $parentClassMethods = get_class_methods('PHPUnit_Framework_TestCase');
-                if (in_array('expectExceptionMessage', $parentClassMethods)) {
-                    parent::expectExceptionMessage($message);
-                    return;
-                }
-                $this->setExpectedException($this->getExpectedException(), $message);
-            }
-
-            /**
-             * @param string $messageRegExp
-             */
-            public function expectExceptionMessageRegExp($messageRegExp)
-            {
-                $parentClassMethods = get_class_methods('PHPUnit_Framework_TestCase');
-                if (in_array('expectExceptionMessageRegExp', $parentClassMethods)) {
-                    parent::expectExceptionMessageRegExp($messageRegExp);
-                    return;
-                }
-                $this->setExpectedExceptionRegExp($this->getExpectedException(), $messageRegExp);
-            }
-        }
-    }
-}
diff --git a/tests/framework/BaseYiiTest.php b/tests/framework/BaseYiiTest.php
index 4e17fff0668..b0c99e9787d 100644
--- a/tests/framework/BaseYiiTest.php
+++ b/tests/framework/BaseYiiTest.php
@@ -26,13 +26,13 @@ class BaseYiiTest extends TestCase
 {
     public $aliases;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->aliases = Yii::$aliases;
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         Yii::$aliases = $this->aliases;
@@ -72,7 +72,7 @@ public function testGetVersion()
 
     public function testPowered()
     {
-        $this->assertInternalType('string', Yii::powered());
+        $this->assertIsString(Yii::powered());
     }
 
     public function testCreateObjectArray()
diff --git a/tests/framework/ChangeLogTest.php b/tests/framework/ChangeLogTest.php
index eef6cae4585..ad9ba6368d1 100644
--- a/tests/framework/ChangeLogTest.php
+++ b/tests/framework/ChangeLogTest.php
@@ -54,6 +54,6 @@ public function testContributorLine($line)
          * - Description ends without a "."
          * - Line ends with contributor name between "(" and ")".
          */
-        $this->assertRegExp('/- (Bug|Enh|Chg|New)( #\d+(, #\d+)*)?(\s\(CVE-[\d-]+\))?: .*[^.] \(.+\)$/', $line);
+        $this->assertMatchesRegularExpression('/- (Bug|Enh|Chg|New)( #\d+(, #\d+)*)?(\s\(CVE-[\d-]+\))?: .*[^.] \(.+\)$/', $line);
     }
 }
diff --git a/tests/framework/base/ActionFilterTest.php b/tests/framework/base/ActionFilterTest.php
index 7a527beb77b..17419d16cb5 100644
--- a/tests/framework/base/ActionFilterTest.php
+++ b/tests/framework/base/ActionFilterTest.php
@@ -19,7 +19,7 @@
  */
 class ActionFilterTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/base/BaseObjectTest.php b/tests/framework/base/BaseObjectTest.php
index 98280fef25e..02166626a68 100644
--- a/tests/framework/base/BaseObjectTest.php
+++ b/tests/framework/base/BaseObjectTest.php
@@ -20,14 +20,14 @@ class BaseObjectTest extends TestCase
      */
     protected $object;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
         $this->object = new NewObject();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         $this->object = null;
diff --git a/tests/framework/base/BehaviorTest.php b/tests/framework/base/BehaviorTest.php
index b77a074d4be..47ecbf9e0fc 100644
--- a/tests/framework/base/BehaviorTest.php
+++ b/tests/framework/base/BehaviorTest.php
@@ -73,13 +73,13 @@ public function detach()
  */
 class BehaviorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         gc_enable();
diff --git a/tests/framework/base/ComponentTest.php b/tests/framework/base/ComponentTest.php
index e2fdbc6e02b..e745c678262 100644
--- a/tests/framework/base/ComponentTest.php
+++ b/tests/framework/base/ComponentTest.php
@@ -33,14 +33,14 @@ class ComponentTest extends TestCase
      */
     protected $component;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
         $this->component = new NewComponent();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         $this->component = null;
diff --git a/tests/framework/base/DynamicModelTest.php b/tests/framework/base/DynamicModelTest.php
index d3dca504b6f..6b368f08cd2 100644
--- a/tests/framework/base/DynamicModelTest.php
+++ b/tests/framework/base/DynamicModelTest.php
@@ -15,7 +15,7 @@
  */
 class DynamicModelTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/base/EventTest.php b/tests/framework/base/EventTest.php
index f99d12bedb7..ab616d1572a 100644
--- a/tests/framework/base/EventTest.php
+++ b/tests/framework/base/EventTest.php
@@ -18,13 +18,13 @@ class EventTest extends TestCase
 {
     public $counter;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->counter = 0;
         Event::offAll();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         Event::offAll();
diff --git a/tests/framework/base/ModelTest.php b/tests/framework/base/ModelTest.php
index 5ed73163b8d..0670abf65de 100644
--- a/tests/framework/base/ModelTest.php
+++ b/tests/framework/base/ModelTest.php
@@ -20,7 +20,7 @@
  */
 class ModelTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/base/ModuleTest.php b/tests/framework/base/ModuleTest.php
index bbe36311279..333180924e0 100644
--- a/tests/framework/base/ModuleTest.php
+++ b/tests/framework/base/ModuleTest.php
@@ -18,7 +18,7 @@
  */
 class ModuleTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/base/SecurityTest.php b/tests/framework/base/SecurityTest.php
index d50fc0ab44d..0f1c6ab8394 100644
--- a/tests/framework/base/SecurityTest.php
+++ b/tests/framework/base/SecurityTest.php
@@ -22,7 +22,7 @@ class SecurityTest extends TestCase
      */
     protected $security;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->security = new ExposedSecurity();
@@ -813,12 +813,14 @@ public function randomKeyInvalidInputs()
 
     /**
      * @dataProvider randomKeyInvalidInputs
-     * @expectedException \yii\base\InvalidParamException
-     * @param mixed $input
+     *
+     * @param int|string|array $input
      */
     public function testRandomKeyInvalidInput($input)
     {
-        $key1 = $this->security->generateRandomKey($input);
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+
+        $this->security->generateRandomKey($input);
     }
 
     public function testGenerateRandomKey()
@@ -826,10 +828,10 @@ public function testGenerateRandomKey()
         // test various string lengths
         for ($length = 1; $length < 64; $length++) {
             $key1 = $this->security->generateRandomKey($length);
-            $this->assertInternalType('string', $key1);
+            $this->assertIsString($key1);
             $this->assertEquals($length, strlen($key1));
             $key2 = $this->security->generateRandomKey($length);
-            $this->assertInternalType('string', $key2);
+            $this->assertIsString($key2);
             $this->assertEquals($length, strlen($key2));
             if ($length >= 7) { // avoid random test failure, short strings are likely to collide
                 $this->assertNotEquals($key1, $key2);
@@ -839,10 +841,10 @@ public function testGenerateRandomKey()
         // test for /dev/urandom, reading larger data to see if loop works properly
         $length = 1024 * 1024;
         $key1 = $this->security->generateRandomKey($length);
-        $this->assertInternalType('string', $key1);
+        $this->assertIsString($key1);
         $this->assertEquals($length, strlen($key1));
         $key2 = $this->security->generateRandomKey($length);
-        $this->assertInternalType('string', $key2);
+        $this->assertIsString($key2);
         $this->assertEquals($length, strlen($key2));
         $this->assertNotEquals($key1, $key2);
     }
@@ -1103,11 +1105,11 @@ public function testUnMaskingInvalidStrings()
         $this->assertEquals('', $this->security->unmaskToken('1'));
     }
 
-    /**
-     * @expectedException \yii\base\InvalidParamException
-     */
     public function testMaskingInvalidStrings()
     {
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessage('First parameter ($length) must be greater than 0');
+
         $this->security->maskToken('');
     }
 
diff --git a/tests/framework/base/ThemeTest.php b/tests/framework/base/ThemeTest.php
index 145380f3a7b..7b6ef72680e 100644
--- a/tests/framework/base/ThemeTest.php
+++ b/tests/framework/base/ThemeTest.php
@@ -16,7 +16,7 @@
  */
 class ThemeTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         $config = ['aliases' => ['@web' => '']];
         $this->mockWebApplication($config);
diff --git a/tests/framework/base/ViewTest.php b/tests/framework/base/ViewTest.php
index f568a5a7145..ead215455a1 100644
--- a/tests/framework/base/ViewTest.php
+++ b/tests/framework/base/ViewTest.php
@@ -24,7 +24,7 @@ class ViewTest extends TestCase
      */
     protected $testViewPath = '';
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
@@ -33,7 +33,7 @@ public function setUp()
         FileHelper::createDirectory($this->testViewPath);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         FileHelper::removeDirectory($this->testViewPath);
         parent::tearDown();
diff --git a/tests/framework/base/WidgetTest.php b/tests/framework/base/WidgetTest.php
index 9517fed7e5b..067e9480125 100644
--- a/tests/framework/base/WidgetTest.php
+++ b/tests/framework/base/WidgetTest.php
@@ -21,7 +21,7 @@ class WidgetTest extends TestCase
     /**
      * {@inheritdoc}
      */
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         Widget::$counter = 0;
diff --git a/tests/framework/behaviors/AttributeBehaviorTest.php b/tests/framework/behaviors/AttributeBehaviorTest.php
index 3159603bac9..cbda9f68ede 100644
--- a/tests/framework/behaviors/AttributeBehaviorTest.php
+++ b/tests/framework/behaviors/AttributeBehaviorTest.php
@@ -26,14 +26,14 @@ class AttributeBehaviorTest extends TestCase
      */
     protected $dbConnection;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -52,7 +52,7 @@ public function setUp()
         Yii::$app->getDb()->createCommand()->createTable('test_attribute', $columns)->execute();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         Yii::$app->getDb()->close();
         parent::tearDown();
diff --git a/tests/framework/behaviors/AttributeTypecastBehaviorTest.php b/tests/framework/behaviors/AttributeTypecastBehaviorTest.php
index a43b9346bbe..5af290672e1 100644
--- a/tests/framework/behaviors/AttributeTypecastBehaviorTest.php
+++ b/tests/framework/behaviors/AttributeTypecastBehaviorTest.php
@@ -22,14 +22,14 @@
  */
 class AttributeTypecastBehaviorTest extends TestCase
 {
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -51,7 +51,7 @@ protected function setUp()
         Yii::$app->getDb()->createCommand()->createTable('test_attribute_typecast', $columns)->execute();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         AttributeTypecastBehavior::clearAutoDetectedAttributeTypes();
diff --git a/tests/framework/behaviors/AttributesBehaviorTest.php b/tests/framework/behaviors/AttributesBehaviorTest.php
index d26ddbc8b48..1e1ce26d6dc 100644
--- a/tests/framework/behaviors/AttributesBehaviorTest.php
+++ b/tests/framework/behaviors/AttributesBehaviorTest.php
@@ -26,14 +26,14 @@ class AttributesBehaviorTest extends TestCase
      */
     protected $dbConnection;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -52,7 +52,7 @@ public function setUp()
         Yii::$app->getDb()->createCommand()->createTable('test_attribute', $columns)->execute();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         Yii::$app->getDb()->close();
         parent::tearDown();
diff --git a/tests/framework/behaviors/BlameableBehaviorConsoleTest.php b/tests/framework/behaviors/BlameableBehaviorConsoleTest.php
index 4a220125521..15db5da4b5f 100755
--- a/tests/framework/behaviors/BlameableBehaviorConsoleTest.php
+++ b/tests/framework/behaviors/BlameableBehaviorConsoleTest.php
@@ -21,14 +21,14 @@
  */
 class BlameableBehaviorConsoleTest extends TestCase
 {
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -47,7 +47,7 @@ public function setUp()
         Yii::$app->getDb()->createCommand()->createTable('test_blame', $columns)->execute();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         Yii::$app->getDb()->close();
         parent::tearDown();
diff --git a/tests/framework/behaviors/BlameableBehaviorTest.php b/tests/framework/behaviors/BlameableBehaviorTest.php
index b9e1a86b081..6be4626e988 100644
--- a/tests/framework/behaviors/BlameableBehaviorTest.php
+++ b/tests/framework/behaviors/BlameableBehaviorTest.php
@@ -21,14 +21,14 @@
  */
 class BlameableBehaviorTest extends TestCase
 {
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -52,7 +52,7 @@ public function setUp()
         $this->getUser()->login(10);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         Yii::$app->getDb()->close();
         parent::tearDown();
diff --git a/tests/framework/behaviors/CacheableWidgetBehaviorTest.php b/tests/framework/behaviors/CacheableWidgetBehaviorTest.php
index fdcf5e0d3cd..9ff9d0826f5 100644
--- a/tests/framework/behaviors/CacheableWidgetBehaviorTest.php
+++ b/tests/framework/behaviors/CacheableWidgetBehaviorTest.php
@@ -32,7 +32,7 @@ class CacheableWidgetBehaviorTest extends TestCase
     /**
      * {@inheritdoc}
      */
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->initializeApplicationMock();
         $this->initializeWidgetMocks();
diff --git a/tests/framework/behaviors/OptimisticLockBehaviorTest.php b/tests/framework/behaviors/OptimisticLockBehaviorTest.php
index fe041eab9af..5870d95e431 100644
--- a/tests/framework/behaviors/OptimisticLockBehaviorTest.php
+++ b/tests/framework/behaviors/OptimisticLockBehaviorTest.php
@@ -29,14 +29,14 @@ class OptimisticLockBehaviorTest extends TestCase
      */
     protected $dbConnection;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -60,7 +60,7 @@ public function setUp()
         Yii::$app->getDb()->createCommand()->createTable('test_auto_lock_version_string', $columns)->execute();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         Yii::$app->getDb()->close();
         parent::tearDown();
@@ -127,14 +127,13 @@ public function testNewRecord()
         $this->assertEquals(8, $model->version, 'init version should equal 8');
     }
 
-
     public function testUpdateRecord()
     {
         $request = new Request();
         Yii::$app->set('request', $request);
 
         ActiveRecordLockVersion::$behaviors = [
-            OptimisticLockBehavior::className(),
+            OptimisticLockBehavior::class,
         ];
         $model = new ActiveRecordLockVersion();
         $this->assertEquals(true, $model->save(false), 'model is successfully saved');
@@ -152,7 +151,7 @@ public function testUpdateRecord()
         try {
             $model->save(false);
         } catch (\yii\db\StaleObjectException $e) {
-            $this->assertContains('The object being updated is outdated.', $e->getMessage());
+            $this->assertStringContainsString('The object being updated is outdated.', $e->getMessage());
             $thrown = true;
         }
 
@@ -168,7 +167,7 @@ public function testUpdateRecord()
         try {
             $model->save(false);
         } catch (\yii\db\StaleObjectException $e) {
-            $this->assertContains('The object being updated is outdated.', $e->getMessage());
+            $this->assertStringContainsString('The object being updated is outdated.', $e->getMessage());
             $thrown = true;
         }
 
@@ -184,7 +183,7 @@ public function testUpdateRecord()
         try {
             $model->save(false);
         } catch (\yii\db\StaleObjectException $e) {
-            $this->assertContains('The object being updated is outdated.', $e->getMessage());
+            $this->assertStringContainsString('The object being updated is outdated.', $e->getMessage());
             $thrown = true;
         }
 
@@ -211,13 +210,13 @@ public function testUpdateRecord()
         $this->assertEquals(3, $model->version, 'updated version should equal 3');
     }
 
-     public function testDeleteRecord()
+    public function testDeleteRecord()
     {
         $request = new Request();
         Yii::$app->set('request', $request);
 
         ActiveRecordLockVersion::$behaviors = [
-            OptimisticLockBehavior::className(),
+            OptimisticLockBehavior::class,
         ];
         $model = new ActiveRecordLockVersion();
         $this->assertEquals(true, $model->save(false), 'model is successfully saved');
@@ -233,7 +232,7 @@ public function testDeleteRecord()
         try {
             $model->delete();
         } catch (\yii\db\StaleObjectException $e) {
-            $this->assertContains('The object being deleted is outdated.', $e->getMessage());
+            $this->assertStringContainsString('The object being deleted is outdated.', $e->getMessage());
             $thrown = true;
         }
 
@@ -249,7 +248,7 @@ public function testDeleteRecord()
         try {
             $model->delete();
         } catch (\yii\db\StaleObjectException $e) {
-            $this->assertContains('The object being deleted is outdated.', $e->getMessage());
+            $this->assertStringContainsString('The object being deleted is outdated.', $e->getMessage());
             $thrown = true;
         }
 
diff --git a/tests/framework/behaviors/SluggableBehaviorTest.php b/tests/framework/behaviors/SluggableBehaviorTest.php
index cf9e9ceddda..74670ba2e51 100644
--- a/tests/framework/behaviors/SluggableBehaviorTest.php
+++ b/tests/framework/behaviors/SluggableBehaviorTest.php
@@ -26,14 +26,14 @@ class SluggableBehaviorTest extends TestCase
      */
     protected $dbConnection;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -60,7 +60,7 @@ public function setUp()
         Yii::$app->getDb()->createCommand()->createTable('test_slug_related', $columns)->execute();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         Yii::$app->getDb()->close();
         parent::tearDown();
diff --git a/tests/framework/behaviors/TimestampBehaviorTest.php b/tests/framework/behaviors/TimestampBehaviorTest.php
index 22365f17993..e5e087a2ded 100644
--- a/tests/framework/behaviors/TimestampBehaviorTest.php
+++ b/tests/framework/behaviors/TimestampBehaviorTest.php
@@ -28,14 +28,14 @@ class TimestampBehaviorTest extends TestCase
      */
     protected $dbConnection;
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlite')) {
             static::markTestSkipped('PDO and SQLite extensions are required.');
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -61,7 +61,7 @@ public function setUp()
         Yii::$app->getDb()->createCommand()->createTable('test_auto_timestamp_string', $columns)->execute();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         Yii::$app->getDb()->close();
         parent::tearDown();
diff --git a/tests/framework/caching/CacheTestCase.php b/tests/framework/caching/CacheTestCase.php
index 7eb00321a35..fc98fb57e04 100644
--- a/tests/framework/caching/CacheTestCase.php
+++ b/tests/framework/caching/CacheTestCase.php
@@ -54,13 +54,13 @@ abstract class CacheTestCase extends TestCase
      */
     abstract protected function getCacheInstance();
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         static::$time = null;
         static::$microtime = null;
diff --git a/tests/framework/caching/DbCacheTest.php b/tests/framework/caching/DbCacheTest.php
index b18b30e2bcd..21d2723cb62 100644
--- a/tests/framework/caching/DbCacheTest.php
+++ b/tests/framework/caching/DbCacheTest.php
@@ -19,7 +19,7 @@ class DbCacheTest extends CacheTestCase
     private $_cacheInstance;
     private $_connection;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) {
             $this->markTestSkipped('pdo and pdo_mysql extensions are required.');
diff --git a/tests/framework/caching/DbDependencyTest.php b/tests/framework/caching/DbDependencyTest.php
index bd801e3528c..a64d47d8533 100644
--- a/tests/framework/caching/DbDependencyTest.php
+++ b/tests/framework/caching/DbDependencyTest.php
@@ -25,7 +25,7 @@ class DbDependencyTest extends DatabaseTestCase
     /**
      * {@inheritdoc}
      */
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/caching/DbQueryDependencyTest.php b/tests/framework/caching/DbQueryDependencyTest.php
index f8a50183dcd..679fc9eb63a 100644
--- a/tests/framework/caching/DbQueryDependencyTest.php
+++ b/tests/framework/caching/DbQueryDependencyTest.php
@@ -23,7 +23,7 @@ class DbQueryDependencyTest extends DatabaseTestCase
     /**
      * {@inheritdoc}
      */
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/caching/FileCacheTest.php b/tests/framework/caching/FileCacheTest.php
index c9f6ee8f51f..39bb81ae4b1 100644
--- a/tests/framework/caching/FileCacheTest.php
+++ b/tests/framework/caching/FileCacheTest.php
@@ -77,7 +77,7 @@ public function testKeyPrefix()
         $cacheFile = $refMethodGetCacheFile->invoke($cache, $normalizeKey);
 
         $this->assertTrue($refMethodSet->invoke($cache, $key, $value));
-        $this->assertContains($keyPrefix, basename($cacheFile));
+        $this->assertStringContainsString($keyPrefix, basename($cacheFile));
         $this->assertEquals($expectedDirectoryName, basename(dirname($cacheFile)), $cacheFile);
         $this->assertTrue(is_dir(dirname($cacheFile)), 'File not found ' . $cacheFile);
         $this->assertEquals($value, $refMethodGet->invoke($cache, $key));
diff --git a/tests/framework/caching/MssqlCacheTest.php b/tests/framework/caching/MssqlCacheTest.php
index 324f1fcc036..2efc8bf5d6a 100644
--- a/tests/framework/caching/MssqlCacheTest.php
+++ b/tests/framework/caching/MssqlCacheTest.php
@@ -21,7 +21,7 @@ class MssqlCacheTest extends CacheTestCase
     private $_cacheInstance;
     private $_connection;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_sqlsrv')) {
             $this->markTestSkipped('pdo and pdo_mssql extensions are required.');
diff --git a/tests/framework/caching/PgSQLCacheTest.php b/tests/framework/caching/PgSQLCacheTest.php
index 76a4c6cc6b5..45478537c43 100644
--- a/tests/framework/caching/PgSQLCacheTest.php
+++ b/tests/framework/caching/PgSQLCacheTest.php
@@ -20,7 +20,7 @@ class PgSQLCacheTest extends DbCacheTest
     protected static $driverName = 'pgsql';
     private $_connection;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) {
             $this->markTestSkipped('pdo and pdo_pgsql extensions are required.');
diff --git a/tests/framework/console/ControllerTest.php b/tests/framework/console/ControllerTest.php
index a38cb7ea372..bff75019839 100644
--- a/tests/framework/console/ControllerTest.php
+++ b/tests/framework/console/ControllerTest.php
@@ -26,7 +26,7 @@ class ControllerTest extends TestCase
     /** @var FakeController */
     private $controller;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -270,7 +270,7 @@ public function testHelpOption()
 
         $helpController = new FakeHelpControllerWithoutOutput('help', Yii::$app);
         $helpController->actionIndex('fake/aksi1');
-        $this->assertContains('--test-array, -ta', $helpController->outputString);
+        $this->assertStringContainsString('--test-array, -ta', $helpController->outputString);
     }
 
     /**
diff --git a/tests/framework/console/UnknownCommandExceptionTest.php b/tests/framework/console/UnknownCommandExceptionTest.php
index 63dd11ccd97..e042d80a3fc 100644
--- a/tests/framework/console/UnknownCommandExceptionTest.php
+++ b/tests/framework/console/UnknownCommandExceptionTest.php
@@ -16,7 +16,7 @@
  */
 class UnknownCommandExceptionTest extends TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'enableCoreCommands' => false,
diff --git a/tests/framework/console/controllers/AssetControllerTest.php b/tests/framework/console/controllers/AssetControllerTest.php
index f9fe4be33c2..a09a6e1fbab 100644
--- a/tests/framework/console/controllers/AssetControllerTest.php
+++ b/tests/framework/console/controllers/AssetControllerTest.php
@@ -32,7 +32,7 @@ class AssetControllerTest extends TestCase
      */
     protected $testAssetsBasePath = '';
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication();
         $this->testFilePath = Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . str_replace('\\', '_', get_class($this)) . uniqid();
@@ -41,7 +41,7 @@ public function setUp()
         $this->createDir($this->testAssetsBasePath);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->removeDir($this->testFilePath);
     }
@@ -258,7 +258,7 @@ public function testActionTemplate()
         $this->runAssetControllerAction('template', [$configFileName]);
         $this->assertFileExists($configFileName, 'Unable to create config file template!');
         $config = require $configFileName;
-        $this->assertInternalType('array', $config, 'Invalid config created!');
+        $this->assertIsArray($config, 'Invalid config created!');
     }
 
     public function testActionCompress()
@@ -304,7 +304,7 @@ public function testActionCompress()
         // Then :
         $this->assertFileExists($bundleFile, 'Unable to create output bundle file!');
         $compressedBundleConfig = require $bundleFile;
-        $this->assertInternalType('array', $compressedBundleConfig, 'Output bundle file has incorrect format!');
+        $this->assertIsArray($compressedBundleConfig, 'Output bundle file has incorrect format!');
         $this->assertCount(2, $compressedBundleConfig, 'Output bundle config contains wrong bundle count!');
 
         $this->assertArrayHasKey($assetBundleClassName, $compressedBundleConfig, 'Source bundle is lost!');
@@ -320,11 +320,19 @@ public function testActionCompress()
 
         $compressedCssFileContent = file_get_contents($compressedCssFileName);
         foreach ($cssFiles as $name => $content) {
-            $this->assertContains($content, $compressedCssFileContent, "Source of '{$name}' is missing in combined file!");
+            $this->assertStringContainsString(
+                $content,
+                $compressedCssFileContent,
+                "Source of '{$name}' is missing in combined file!",
+            );
         }
         $compressedJsFileContent = file_get_contents($compressedJsFileName);
         foreach ($jsFiles as $name => $content) {
-            $this->assertContains($content, $compressedJsFileContent, "Source of '{$name}' is missing in combined file!");
+            $this->assertStringContainsString(
+                $content,
+                $compressedJsFileContent,
+                "Source of '{$name}' is missing in combined file!",
+            );
         }
     }
 
@@ -384,7 +392,7 @@ public function testCompressExternalAsset()
         // Then :
         $this->assertFileExists($bundleFile, 'Unable to create output bundle file!');
         $compressedBundleConfig = require $bundleFile;
-        $this->assertInternalType('array', $compressedBundleConfig, 'Output bundle file has incorrect format!');
+        $this->assertIsArray($compressedBundleConfig, 'Output bundle file has incorrect format!');
         $this->assertArrayHasKey($externalAssetBundleClassName, $compressedBundleConfig, 'External bundle is lost!');
 
         $compressedExternalAssetConfig = $compressedBundleConfig[$externalAssetBundleClassName];
diff --git a/tests/framework/console/controllers/BaseMessageControllerTest.php b/tests/framework/console/controllers/BaseMessageControllerTest.php
index 90d77736209..31fd8405506 100644
--- a/tests/framework/console/controllers/BaseMessageControllerTest.php
+++ b/tests/framework/console/controllers/BaseMessageControllerTest.php
@@ -23,7 +23,7 @@ abstract class BaseMessageControllerTest extends TestCase
     protected $configFileName = '';
     protected $language = 'en';
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication();
         $this->sourcePath = Yii::getAlias('@yiiunit/runtime/test_source');
@@ -47,7 +47,7 @@ protected function generateConfigFileName()
         return $this->configFileName;
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         FileHelper::removeDirectory($this->sourcePath);
         if (file_exists($this->configFileName)) {
diff --git a/tests/framework/console/controllers/CacheControllerTest.php b/tests/framework/console/controllers/CacheControllerTest.php
index 907c6da4d3f..d38c5251c92 100644
--- a/tests/framework/console/controllers/CacheControllerTest.php
+++ b/tests/framework/console/controllers/CacheControllerTest.php
@@ -29,7 +29,7 @@ class CacheControllerTest extends TestCase
 
     private $driverName = 'mysql';
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -137,11 +137,10 @@ public function testNotFoundFlush()
         $this->assertEquals('firstValue', Yii::$app->firstCache->get('firstKey'), 'first cache data should not be flushed');
     }
 
-    /**
-     * @expectedException \yii\console\Exception
-     */
     public function testNothingToFlushException()
     {
+        $this->expectException(\yii\console\Exception::class);
+
         $this->_cacheController->actionFlush();
     }
 
diff --git a/tests/framework/console/controllers/DbMessageControllerTest.php b/tests/framework/console/controllers/DbMessageControllerTest.php
index 1c5707dab94..42b595a9c64 100644
--- a/tests/framework/console/controllers/DbMessageControllerTest.php
+++ b/tests/framework/console/controllers/DbMessageControllerTest.php
@@ -51,7 +51,7 @@ protected static function runConsoleAction($route, $params = [])
         }
     }
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         parent::setUpBeforeClass();
         $databases = static::getParam('databases');
@@ -65,7 +65,7 @@ public static function setUpBeforeClass()
         static::runConsoleAction('migrate/up', ['migrationPath' => '@yii/i18n/migrations/', 'interactive' => false]);
     }
 
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         static::runConsoleAction('migrate/down', ['migrationPath' => '@yii/i18n/migrations/', 'interactive' => false]);
         if (static::$db) {
@@ -75,7 +75,7 @@ public static function tearDownAfterClass()
         parent::tearDownAfterClass();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         parent::tearDown();
         Yii::$app = null;
diff --git a/tests/framework/console/controllers/FixtureControllerTest.php b/tests/framework/console/controllers/FixtureControllerTest.php
index 49ad96b31df..a7882d1f1a3 100644
--- a/tests/framework/console/controllers/FixtureControllerTest.php
+++ b/tests/framework/console/controllers/FixtureControllerTest.php
@@ -30,7 +30,7 @@ class FixtureControllerTest extends DatabaseTestCase
 
     protected $driverName = 'mysql';
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -46,7 +46,7 @@ protected function setUp()
         ], [null, null]); //id and module are null
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->_fixtureController = null;
         FixtureStorage::clear();
diff --git a/tests/framework/console/controllers/HelpControllerTest.php b/tests/framework/console/controllers/HelpControllerTest.php
index 68c4f61772f..1a67852f216 100644
--- a/tests/framework/console/controllers/HelpControllerTest.php
+++ b/tests/framework/console/controllers/HelpControllerTest.php
@@ -21,7 +21,7 @@ class HelpControllerTest extends TestCase
     /**
      * {@inheritdoc}
      */
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication();
     }
@@ -154,37 +154,37 @@ public function testActionUsage()
     public function testActionIndex()
     {
         $result = Console::stripAnsiFormat($this->runControllerAction('index'));
-        $this->assertContains('This is Yii version ', $result);
-        $this->assertContains('The following commands are available:', $result);
-        $this->assertContains('To see the help of each command, enter:', $result);
-        $this->assertContains('bootstrap.php help', $result);
+        $this->assertStringContainsString('This is Yii version ', $result);
+        $this->assertStringContainsString('The following commands are available:', $result);
+        $this->assertStringContainsString('To see the help of each command, enter:', $result);
+        $this->assertStringContainsString('bootstrap.php help', $result);
     }
 
     public function testActionIndexWithHelpCommand()
     {
         $result = Console::stripAnsiFormat($this->runControllerAction('index', ['command' => 'help/index']));
-        $this->assertContains('Displays available commands or the detailed information', $result);
-        $this->assertContains('bootstrap.php help [command] [...options...]', $result);
-        $this->assertContains('--appconfig: string', $result);
-        $this->assertContains('- command: string', $result);
-        $this->assertContains('--color: boolean, 0 or 1', $result);
-        $this->assertContains('--help, -h: boolean, 0 or 1', $result);
-        $this->assertContains('--interactive: boolean, 0 or 1 (defaults to 1)', $result);
+        $this->assertStringContainsString('Displays available commands or the detailed information', $result);
+        $this->assertStringContainsString('bootstrap.php help [command] [...options...]', $result);
+        $this->assertStringContainsString('--appconfig: string', $result);
+        $this->assertStringContainsString('- command: string', $result);
+        $this->assertStringContainsString('--color: boolean, 0 or 1', $result);
+        $this->assertStringContainsString('--help, -h: boolean, 0 or 1', $result);
+        $this->assertStringContainsString('--interactive: boolean, 0 or 1 (defaults to 1)', $result);
     }
 
     public function testActionIndexWithServeCommand()
     {
         $result = Console::stripAnsiFormat($this->runControllerAction('index', ['command' => 'serve']));
-        $this->assertContains('Runs PHP built-in web server', $result);
-        $this->assertContains('bootstrap.php serve [address] [...options...]', $result);
-        $this->assertContains('- address: string (defaults to \'localhost\')', $result);
-        $this->assertContains('--appconfig: string', $result);
-        $this->assertContains('--color: boolean, 0 or 1', $result);
-        $this->assertContains('--docroot, -t: string (defaults to \'@app/web\')', $result);
-        $this->assertContains('--help, -h: boolean, 0 or 1', $result);
-        $this->assertContains('--interactive: boolean, 0 or 1 (defaults to 1)', $result);
-        $this->assertContains('--port, -p: int (defaults to 8080)', $result);
-        $this->assertContains('--router, -r: string', $result);
+        $this->assertStringContainsString('Runs PHP built-in web server', $result);
+        $this->assertStringContainsString('bootstrap.php serve [address] [...options...]', $result);
+        $this->assertStringContainsString('- address: string (defaults to \'localhost\')', $result);
+        $this->assertStringContainsString('--appconfig: string', $result);
+        $this->assertStringContainsString('--color: boolean, 0 or 1', $result);
+        $this->assertStringContainsString('--docroot, -t: string (defaults to \'@app/web\')', $result);
+        $this->assertStringContainsString('--help, -h: boolean, 0 or 1', $result);
+        $this->assertStringContainsString('--interactive: boolean, 0 or 1 (defaults to 1)', $result);
+        $this->assertStringContainsString('--port, -p: int (defaults to 8080)', $result);
+        $this->assertStringContainsString('--router, -r: string', $result);
     }
 
     public function testActionListContainsNoEmptyCommands()
@@ -194,9 +194,9 @@ public function testActionListContainsNoEmptyCommands()
             'controllerNamespace' => 'yiiunit\data\console\controllers',
         ]);
         $result = Console::stripAnsiFormat($this->runControllerAction('list'));
-        $this->assertNotContains("fake-empty\n", $result);
-        $this->assertNotContains("fake-no-default\n", $result);
-        $this->assertContains("fake-no-default/index\n", $result);
+        $this->assertStringNotContainsString("fake-empty\n", $result);
+        $this->assertStringNotContainsString("fake-no-default\n", $result);
+        $this->assertStringContainsString("fake-no-default/index\n", $result);
     }
 
     public function testActionIndexContainsNoEmptyCommands()
@@ -206,14 +206,13 @@ public function testActionIndexContainsNoEmptyCommands()
             'controllerNamespace' => 'yiiunit\data\console\controllers',
         ]);
         $result = Console::stripAnsiFormat($this->runControllerAction('index'));
-        $this->assertNotContains("- fake-empty", $result);
-        $this->assertContains("- fake-no-default", $result);
-        $this->assertContains("    fake-no-default/index", $result);
-        $this->assertNotContains("    fake-no-default/index (default)", $result);
+        $this->assertStringNotContainsString("- fake-empty", $result);
+        $this->assertStringContainsString("- fake-no-default", $result);
+        $this->assertStringContainsString("    fake-no-default/index", $result);
+        $this->assertStringNotContainsString("    fake-no-default/index (default)", $result);
     }
 }
 
-
 class BufferedHelpController extends HelpController
 {
     use StdOutBufferControllerTrait;
diff --git a/tests/framework/console/controllers/MigrateControllerTest.php b/tests/framework/console/controllers/MigrateControllerTest.php
index 714b233b82b..72afa98c97e 100644
--- a/tests/framework/console/controllers/MigrateControllerTest.php
+++ b/tests/framework/console/controllers/MigrateControllerTest.php
@@ -26,7 +26,7 @@ class MigrateControllerTest extends TestCase
 {
     use MigrateControllerTestTrait;
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->migrateControllerClass = EchoMigrateController::className();
         $this->migrationBaseClass = Migration::className();
@@ -44,7 +44,7 @@ public function setUp()
         parent::setUp();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->tearDownMigrationPath();
         parent::tearDown();
diff --git a/tests/framework/console/controllers/MigrateControllerTestTrait.php b/tests/framework/console/controllers/MigrateControllerTestTrait.php
index bb71b5df1a9..328adaa20ff 100644
--- a/tests/framework/console/controllers/MigrateControllerTestTrait.php
+++ b/tests/framework/console/controllers/MigrateControllerTestTrait.php
@@ -59,7 +59,7 @@ public function setUpMigrationPath()
         }
     }
 
-    public function tearDownMigrationPath()
+    public function tearDownMigrationPath(): void
     {
         FileHelper::removeDirectory($this->migrationPath);
         FileHelper::removeDirectory(Yii::getAlias('@yiiunit/runtime/app_migrations'));
@@ -394,7 +394,7 @@ public function testNamespaceCreate()
         $files = FileHelper::findFiles($this->migrationPath);
         $fileContent = file_get_contents($files[0]);
         $this->assertContains("namespace {$this->migrationNamespace};", $fileContent);
-        $this->assertRegExp('/class M[0-9]{12}' . ucfirst($migrationName) . '/s', $fileContent);
+        $this->assertMatchesRegularExpression('/class M[0-9]{12}' . ucfirst($migrationName) . '/s', $fileContent);
         unlink($files[0]);
 
         // namespace specify :
@@ -487,8 +487,8 @@ public function testNamespaceHistory()
 
         $output = $this->runMigrateControllerAction('history', [], $controllerConfig);
         $this->assertSame(ExitCode::OK, $this->getExitCode());
-        $this->assertRegExp('/' . preg_quote($this->migrationNamespace) . '.*History1/s', $output);
-        $this->assertRegExp('/' . preg_quote($this->migrationNamespace) . '.*History2/s', $output);
+        $this->assertMatchesRegularExpression('/' . preg_quote($this->migrationNamespace) . '.*History1/s', $output);
+        $this->assertMatchesRegularExpression('/' . preg_quote($this->migrationNamespace) . '.*History2/s', $output);
     }
 
     /**
diff --git a/tests/framework/console/controllers/PHPMessageControllerTest.php b/tests/framework/console/controllers/PHPMessageControllerTest.php
index d3a8074a665..54109856f05 100644
--- a/tests/framework/console/controllers/PHPMessageControllerTest.php
+++ b/tests/framework/console/controllers/PHPMessageControllerTest.php
@@ -18,14 +18,14 @@ class PHPMessageControllerTest extends BaseMessageControllerTest
 {
     protected $messagePath;
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
         $this->messagePath = Yii::getAlias('@yiiunit/runtime/test_messages');
         FileHelper::createDirectory($this->messagePath, 0777);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         parent::tearDown();
         FileHelper::removeDirectory($this->messagePath);
@@ -165,7 +165,7 @@ public function testRemoveUnusedBehavior($category, $isUnused, $removeUnused, $i
         if ($isExpectedToExist) {
             $this->assertFileExists($filePath);
         } else {
-            $this->assertFileNotExists($filePath);
+            $this->assertFileDoesNotExist($filePath);
         }
     }
 }
diff --git a/tests/framework/console/controllers/POMessageControllerTest.php b/tests/framework/console/controllers/POMessageControllerTest.php
index 0aac7f2c8d3..321631818f0 100644
--- a/tests/framework/console/controllers/POMessageControllerTest.php
+++ b/tests/framework/console/controllers/POMessageControllerTest.php
@@ -19,7 +19,7 @@ class POMessageControllerTest extends BaseMessageControllerTest
     protected $messagePath;
     protected $catalog = 'messages';
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
@@ -27,7 +27,7 @@ public function setUp()
         FileHelper::createDirectory($this->messagePath, 0777);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         parent::tearDown();
         FileHelper::removeDirectory($this->messagePath);
diff --git a/tests/framework/console/widgets/TableTest.php b/tests/framework/console/widgets/TableTest.php
index 796c95ad1d6..24f533cdf96 100644
--- a/tests/framework/console/widgets/TableTest.php
+++ b/tests/framework/console/widgets/TableTest.php
@@ -16,7 +16,7 @@
  */
 class TableTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -502,7 +502,7 @@ public function testColorizedInputStripsANSIMarkersInternally()
             ->setScreenWidth(200)
             ->run();
 
-        $columnWidths = \PHPUnit_Framework_Assert::readAttribute($table, "columnWidths");
+        $columnWidths = $table->getColumnWidths();
 
         $this->assertArrayHasKey(1, $columnWidths);
         $this->assertEquals(4+2, $columnWidths[1]);
diff --git a/tests/framework/data/ActiveDataFilterTest.php b/tests/framework/data/ActiveDataFilterTest.php
index 9e4fbe7ca62..a4763fd81ad 100644
--- a/tests/framework/data/ActiveDataFilterTest.php
+++ b/tests/framework/data/ActiveDataFilterTest.php
@@ -13,7 +13,7 @@
 
 class ActiveDataFilterTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/data/ActiveDataProviderTest.php b/tests/framework/data/ActiveDataProviderTest.php
index 57f866ee809..af96dfef267 100644
--- a/tests/framework/data/ActiveDataProviderTest.php
+++ b/tests/framework/data/ActiveDataProviderTest.php
@@ -26,7 +26,7 @@
  */
 abstract class ActiveDataProviderTest extends DatabaseTestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         ActiveRecord::$db = $this->getConnection();
@@ -132,7 +132,7 @@ public function testQuery()
         ]);
         $orders = $provider->getModels();
         $this->assertCount(3, $orders);
-        $this->assertInternalType('array', $orders[0]);
+        $this->assertIsArray($orders[0]);
         $this->assertEquals([0, 1, 2], $provider->getKeys());
 
         $query = new Query();
diff --git a/tests/framework/data/ArrayDataProviderTest.php b/tests/framework/data/ArrayDataProviderTest.php
index 6c9af6e98bf..84944d511b6 100644
--- a/tests/framework/data/ArrayDataProviderTest.php
+++ b/tests/framework/data/ArrayDataProviderTest.php
@@ -15,7 +15,7 @@
  */
 class ArrayDataProviderTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/data/DataFilterTest.php b/tests/framework/data/DataFilterTest.php
index 1508a28ccde..aec273c9a5b 100644
--- a/tests/framework/data/DataFilterTest.php
+++ b/tests/framework/data/DataFilterTest.php
@@ -17,7 +17,7 @@
  */
 class DataFilterTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/data/PaginationTest.php b/tests/framework/data/PaginationTest.php
index a50cba3745c..4dee36e6d3e 100644
--- a/tests/framework/data/PaginationTest.php
+++ b/tests/framework/data/PaginationTest.php
@@ -16,7 +16,7 @@
  */
 class PaginationTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockWebApplication([
diff --git a/tests/framework/data/SortTest.php b/tests/framework/data/SortTest.php
index c9bb1884212..27a4659cbc7 100644
--- a/tests/framework/data/SortTest.php
+++ b/tests/framework/data/SortTest.php
@@ -19,7 +19,7 @@
  */
 class SortTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/db/ActiveQueryModelConnectionTest.php b/tests/framework/db/ActiveQueryModelConnectionTest.php
index 86dff975fd4..e14b6824d4b 100644
--- a/tests/framework/db/ActiveQueryModelConnectionTest.php
+++ b/tests/framework/db/ActiveQueryModelConnectionTest.php
@@ -17,7 +17,7 @@ class ActiveQueryModelConnectionTest extends TestCase
     private $globalConnection;
     private $modelConnection;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->globalConnection = $this->getMockBuilder('yii\db\Connection')->getMock();
         $this->modelConnection = $this->getMockBuilder('yii\db\Connection')->getMock();
diff --git a/tests/framework/db/ActiveQueryTest.php b/tests/framework/db/ActiveQueryTest.php
index 3d3f451865c..5927d2d9869 100644
--- a/tests/framework/db/ActiveQueryTest.php
+++ b/tests/framework/db/ActiveQueryTest.php
@@ -22,7 +22,7 @@
  */
 abstract class ActiveQueryTest extends DatabaseTestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
         ActiveRecord::$db = $this->getConnection();
diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php
index b74803b94dd..18ec7caa1f0 100644
--- a/tests/framework/db/ActiveRecordTest.php
+++ b/tests/framework/db/ActiveRecordTest.php
@@ -44,7 +44,7 @@ abstract class ActiveRecordTest extends DatabaseTestCase
 {
     use ActiveRecordTestTrait;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         ActiveRecord::$db = $this->getConnection();
@@ -199,7 +199,7 @@ public function testFindLazyViaTable()
         $this->assertCount(0, $order->books);
 
         $order = Order::find()->where(['id' => 1])->asArray()->one();
-        $this->assertInternalType('array', $order);
+        $this->assertIsArray($order);
     }
 
     public function testFindEagerViaTable()
@@ -225,10 +225,10 @@ public function testFindEagerViaTable()
         // https://github.com/yiisoft/yii2/issues/1402
         $orders = Order::find()->with('books')->orderBy('id')->asArray()->all();
         $this->assertCount(3, $orders);
-        $this->assertInternalType('array', $orders[0]['orderItems'][0]);
+        $this->assertIsArray($orders[0]['orderItems'][0]);
 
         $order = $orders[0];
-        $this->assertInternalType('array', $order);
+        $this->assertIsArray($order);
         $this->assertEquals(1, $order['id']);
         $this->assertCount(2, $order['books']);
         $this->assertEquals(1, $order['books'][0]['id']);
@@ -1123,7 +1123,7 @@ public function testFindSimpleRelationWithJoin()
         $this->assertInstanceOf('yiiunit\data\ar\Customer', $customerWithJoin);
 
         $customerWithJoinIndexOrdered = $order->customerJoinedWithProfileIndexOrdered;
-        $this->assertInternalType('array', $customerWithJoinIndexOrdered);
+        $this->assertIsArray($customerWithJoinIndexOrdered);
         $this->assertArrayHasKey('user1', $customerWithJoinIndexOrdered);
         $this->assertInstanceOf('yiiunit\data\ar\Customer', $customerWithJoinIndexOrdered['user1']);
     }
@@ -1424,38 +1424,6 @@ public function testUnlinkAllViaTable()
         $this->assertEquals(5, $itemClass::find()->count());
     }
 
-    /**
-     * @requires PHP 5.6
-     */
-    public function testCastValues()
-    {
-        $model = new Type();
-        $model->int_col = 123;
-        $model->int_col2 = 456;
-        $model->smallint_col = 42;
-        $model->char_col = '1337';
-        $model->char_col2 = 'test';
-        $model->char_col3 = 'test123';
-        $model->float_col = 3.742;
-        $model->float_col2 = 42.1337;
-        $model->bool_col = true;
-        $model->bool_col2 = false;
-        $model->save(false);
-
-        /* @var $model Type */
-        $model = Type::find()->one();
-        $this->assertSame(123, $model->int_col);
-        $this->assertSame(456, $model->int_col2);
-        $this->assertSame(42, $model->smallint_col);
-        $this->assertSame('1337', trim($model->char_col));
-        $this->assertSame('test', $model->char_col2);
-        $this->assertSame('test123', $model->char_col3);
-//        $this->assertSame(1337.42, $model->float_col);
-//        $this->assertSame(42.1337, $model->float_col2);
-//        $this->assertSame(true, $model->bool_col);
-//        $this->assertSame(false, $model->bool_col2);
-    }
-
     public function testIssues()
     {
         // https://github.com/yiisoft/yii2/issues/4938
@@ -1934,6 +1902,8 @@ public function legalValuesForFindByCondition()
      */
     public function testLegalValuesForFindByCondition($modelClassName, $validFilter)
     {
+        $this->expectNotToPerformAssertions();
+
         /** @var Query $query */
         $query = $this->invokeMethod(\Yii::createObject($modelClassName), 'findByCondition', [$validFilter]);
         Customer::getDb()->queryBuilder->build($query);
@@ -1970,11 +1940,15 @@ public function illegalValuesForFindByCondition()
 
     /**
      * @dataProvider illegalValuesForFindByCondition
+     *
+     * @param string $modelClassName The model class name.
+     * @param array $filterWithInjection The filter with injection.
      */
-    public function testValueEscapingInFindByCondition($modelClassName, $filterWithInjection)
+    public function testValueEscapingInFindByCondition(string $modelClassName, array $filterWithInjection): void
     {
-        $this->expectException('yii\base\InvalidArgumentException');
-        $this->expectExceptionMessageRegExp('/^Key "(.+)?" is not a column name and can not be used as a filter$/');
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessageMatches('/^Key "(.+)?" is not a column name and can not be used as a filter$/');
+
         /** @var Query $query */
         $query = $this->invokeMethod(\Yii::createObject($modelClassName), 'findByCondition', $filterWithInjection);
         Customer::getDb()->queryBuilder->build($query);
@@ -2096,16 +2070,6 @@ public function testIssetException()
         $this->assertFalse(isset($cat->exception));
     }
 
-    /**
-     * @requires PHP 7
-     */
-    public function testIssetThrowable()
-    {
-        $cat = new Cat();
-        $this->assertFalse(isset($cat->throwable));
-
-    }
-
     /**
      * @see https://github.com/yiisoft/yii2/issues/15482
      */
diff --git a/tests/framework/db/BaseActiveRecordTest.php b/tests/framework/db/BaseActiveRecordTest.php
index 0427421cd81..1ef9013aa77 100644
--- a/tests/framework/db/BaseActiveRecordTest.php
+++ b/tests/framework/db/BaseActiveRecordTest.php
@@ -6,7 +6,7 @@
 
 abstract class BaseActiveRecordTest extends DatabaseTestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         ActiveRecord::$db = $this->getConnection();
diff --git a/tests/framework/db/BatchQueryResultTest.php b/tests/framework/db/BatchQueryResultTest.php
index 54487083e72..61667e7b35c 100644
--- a/tests/framework/db/BatchQueryResultTest.php
+++ b/tests/framework/db/BatchQueryResultTest.php
@@ -14,7 +14,7 @@
 
 abstract class BatchQueryResultTest extends DatabaseTestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
         ActiveRecord::$db = $this->getConnection();
diff --git a/tests/framework/db/CommandTest.php b/tests/framework/db/CommandTest.php
index 041b788f3c1..7cfd2dd794f 100644
--- a/tests/framework/db/CommandTest.php
+++ b/tests/framework/db/CommandTest.php
@@ -193,7 +193,7 @@ public function testBindParamValue()
             $command->bindParam(':blob_col', $blobCol);
             $command->bindParam(':bool_col', $boolCol, \PDO::PARAM_BOOL);
         } else {
-            $floatCol = 1.23;
+            $floatCol = 1.230;
             $numericCol = '1.23';
             $blobCol = "\x10\x11\x12";
             $boolCol = false;
@@ -205,18 +205,18 @@ public function testBindParamValue()
         $this->assertEquals(1, $command->execute());
 
         $command = $db->createCommand('SELECT [[int_col]], [[char_col]], [[float_col]], [[blob_col]], [[numeric_col]], [[bool_col]] FROM {{type}}');
-//        $command->prepare();
-//        $command->pdoStatement->bindColumn('blob_col', $bc, \PDO::PARAM_LOB);
+        // $command->prepare();
+        // $command->pdoStatement->bindColumn('blob_col', $bc, \PDO::PARAM_LOB);
         $row = $command->queryOne();
         $this->assertEquals($intCol, $row['int_col']);
         $this->assertEquals($charCol, $row['char_col']);
-        $this->assertEquals($floatCol, $row['float_col']);
+        $this->assertEquals($floatCol, (float) $row['float_col']);
         if ($this->driverName === 'mysql' || $this->driverName === 'sqlite' || $this->driverName === 'oci') {
             $this->assertEquals($blobCol, $row['blob_col']);
         } elseif (\defined('HHVM_VERSION') && $this->driverName === 'pgsql') {
             // HHVMs pgsql implementation does not seem to support blob columns correctly.
         } else {
-            $this->assertInternalType('resource', $row['blob_col']);
+            $this->assertIsResource($row['blob_col']);
             $this->assertEquals($blobCol, stream_get_contents($row['blob_col']));
         }
         $this->assertEquals($numericCol, $row['numeric_col']);
@@ -281,7 +281,7 @@ public function testFetchMode()
         $command = $db->createCommand($sql);
         $command->fetchMode = \PDO::FETCH_OBJ;
         $result = $command->queryOne();
-        $this->assertInternalType('object', $result);
+        $this->assertIsObject($result);
 
         // FETCH_NUM, customized in query method
         $sql = 'SELECT * FROM {{customer}}';
@@ -623,9 +623,8 @@ public function invalidSelectColumns()
      * Test INSERT INTO ... SELECT SQL statement with wrong query object.
      *
      * @dataProvider invalidSelectColumns
-     * @expectedException \yii\base\InvalidParamException
-     * @expectedExceptionMessage Expected select query object with enumerated (named) parameters
-     * @param mixed $invalidSelectColumns
+     *
+     * @param array|string $invalidSelectColumns Invalid select columns.
      */
     public function testInsertSelectFailed($invalidSelectColumns)
     {
@@ -634,10 +633,11 @@ public function testInsertSelectFailed($invalidSelectColumns)
 
         $db = $this->getConnection();
         $command = $db->createCommand();
-        $command->insert(
-            '{{customer}}',
-            $query
-        )->execute();
+
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Expected select query object with enumerated (named) parameters');
+
+        $command->insert('{{customer}}', $query)->execute();
     }
 
     public function testInsertExpression()
@@ -1222,7 +1222,7 @@ public function testAddDropCheck()
 
         $this->assertEmpty($schema->getTableChecks($tableName, true));
         $db->createCommand()->addCheck($name, $tableName, '[[int1]] > 1')->execute();
-        $this->assertRegExp('/^.*int1.*>.*1.*$/', $schema->getTableChecks($tableName, true)[0]->expression);
+        $this->assertMatchesRegularExpression('/^.*int1.*>.*1.*$/', $schema->getTableChecks($tableName, true)[0]->expression);
 
         $db->createCommand()->dropCheck($name, $tableName)->execute();
         $this->assertEmpty($schema->getTableChecks($tableName, true));
diff --git a/tests/framework/db/ConnectionTest.php b/tests/framework/db/ConnectionTest.php
index a155517ffdf..ed38ed785bb 100644
--- a/tests/framework/db/ConnectionTest.php
+++ b/tests/framework/db/ConnectionTest.php
@@ -224,12 +224,12 @@ public function testTransactionIsolation()
         $this->assertTrue(true); // should not be any exception so far
     }
 
-    /**
-     * @expectedException \Exception
-     */
     public function testTransactionShortcutException()
     {
         $connection = $this->getConnection(true);
+
+        $this->expectException(\Exception::class);
+
         $connection->transaction(function () use ($connection) {
             $connection->createCommand()->insert('profile', ['description' => 'test transaction shortcut'])->execute();
             throw new \Exception('Exception in transaction shortcut');
@@ -400,7 +400,11 @@ private function runExceptionTest($connection)
         try {
             $connection->createCommand('INSERT INTO qlog1(a) VALUES(:a);', [':a' => 1])->execute();
         } catch (\yii\db\Exception $e) {
-            $this->assertContains('INSERT INTO qlog1(a) VALUES(1);', $e->getMessage(), 'Exception message should contain raw SQL query: ' . (string) $e);
+            $this->assertStringContainsString(
+                'INSERT INTO qlog1(a) VALUES(1);',
+                $e->getMessage(),
+                'Exception message should contain raw SQL query: ' . (string) $e
+            );
             $thrown = true;
         }
         $this->assertTrue($thrown, 'An exception should have been thrown by the command.');
@@ -409,7 +413,10 @@ private function runExceptionTest($connection)
         try {
             $connection->createCommand('SELECT * FROM qlog1 WHERE id=:a ORDER BY nonexistingcolumn;', [':a' => 1])->queryAll();
         } catch (\yii\db\Exception $e) {
-            $this->assertContains('SELECT * FROM qlog1 WHERE id=1 ORDER BY nonexistingcolumn;', $e->getMessage(), 'Exception message should contain raw SQL query: ' . (string) $e);
+            $this->assertStringContainsString(
+                'SELECT * FROM qlog1 WHERE id=1 ORDER BY nonexistingcolumn;',
+                $e->getMessage(), 'Exception message should contain raw SQL query: ' . (string) $e,
+            );
             $thrown = true;
         }
         $this->assertTrue($thrown, 'An exception should have been thrown by the command.');
diff --git a/tests/framework/db/DatabaseTestCase.php b/tests/framework/db/DatabaseTestCase.php
index 53ea945623e..c9275ebcfaf 100644
--- a/tests/framework/db/DatabaseTestCase.php
+++ b/tests/framework/db/DatabaseTestCase.php
@@ -24,7 +24,7 @@ abstract class DatabaseTestCase extends TestCase
     private $_db;
 
 
-    protected function setUp()
+    protected function setUp(): void
     {
         if ($this->driverName === null) {
             throw new \Exception('driverName is not set for a DatabaseTestCase.');
@@ -44,7 +44,7 @@ protected function setUp()
         $this->mockApplication();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         if ($this->_db) {
             $this->_db->close();
diff --git a/tests/framework/db/QueryTest.php b/tests/framework/db/QueryTest.php
index 4de29107045..515f70a485a 100644
--- a/tests/framework/db/QueryTest.php
+++ b/tests/framework/db/QueryTest.php
@@ -333,8 +333,7 @@ public function testLimitOffsetWithExpression()
         $this->assertCount(2, $result);
 
         $this->assertNotContains(1, $result);
-        $this->assertContains(2, $result);
-        $this->assertContains(3, $result);
+        $this->assertEquals([2, 3], $result);
     }
 
     public function testUnion()
diff --git a/tests/framework/db/SchemaTest.php b/tests/framework/db/SchemaTest.php
index af02b2170b6..618c39848ed 100644
--- a/tests/framework/db/SchemaTest.php
+++ b/tests/framework/db/SchemaTest.php
@@ -528,7 +528,7 @@ public function testColumnSchema()
             $this->assertSame($expected['precision'], $column->precision, "precision of column $name does not match.");
             $this->assertSame($expected['scale'], $column->scale, "scale of column $name does not match.");
             if (\is_object($expected['defaultValue'])) {
-                $this->assertInternalType('object', $column->defaultValue, "defaultValue of column $name is expected to be an object but it is not.");
+                $this->assertIsObject($column->defaultValue, "defaultValue of column $name is expected to be an object but it is not.");
                 $this->assertEquals((string)$expected['defaultValue'], (string)$column->defaultValue, "defaultValue of column $name does not match.");
             } else {
                 $this->assertEquals($expected['defaultValue'], $column->defaultValue, "defaultValue of column $name does not match.");
@@ -782,12 +782,25 @@ public function testTableSchemaConstraintsWithPdoLowercase($tableName, $type, $e
 
     private function assertMetadataEquals($expected, $actual)
     {
-        $this->assertInternalType(strtolower(\gettype($expected)), $actual);
+        switch (\strtolower(\gettype($expected))) {
+            case 'object':
+                $this->assertIsObject($actual);
+                break;
+            case 'array':
+                $this->assertIsArray($actual);
+                break;
+            case 'null':
+                $this->assertNull($actual);
+                break;
+        }
+
         if (\is_array($expected)) {
             $this->normalizeArrayKeys($expected, false);
             $this->normalizeArrayKeys($actual, false);
         }
+
         $this->normalizeConstraints($expected, $actual);
+
         if (\is_array($expected)) {
             $this->normalizeArrayKeys($expected, true);
             $this->normalizeArrayKeys($actual, true);
diff --git a/tests/framework/db/mssql/CommandTest.php b/tests/framework/db/mssql/CommandTest.php
index 25a58a3a9e4..e574ddc56c3 100644
--- a/tests/framework/db/mssql/CommandTest.php
+++ b/tests/framework/db/mssql/CommandTest.php
@@ -55,7 +55,7 @@ public function testBindParamValue()
         $command = $db->createCommand($sql);
         $intCol = 123;
         $charCol = 'abc';
-        $floatCol = 1.23;
+        $floatCol = 1.230;
         $blobCol = "\x10\x11\x12";
         $numericCol = '1.23';
         $boolCol = false;
@@ -71,7 +71,7 @@ public function testBindParamValue()
         $row = $db->createCommand($sql)->queryOne();
         $this->assertEquals($intCol, $row['int_col']);
         $this->assertEquals($charCol, trim($row['char_col']));
-        $this->assertEquals($floatCol, $row['float_col']);
+        $this->assertEquals($floatCol, (float) $row['float_col']);
         $this->assertEquals($blobCol, $row['blob_col']);
         $this->assertEquals($numericCol, $row['numeric_col']);
 
@@ -101,7 +101,7 @@ public function testAddDropDefaultValue()
         $db = $this->getConnection(false);
         $tableName = 'test_def';
         $name = 'test_def_constraint';
-        /** @var \yii\db\pgsql\Schema $schema */
+        /** @var \yii\db\mssql\Schema $schema */
         $schema = $db->getSchema();
 
         if ($schema->getTableSchema($tableName) !== null) {
@@ -113,7 +113,7 @@ public function testAddDropDefaultValue()
 
         $this->assertEmpty($schema->getTableDefaultValues($tableName, true));
         $db->createCommand()->addDefaultValue($name, $tableName, 'int1', 41)->execute();
-        $this->assertRegExp('/^.*41.*$/', $schema->getTableDefaultValues($tableName, true)[0]->value);
+        $this->assertMatchesRegularExpression('/^.*41.*$/', $schema->getTableDefaultValues($tableName, true)[0]->value);
 
         $db->createCommand()->dropDefaultValue($name, $tableName)->execute();
         $this->assertEmpty($schema->getTableDefaultValues($tableName, true));
diff --git a/tests/framework/db/mysql/QueryTest.php b/tests/framework/db/mysql/QueryTest.php
index 9f647308c6f..8e1cf44144e 100644
--- a/tests/framework/db/mysql/QueryTest.php
+++ b/tests/framework/db/mysql/QueryTest.php
@@ -43,9 +43,7 @@ public function testLimitOffsetWithExpression()
         $result = $query->column($this->getConnection());
 
         $this->assertCount(2, $result);
-
         $this->assertNotContains(1, $result);
-        $this->assertContains(2, $result);
-        $this->assertContains(3, $result);
+        $this->assertEquals([2, 3], $result);
     }
 }
diff --git a/tests/framework/db/pgsql/ArrayParserTest.php b/tests/framework/db/pgsql/ArrayParserTest.php
index 1962676180a..fdea8c9b20a 100644
--- a/tests/framework/db/pgsql/ArrayParserTest.php
+++ b/tests/framework/db/pgsql/ArrayParserTest.php
@@ -12,7 +12,7 @@ class ArrayParserTest extends TestCase
      */
     protected $arrayParser;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/db/pgsql/ConnectionTest.php b/tests/framework/db/pgsql/ConnectionTest.php
index 2baa79e3b8d..c3a6d0c68eb 100644
--- a/tests/framework/db/pgsql/ConnectionTest.php
+++ b/tests/framework/db/pgsql/ConnectionTest.php
@@ -19,7 +19,7 @@ class ConnectionTest extends \yiiunit\framework\db\ConnectionTest
 
     public function testConnection()
     {
-        $this->assertInternalType('object', $this->getConnection(true));
+        $this->assertIsObject($this->getConnection(true));
     }
 
     public function testQuoteValue()
diff --git a/tests/framework/di/ContainerTest.php b/tests/framework/di/ContainerTest.php
index 4df6140a819..2dbe0e5609d 100644
--- a/tests/framework/di/ContainerTest.php
+++ b/tests/framework/di/ContainerTest.php
@@ -40,7 +40,7 @@
  */
 class ContainerTest extends TestCase
 {
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         Yii::$container = new Container();
@@ -443,11 +443,10 @@ public function testGetByClassIndirectly()
         $this->assertSame(42, $qux->a);
     }
 
-    /**
-     * @expectedException \yii\base\InvalidConfigException
-     */
     public function testThrowingNotFoundException()
     {
+        $this->expectException(\yii\di\NotInstantiableException::class);
+
         $container = new Container();
         $container->get('non_existing');
     }
@@ -480,31 +479,6 @@ public function testContainerSingletons()
         $this->assertSame($foo, $sameFoo);
     }
 
-    /**
-     * @requires PHP 5.6
-     */
-    public function testVariadicConstructor()
-    {
-        if (\defined('HHVM_VERSION')) {
-            static::markTestSkipped('Can not test on HHVM because it does not support variadics.');
-        }
-
-        $container = new Container();
-        $container->get('yiiunit\framework\di\stubs\Variadic');
-    }
-
-    /**
-     * @requires PHP 5.6
-     */
-    public function testVariadicCallable()
-    {
-        if (\defined('HHVM_VERSION')) {
-            static::markTestSkipped('Can not test on HHVM because it does not support variadics.');
-        }
-
-        require __DIR__ . '/testContainerWithVariadicCallable.php';
-    }
-
     /**
      * @see https://github.com/yiisoft/yii2/issues/18245
      */
@@ -512,7 +486,7 @@ public function testDelayedInitializationOfSubArray()
     {
         $definitions = [
             'test' => [
-                'class' => Corge::className(),
+                'class' => Corge::class,
                 '__construct()' => [
                     [Instance::of('setLater')],
                 ],
@@ -520,7 +494,7 @@ public function testDelayedInitializationOfSubArray()
         ];
 
         $application = Yii::createObject([
-            '__class' => \yii\web\Application::className(),
+            '__class' => \yii\web\Application::class,
             'basePath' => __DIR__,
             'id' => 'test',
             'components' => [
@@ -534,7 +508,8 @@ public function testDelayedInitializationOfSubArray()
         ]);
 
         Yii::$container->set('setLater', new Qux());
-        Yii::$container->get('test');
+
+        $this->assertInstanceOf(Corge::class, Yii::$container->get('test'));
     }
 
     /**
diff --git a/tests/framework/di/InstanceTest.php b/tests/framework/di/InstanceTest.php
index fe61a6bdf95..8fbd87ebf3c 100644
--- a/tests/framework/di/InstanceTest.php
+++ b/tests/framework/di/InstanceTest.php
@@ -21,7 +21,7 @@
  */
 class InstanceTest extends TestCase
 {
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         Yii::$container = new Container();
@@ -58,8 +58,9 @@ public function testEnsure()
     public function testEnsure_NonExistingComponentException()
     {
         $container = new Container();
-        $this->expectException('yii\base\InvalidConfigException');
-        $this->expectExceptionMessageRegExp('/^Failed to instantiate component or class/i');
+        $this->expectException(\yii\base\InvalidConfigException::class);
+        $this->expectExceptionMessageMatches('/^Failed to instantiate component or class/i');
+
         Instance::ensure('cache', 'yii\cache\Cache', $container);
     }
 
@@ -69,8 +70,9 @@ public function testEnsure_NonExistingComponentException()
     public function testEnsure_NonExistingClassException()
     {
         $container = new Container();
-        $this->expectException('yii\base\InvalidConfigException');
-        $this->expectExceptionMessageRegExp('/^Failed to instantiate component or class/i');
+        $this->expectException(\yii\base\InvalidConfigException::class);
+        $this->expectExceptionMessageMatches('/^Failed to instantiate component or class/i');
+
         Instance::ensure('yii\cache\DoesNotExist', 'yii\cache\Cache', $container);
     }
 
@@ -171,7 +173,7 @@ public function testRestoreAfterVarExport()
         $instance = Instance::of('something');
         $export = var_export($instance, true);
 
-        $this->assertRegExp('~yii\\\\di\\\\Instance::__set_state\(array\(\s+\'id\' => \'something\',\s+\'optional\' => false,\s+\)\)~', $export);
+        $this->assertMatchesRegularExpression('~yii\\\\di\\\\Instance::__set_state\(array\(\s+\'id\' => \'something\',\s+\'optional\' => false,\s+\)\)~', $export);
 
         $this->assertEquals($instance, Instance::__set_state([
             'id' => 'something',
diff --git a/tests/framework/filters/AccessRuleTest.php b/tests/framework/filters/AccessRuleTest.php
index 620766788d8..56bcd341574 100644
--- a/tests/framework/filters/AccessRuleTest.php
+++ b/tests/framework/filters/AccessRuleTest.php
@@ -23,7 +23,7 @@
  */
 class AccessRuleTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/filters/ContentNegotiatorTest.php b/tests/framework/filters/ContentNegotiatorTest.php
index d52bb367c93..221716b80ec 100644
--- a/tests/framework/filters/ContentNegotiatorTest.php
+++ b/tests/framework/filters/ContentNegotiatorTest.php
@@ -20,7 +20,7 @@
  */
 class ContentNegotiatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -55,10 +55,6 @@ public function testWhenLanguageGETParamIsArray()
         $this->assertEquals($targetLanguage, Yii::$app->language);
     }
 
-    /**
-     * @expectedException yii\web\BadRequestHttpException
-     * @expectedExceptionMessageRegExp |Invalid data received for GET parameter '.+'|
-     */
     public function testWhenFormatGETParamIsArray()
     {
         list($action, $filter) = $this->mockActionAndFilter();
@@ -74,6 +70,9 @@ public function testWhenFormatGETParamIsArray()
             'application/xml' => Response::FORMAT_XML,
         ];
 
+        $this->expectException(\yii\web\BadRequestHttpException::class);
+        $this->expectExceptionMessage('Invalid data received for GET parameter');
+
         $filter->beforeAction($action);
     }
 
diff --git a/tests/framework/filters/HostControlTest.php b/tests/framework/filters/HostControlTest.php
index 39478fe00ed..4f5a32eb8bc 100644
--- a/tests/framework/filters/HostControlTest.php
+++ b/tests/framework/filters/HostControlTest.php
@@ -19,7 +19,7 @@
  */
 class HostControlTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/filters/HttpCacheTest.php b/tests/framework/filters/HttpCacheTest.php
index 8f0f0da6054..a5be733520a 100644
--- a/tests/framework/filters/HttpCacheTest.php
+++ b/tests/framework/filters/HttpCacheTest.php
@@ -15,7 +15,7 @@
  */
 class HttpCacheTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/filters/PageCacheTest.php b/tests/framework/filters/PageCacheTest.php
index 6dc5ef5f9a6..b89259168cf 100644
--- a/tests/framework/filters/PageCacheTest.php
+++ b/tests/framework/filters/PageCacheTest.php
@@ -25,14 +25,14 @@
  */
 class PageCacheTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $_SERVER['SCRIPT_FILENAME'] = '/index.php';
         $_SERVER['SCRIPT_NAME'] = '/index.php';
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         CacheTestCase::$time = null;
         CacheTestCase::$microtime = null;
diff --git a/tests/framework/filters/RateLimiterTest.php b/tests/framework/filters/RateLimiterTest.php
index 1bbaad6e299..70df2a48f95 100644
--- a/tests/framework/filters/RateLimiterTest.php
+++ b/tests/framework/filters/RateLimiterTest.php
@@ -22,7 +22,7 @@
  */
 class RateLimiterTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -30,7 +30,7 @@ protected function setUp()
 
         $this->mockWebApplication();
     }
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         Yii::setLogger(null);
diff --git a/tests/framework/filters/auth/AuthMethodTest.php b/tests/framework/filters/auth/AuthMethodTest.php
index beea7740c19..f045b26b6ad 100644
--- a/tests/framework/filters/auth/AuthMethodTest.php
+++ b/tests/framework/filters/auth/AuthMethodTest.php
@@ -16,7 +16,7 @@
 
 class AuthMethodTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/filters/auth/AuthTest.php b/tests/framework/filters/auth/AuthTest.php
index 102d215064e..1c4a7086655 100644
--- a/tests/framework/filters/auth/AuthTest.php
+++ b/tests/framework/filters/auth/AuthTest.php
@@ -25,7 +25,7 @@
  */
 class AuthTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/filters/auth/CompositeAuthTest.php b/tests/framework/filters/auth/CompositeAuthTest.php
index 6a9245c5e2b..c378550883a 100644
--- a/tests/framework/filters/auth/CompositeAuthTest.php
+++ b/tests/framework/filters/auth/CompositeAuthTest.php
@@ -103,7 +103,7 @@ public function behaviors()
  */
 class CompositeAuthTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/grid/ActionColumnTest.php b/tests/framework/grid/ActionColumnTest.php
index 7b15414d43c..c5d9bcfa9f0 100644
--- a/tests/framework/grid/ActionColumnTest.php
+++ b/tests/framework/grid/ActionColumnTest.php
@@ -70,34 +70,34 @@ public function testRenderDataCell()
 
         //test default visible button
         $columnContents = $column->renderDataCell(['id' => 1], 1, 0);
-        $this->assertContains('update_button', $columnContents);
+        $this->assertStringContainsString('update_button', $columnContents);
 
         //test visible button
         $column->visibleButtons = [
             'update' => true,
         ];
         $columnContents = $column->renderDataCell(['id' => 1], 1, 0);
-        $this->assertContains('update_button', $columnContents);
+        $this->assertStringContainsString('update_button', $columnContents);
 
         //test visible button (condition is callback)
         $column->visibleButtons = [
             'update' => function ($model, $key, $index) {return $model['id'] == 1;},
         ];
         $columnContents = $column->renderDataCell(['id' => 1], 1, 0);
-        $this->assertContains('update_button', $columnContents);
+        $this->assertStringContainsString('update_button', $columnContents);
 
         //test invisible button
         $column->visibleButtons = [
             'update' => false,
         ];
         $columnContents = $column->renderDataCell(['id' => 1], 1, 0);
-        $this->assertNotContains('update_button', $columnContents);
+        $this->assertStringNotContainsString('update_button', $columnContents);
 
         //test invisible button (condition is callback)
         $column->visibleButtons = [
             'update' => function ($model, $key, $index) {return $model['id'] != 1;},
         ];
         $columnContents = $column->renderDataCell(['id' => 1], 1, 0);
-        $this->assertNotContains('update_button', $columnContents);
+        $this->assertStringNotContainsString('update_button', $columnContents);
     }
 }
diff --git a/tests/framework/grid/CheckboxColumnTest.php b/tests/framework/grid/CheckboxColumnTest.php
index 6a2442019c7..83cdba21681 100644
--- a/tests/framework/grid/CheckboxColumnTest.php
+++ b/tests/framework/grid/CheckboxColumnTest.php
@@ -21,7 +21,7 @@
  */
 class CheckboxColumnTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         IntlTestHelper::resetIntlStatus();
@@ -35,34 +35,34 @@ protected function setUp()
     public function testInputName()
     {
         $column = new CheckboxColumn(['name' => 'selection', 'grid' => $this->getGrid()]);
-        $this->assertContains('name="selection_all"', $column->renderHeaderCell());
+        $this->assertStringContainsString('name="selection_all"', $column->renderHeaderCell());
 
         $column = new CheckboxColumn(['name' => 'selections[]', 'grid' => $this->getGrid()]);
-        $this->assertContains('name="selections_all"', $column->renderHeaderCell());
+        $this->assertStringContainsString('name="selections_all"', $column->renderHeaderCell());
 
         $column = new CheckboxColumn(['name' => 'MyForm[grid1]', 'grid' => $this->getGrid()]);
-        $this->assertContains('name="MyForm[grid1_all]"', $column->renderHeaderCell());
+        $this->assertStringContainsString('name="MyForm[grid1_all]"', $column->renderHeaderCell());
 
         $column = new CheckboxColumn(['name' => 'MyForm[grid1][]', 'grid' => $this->getGrid()]);
-        $this->assertContains('name="MyForm[grid1_all]"', $column->renderHeaderCell());
+        $this->assertStringContainsString('name="MyForm[grid1_all]"', $column->renderHeaderCell());
 
         $column = new CheckboxColumn(['name' => 'MyForm[grid1][key]', 'grid' => $this->getGrid()]);
-        $this->assertContains('name="MyForm[grid1][key_all]"', $column->renderHeaderCell());
+        $this->assertStringContainsString('name="MyForm[grid1][key_all]"', $column->renderHeaderCell());
 
         $column = new CheckboxColumn(['name' => 'MyForm[grid1][key][]', 'grid' => $this->getGrid()]);
-        $this->assertContains('name="MyForm[grid1][key_all]"', $column->renderHeaderCell());
+        $this->assertStringContainsString('name="MyForm[grid1][key_all]"', $column->renderHeaderCell());
     }
 
     public function testInputValue()
     {
         $column = new CheckboxColumn(['grid' => $this->getGrid()]);
-        $this->assertContains('value="1"', $column->renderDataCell([], 1, 0));
-        $this->assertContains('value="42"', $column->renderDataCell([], 42, 0));
-        $this->assertContains('value="[1,42]"', $column->renderDataCell([], [1, 42], 0));
+        $this->assertStringContainsString('value="1"', $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString('value="42"', $column->renderDataCell([], 42, 0));
+        $this->assertStringContainsString('value="[1,42]"', $column->renderDataCell([], [1, 42], 0));
 
         $column = new CheckboxColumn(['checkboxOptions' => ['value' => 42], 'grid' => $this->getGrid()]);
-        $this->assertNotContains('value="1"', $column->renderDataCell([], 1, 0));
-        $this->assertContains('value="42"', $column->renderDataCell([], 1, 0));
+        $this->assertStringNotContainsString('value="1"', $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString('value="42"', $column->renderDataCell([], 1, 0));
 
         $column = new CheckboxColumn([
             'checkboxOptions' => function ($model, $key, $index, $column) {
@@ -70,9 +70,9 @@ public function testInputValue()
             },
             'grid' => $this->getGrid(),
         ]);
-        $this->assertContains('value="1"', $column->renderDataCell([], 1, 0));
-        $this->assertContains('value="42"', $column->renderDataCell([], 42, 0));
-        $this->assertContains('value="[1,42]"', $column->renderDataCell([], [1, 42], 0));
+        $this->assertStringContainsString('value="1"', $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString('value="42"', $column->renderDataCell([], 42, 0));
+        $this->assertStringContainsString('value="[1,42]"', $column->renderDataCell([], [1, 42], 0));
 
         $column = new CheckboxColumn([
             'checkboxOptions' => function ($model, $key, $index, $column) {
@@ -80,8 +80,8 @@ public function testInputValue()
             },
             'grid' => $this->getGrid(),
         ]);
-        $this->assertNotContains('value="1"', $column->renderDataCell([], 1, 0));
-        $this->assertContains('value="42"', $column->renderDataCell([], 1, 0));
+        $this->assertStringNotContainsString('value="1"', $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString('value="42"', $column->renderDataCell([], 1, 0));
     }
 
     public function testContent()
@@ -92,7 +92,7 @@ public function testContent()
             },
             'grid' => $this->getGrid(),
         ]);
-        $this->assertContains('<td></td>', $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString('<td></td>', $column->renderDataCell([], 1, 0));
 
         $column = new CheckboxColumn([
             'content' => function ($model, $key, $index, $column) {
@@ -100,7 +100,7 @@ public function testContent()
             },
             'grid' => $this->getGrid(),
         ]);
-        $this->assertContains(Html::checkBox('checkBoxInput', false), $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString(Html::checkBox('checkBoxInput', false), $column->renderDataCell([], 1, 0));
     }
 
     /**
diff --git a/tests/framework/grid/GridViewTest.php b/tests/framework/grid/GridViewTest.php
index b698011493b..5f234e7424b 100644
--- a/tests/framework/grid/GridViewTest.php
+++ b/tests/framework/grid/GridViewTest.php
@@ -20,7 +20,7 @@
  */
 class GridViewTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication([
@@ -197,6 +197,9 @@ public function testHeaderLabels()
             'urlManager' => $urlManager,
             'attributes' => ['attr1', 'attr2'],
         ]);
+
+        $this->expectNotToPerformAssertions();
+
         $grid->renderTableHeader();
 
         // If NoAutoLabels::generateAttributeLabel() has not been called no exception will be thrown meaning this test passed successfully.
diff --git a/tests/framework/grid/RadiobuttonColumnTest.php b/tests/framework/grid/RadiobuttonColumnTest.php
index 51292d3d2ce..51e5bfced8d 100644
--- a/tests/framework/grid/RadiobuttonColumnTest.php
+++ b/tests/framework/grid/RadiobuttonColumnTest.php
@@ -22,15 +22,12 @@
  */
 class RadiobuttonColumnTest extends TestCase
 {
-    /**
-     * @expectedException \yii\base\InvalidConfigException
-     * @expectedExceptionMessage The "name" property must be set.
-     */
     public function testException()
     {
-        new RadioButtonColumn([
-            'name' => null,
-        ]);
+        $this->expectException(\yii\base\InvalidConfigException::class);
+        $this->expectExceptionMessage('The "name" property must be set.');
+
+        new RadioButtonColumn(['name' => null]);
     }
 
     public function testOptionsByArray()
@@ -67,14 +64,14 @@ public function testContent()
                 return null;
             }
         ]);
-        $this->assertContains('<td></td>', $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString('<td></td>', $column->renderDataCell([], 1, 0));
 
         $column = new RadioButtonColumn([
             'content' => function ($model, $key, $index, $column) {
                 return Html::radio('radioButtonInput', false);
             }
         ]);
-        $this->assertContains(Html::radio('radioButtonInput', false), $column->renderDataCell([], 1, 0));
+        $this->assertStringContainsString(Html::radio('radioButtonInput', false), $column->renderDataCell([], 1, 0));
     }
 
     public function testMultipleInGrid()
diff --git a/tests/framework/helpers/ArrayHelperTest.php b/tests/framework/helpers/ArrayHelperTest.php
index 0d706bc552f..84b18173648 100644
--- a/tests/framework/helpers/ArrayHelperTest.php
+++ b/tests/framework/helpers/ArrayHelperTest.php
@@ -20,7 +20,7 @@
  */
 class ArrayHelperTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -876,13 +876,12 @@ public function testGetValueObjects()
 
     public function testGetValueNonexistingProperties1()
     {
-        if (PHP_VERSION_ID < 80000) {
-            $this->expectException('PHPUnit_Framework_Error_Notice');
-        } else {
-            $this->expectException('PHPUnit_Framework_Error_Warning');
+        try {
+            $object = new Post1();
+            ArrayHelper::getValue($object, 'nonExisting');
+        } catch (\Throwable $th) {
+            $this->assertEquals('Undefined property: yiiunit\framework\helpers\Post1::$nonExisting', $th->getMessage());
         }
-        $object = new Post1();
-        ArrayHelper::getValue($object, 'nonExisting');
     }
 
     public function testGetValueNonexistingPropertiesForArrayObject()
diff --git a/tests/framework/helpers/BaseConsoleTest.php b/tests/framework/helpers/BaseConsoleTest.php
index d9a4391dc10..aa7bc11061e 100644
--- a/tests/framework/helpers/BaseConsoleTest.php
+++ b/tests/framework/helpers/BaseConsoleTest.php
@@ -12,7 +12,7 @@
  */
 class BaseConsoleTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/helpers/ConsoleTest.php b/tests/framework/helpers/ConsoleTest.php
index cbd1b322ee5..eb16d3056c7 100644
--- a/tests/framework/helpers/ConsoleTest.php
+++ b/tests/framework/helpers/ConsoleTest.php
@@ -18,7 +18,7 @@
  */
 class ConsoleTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/helpers/FileHelperTest.php b/tests/framework/helpers/FileHelperTest.php
index 448e6148fd4..e5d60c2cfa4 100644
--- a/tests/framework/helpers/FileHelperTest.php
+++ b/tests/framework/helpers/FileHelperTest.php
@@ -21,7 +21,7 @@ class FileHelperTest extends TestCase
      */
     private $testFilePath = '';
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->testFilePath = Yii::getAlias('@yiiunit/runtime') . DIRECTORY_SEPARATOR . get_class($this);
         $this->createDir($this->testFilePath);
@@ -56,7 +56,7 @@ private function isChmodReliable()
         return $mode === '0700';
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->removeDir($this->testFilePath);
     }
@@ -140,7 +140,7 @@ protected function createFileStructure(array $items, $basePath = '')
      */
     protected function assertFileMode($expectedMode, $fileName, $message = '')
     {
-        $expectedMode = sprintf('%o', $expectedMode);
+        $expectedMode = sprintf('%04o', $expectedMode);
         $this->assertEquals($expectedMode, $this->getMode($fileName), $message);
     }
 
@@ -258,7 +258,7 @@ public function testCopyDirectoryNotRecursive()
             $fileName = $dstDirName . DIRECTORY_SEPARATOR . $name;
 
             if (is_array($content)) {
-                $this->assertFileNotExists($fileName);
+                $this->assertFileDoesNotExist($fileName);
             } else {
                 $this->assertFileExists($fileName);
                 $this->assertStringEqualsFile($fileName, $content, 'Incorrect file content!');
@@ -364,6 +364,8 @@ public function testCopyDirWithSameName()
             'data-backup' => [],
         ]);
 
+        $this->expectNotToPerformAssertions();
+
         FileHelper::copyDirectory(
             $this->testFilePath . DIRECTORY_SEPARATOR . 'data',
             $this->testFilePath . DIRECTORY_SEPARATOR . 'data-backup'
@@ -389,7 +391,7 @@ public function testRemoveDirectory()
 
         FileHelper::removeDirectory($dirName);
 
-        $this->assertFileNotExists($dirName, 'Unable to remove directory!');
+        $this->assertFileDoesNotExist($dirName, 'Unable to remove directory!');
 
         // should be silent about non-existing directories
         FileHelper::removeDirectory($basePath . DIRECTORY_SEPARATOR . 'nonExisting');
@@ -432,10 +434,10 @@ public function testRemoveDirectorySymlinks1()
         $this->assertTrue(is_dir($basePath . 'directory'));
         $this->assertFileExists($basePath . 'directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); // symlinked directory still have it's file
         $this->assertFalse(is_dir($basePath . 'symlinks'));
-        $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2');
-        $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file');
+        $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2');
+        $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file');
         $this->assertFalse(is_dir($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory'));
-        $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1');
+        $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1');
     }
 
     public function testRemoveDirectorySymlinks2()
@@ -473,12 +475,12 @@ public function testRemoveDirectorySymlinks2()
 
         $this->assertFileExists($basePath . 'file');
         $this->assertTrue(is_dir($basePath . 'directory'));
-        $this->assertFileNotExists($basePath . 'directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); // symlinked directory doesn't have it's file now
+        $this->assertFileDoesNotExist($basePath . 'directory' . DIRECTORY_SEPARATOR . 'standard-file-1'); // symlinked directory doesn't have it's file now
         $this->assertFalse(is_dir($basePath . 'symlinks'));
-        $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2');
-        $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file');
+        $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'standard-file-2');
+        $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-file');
         $this->assertFalse(is_dir($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory'));
-        $this->assertFileNotExists($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1');
+        $this->assertFileDoesNotExist($basePath . 'symlinks' . DIRECTORY_SEPARATOR . 'symlinked-directory' . DIRECTORY_SEPARATOR . 'standard-file-1');
     }
 
     public function testFindFiles()
@@ -910,8 +912,8 @@ public function testCopyDirectoryNoEmptyDirectories()
         $this->assertFileExists($dstDirName . DIRECTORY_SEPARATOR . 'dir1');
         $this->assertFileExists($dstDirName . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'file1.txt');
         $this->assertFileExists($dstDirName . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'file2.txt');
-        $this->assertFileNotExists($dstDirName . DIRECTORY_SEPARATOR . 'dir2');
-        $this->assertFileNotExists($dstDirName . DIRECTORY_SEPARATOR . 'dir3');
+        $this->assertFileDoesNotExist($dstDirName . DIRECTORY_SEPARATOR . 'dir2');
+        $this->assertFileDoesNotExist($dstDirName . DIRECTORY_SEPARATOR . 'dir3');
     }
 
     public function testFindDirectories()
diff --git a/tests/framework/helpers/FormatConverterTest.php b/tests/framework/helpers/FormatConverterTest.php
index dd8d470a1cd..42ed3acb1e9 100644
--- a/tests/framework/helpers/FormatConverterTest.php
+++ b/tests/framework/helpers/FormatConverterTest.php
@@ -19,7 +19,7 @@
  */
 class FormatConverterTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -31,7 +31,7 @@ protected function setUp()
         ]);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         IntlTestHelper::resetIntlStatus();
@@ -358,7 +358,7 @@ public function testIntlUtf8Ru()
         $formatter = new Formatter(['locale' => 'ru-RU']);
         // There is a dot after month name in updated ICU data and no dot in old data. Both are acceptable.
         // See https://github.com/yiisoft/yii2/issues/9906
-        $this->assertRegExp('/24 авг\.? 2014 г\./', $formatter->asDate('2014-8-24', "dd MMM y 'г'."));
+        $this->assertMatchesRegularExpression('/24 авг\.? 2014 г\./', $formatter->asDate('2014-8-24', "dd MMM y 'г'."));
     }
 
     public function testPhpToICUMixedPatterns()
diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php
index 12e8869d2d8..18b24b89cde 100644
--- a/tests/framework/helpers/HtmlTest.php
+++ b/tests/framework/helpers/HtmlTest.php
@@ -19,7 +19,7 @@
  */
 class HtmlTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication([
@@ -1989,13 +1989,13 @@ public function testActiveFileInput()
         $this->assertEqualsWithoutLE($expected, $actual);
     }
 
-    /**
-     * @expectedException \yii\base\InvalidArgumentException
-     * @expectedExceptionMessage Attribute name must contain word characters only.
-     */
     public function testGetAttributeValueInvalidArgumentException()
     {
         $model = new HtmlTestModel();
+
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Attribute name must contain word characters only.');
+
         Html::getAttributeValue($model, '-');
     }
 
@@ -2024,24 +2024,24 @@ public function testGetAttributeValue()
         $this->assertSame($expected, $actual);
     }
 
-    /**
-     * @expectedException \yii\base\InvalidArgumentException
-     * @expectedExceptionMessage Attribute name must contain word characters only.
-     */
     public function testGetInputNameInvalidArgumentExceptionAttribute()
     {
         $model = new HtmlTestModel();
+
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Attribute name must contain word characters only.');
+
         Html::getInputName($model, '-');
     }
 
-    /**
-     * @expectedException \yii\base\InvalidArgumentException
-     * @expectedExceptionMessageRegExp /(.*)formName\(\) cannot be empty for tabular inputs.$/
-     */
     public function testGetInputNameInvalidArgumentExceptionFormName()
     {
         $model = $this->getMockBuilder('yii\\base\\Model')->getMock();
         $model->method('formName')->willReturn('');
+
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessage('cannot be empty for tabular inputs.');
+
         Html::getInputName($model, '[foo]bar');
     }
 
@@ -2147,7 +2147,7 @@ public function testActiveTextInput_placeholderFillFromModel()
 
         $html = Html::activeTextInput($model, 'name', ['placeholder' => true]);
 
-        $this->assertContains('placeholder="Name"', $html);
+        $this->assertStringContainsString('placeholder="Name"', $html);
     }
 
     public function testActiveTextInput_customPlaceholder()
@@ -2156,7 +2156,7 @@ public function testActiveTextInput_customPlaceholder()
 
         $html = Html::activeTextInput($model, 'name', ['placeholder' => 'Custom placeholder']);
 
-        $this->assertContains('placeholder="Custom placeholder"', $html);
+        $this->assertStringContainsString('placeholder="Custom placeholder"', $html);
     }
 
     public function testActiveTextInput_placeholderFillFromModelTabular()
@@ -2165,7 +2165,7 @@ public function testActiveTextInput_placeholderFillFromModelTabular()
 
         $html = Html::activeTextInput($model, '[0]name', ['placeholder' => true]);
 
-        $this->assertContains('placeholder="Name"', $html);
+        $this->assertStringContainsString('placeholder="Name"', $html);
     }
 
     public function testOverrideSetActivePlaceholder()
@@ -2174,11 +2174,13 @@ public function testOverrideSetActivePlaceholder()
 
         $html = MyHtml::activeTextInput($model, 'name', ['placeholder' => true]);
 
-        $this->assertContains('placeholder="My placeholder: Name"', $html);
+        $this->assertStringContainsString('placeholder="My placeholder: Name"', $html);
     }
 
     public function testGetInputIdDataProvider()
     {
+        $this->expectNotToPerformAssertions();
+
         return [
             [
                 'foo',
@@ -2218,6 +2220,8 @@ public function testGetInputIdDataProvider()
 
     public function testGetInputIdByNameDataProvider()
     {
+        $this->expectNotToPerformAssertions();
+
         return [
             [
                 'foo',
diff --git a/tests/framework/helpers/InflectorTest.php b/tests/framework/helpers/InflectorTest.php
index 7b1632b9929..644660e7211 100644
--- a/tests/framework/helpers/InflectorTest.php
+++ b/tests/framework/helpers/InflectorTest.php
@@ -15,7 +15,7 @@
  */
 class InflectorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/helpers/IpHelperTest.php b/tests/framework/helpers/IpHelperTest.php
index ac77758ec5f..cd850404026 100644
--- a/tests/framework/helpers/IpHelperTest.php
+++ b/tests/framework/helpers/IpHelperTest.php
@@ -54,6 +54,8 @@ public function expandIpv6Provider()
     public function testIpv6ExpandingWithInvalidValue()
     {
         try {
+            $this->expectNotToPerformAssertions();
+
             IpHelper::expandIPv6('fa01::1/64');
         } catch (\Exception $exception) {
             $this->assertStringEndsWith('Unrecognized address fa01::1/64', $exception->getMessage());
diff --git a/tests/framework/helpers/JsonTest.php b/tests/framework/helpers/JsonTest.php
index f8150c764d8..7c96c185be9 100644
--- a/tests/framework/helpers/JsonTest.php
+++ b/tests/framework/helpers/JsonTest.php
@@ -19,7 +19,7 @@
  */
 class JsonTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -205,12 +205,13 @@ public function testDecode()
     }
 
     /**
-     * @expectedException \yii\base\InvalidArgumentException
-     * @expectedExceptionMessage Invalid JSON data.
      * @covers ::decode
      */
-    public function testDecodeInvalidParamException()
+    public function testDecodeInvalidArgumentException()
     {
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessage('Invalid JSON data.');
+
         Json::decode([]);
     }
 
diff --git a/tests/framework/helpers/MarkdownTest.php b/tests/framework/helpers/MarkdownTest.php
index 7514e142362..6cf18bda3ed 100644
--- a/tests/framework/helpers/MarkdownTest.php
+++ b/tests/framework/helpers/MarkdownTest.php
@@ -18,7 +18,7 @@
  */
 class MarkdownTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -43,12 +43,11 @@ public function testOriginalFlavor()
         $this->assertEquals(Markdown::process($text), Markdown::process($text, 'gfm-comment'));
     }
 
-    /**
-     * @expectedException \yii\base\InvalidParamException
-     * @expectedExceptionMessage Markdown flavor 'undefined' is not defined.
-     */
-    public function testProcessInvalidParamException()
+    public function testProcessInvalidArgumentException()
     {
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+        $this->expectExceptionMessage("Markdown flavor 'undefined' is not defined.");
+
         Markdown::process('foo', 'undefined');
     }
 
diff --git a/tests/framework/helpers/StringHelperTest.php b/tests/framework/helpers/StringHelperTest.php
index 56acdb0c268..ffb5c6e2e19 100644
--- a/tests/framework/helpers/StringHelperTest.php
+++ b/tests/framework/helpers/StringHelperTest.php
@@ -17,7 +17,7 @@
 class StringHelperTest extends TestCase
 {
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/helpers/UrlTest.php b/tests/framework/helpers/UrlTest.php
index 0f2b6584eb9..1aca8a92850 100644
--- a/tests/framework/helpers/UrlTest.php
+++ b/tests/framework/helpers/UrlTest.php
@@ -22,7 +22,7 @@
  */
 class UrlTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication([
@@ -47,7 +47,7 @@ protected function setUp()
         ], '\yii\web\Application');
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         Yii::$app->getSession()->removeAll();
         parent::tearDown();
@@ -268,7 +268,7 @@ public function testToWithSuffix()
                 ['label' => 'Test', 'url' => ['/site/page', 'view' => 'about']],
             ],
         ]);
-        $this->assertRegExp('~<a href="/site/page.html\?view=about">~', $output);
+        $this->assertMatchesRegularExpression('~<a href="/site/page.html\?view=about">~', $output);
     }
 
     public function testBase()
diff --git a/tests/framework/helpers/VarDumperTest.php b/tests/framework/helpers/VarDumperTest.php
index 434876398a2..b8dd2e63cc6 100644
--- a/tests/framework/helpers/VarDumperTest.php
+++ b/tests/framework/helpers/VarDumperTest.php
@@ -16,7 +16,7 @@
  */
 class VarDumperTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -29,8 +29,8 @@ public function testDumpIncompleteObject()
         $serializedObj = 'O:16:"nonExistingClass":0:{}';
         $incompleteObj = unserialize($serializedObj);
         $dumpResult = VarDumper::dumpAsString($incompleteObj);
-        $this->assertContains("__PHP_Incomplete_Class#1\n(", $dumpResult);
-        $this->assertContains('nonExistingClass', $dumpResult);
+        $this->assertStringContainsString("__PHP_Incomplete_Class#1\n(", $dumpResult);
+        $this->assertStringContainsString('nonExistingClass', $dumpResult);
     }
 
     public function testExportIncompleteObject()
@@ -38,7 +38,7 @@ public function testExportIncompleteObject()
         $serializedObj = 'O:16:"nonExistingClass":0:{}';
         $incompleteObj = unserialize($serializedObj);
         $exportResult = VarDumper::export($incompleteObj);
-        $this->assertContains('nonExistingClass', $exportResult);
+        $this->assertStringContainsString('nonExistingClass', $exportResult);
     }
 
     public function testDumpObject()
@@ -50,9 +50,9 @@ public function testDumpObject()
         $obj->name = 'test-name';
         $obj->price = 19;
         $dumpResult = VarDumper::dumpAsString($obj);
-        $this->assertContains("stdClass#1\n(", $dumpResult);
-        $this->assertContains("[name] => 'test-name'", $dumpResult);
-        $this->assertContains('[price] => 19', $dumpResult);
+        $this->assertStringContainsString("stdClass#1\n(", $dumpResult);
+        $this->assertStringContainsString("[name] => 'test-name'", $dumpResult);
+        $this->assertStringContainsString('[price] => 19', $dumpResult);
     }
 
     /**
@@ -197,7 +197,7 @@ public function testDumpClassWithCustomDebugInfo()
         $object->unitPrice = 15;
 
         $dumpResult = VarDumper::dumpAsString($object);
-        $this->assertContains('totalPrice', $dumpResult);
-        $this->assertNotContains('unitPrice', $dumpResult);
+        $this->assertStringContainsString('totalPrice', $dumpResult);
+        $this->assertStringNotContainsString('unitPrice', $dumpResult);
     }
 }
diff --git a/tests/framework/i18n/DbMessageSourceTest.php b/tests/framework/i18n/DbMessageSourceTest.php
index e295365ed86..8e4dd725e87 100644
--- a/tests/framework/i18n/DbMessageSourceTest.php
+++ b/tests/framework/i18n/DbMessageSourceTest.php
@@ -73,7 +73,7 @@ protected static function runConsoleAction($route, $params = [])
         }
     }
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         parent::setUpBeforeClass();
         $databases = static::getParam('databases');
@@ -104,7 +104,7 @@ public static function setUpBeforeClass()
         static::$db->createCommand()->insert('message', ['id' => 5, 'language' => 'ru', 'translation' => 'На диване {n, plural, =0{нет кошек} =1{лежит одна кошка} one{лежит # кошка} few{лежит # кошки} many{лежит # кошек} other{лежит # кошки}}!'])->execute();
     }
 
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         static::runConsoleAction('migrate/down', ['migrationPath' => '@yii/i18n/migrations/', 'interactive' => false]);
         if (static::$db) {
diff --git a/tests/framework/i18n/FormatterDateTest.php b/tests/framework/i18n/FormatterDateTest.php
index ef488433572..c62ff491b11 100644
--- a/tests/framework/i18n/FormatterDateTest.php
+++ b/tests/framework/i18n/FormatterDateTest.php
@@ -22,7 +22,7 @@ class FormatterDateTest extends TestCase
      */
     protected $formatter;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -35,7 +35,7 @@ protected function setUp()
         $this->formatter = new Formatter(['locale' => 'en-US']);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         IntlTestHelper::resetIntlStatus();
@@ -170,22 +170,22 @@ public function testIntlAsDatetime()
 
         // empty input
         $this->formatter->locale = 'de-DE';
-        $this->assertRegExp('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(''));
-        $this->assertRegExp('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(0));
-        $this->assertRegExp('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(false));
+        $this->assertMatchesRegularExpression('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(''));
+        $this->assertMatchesRegularExpression('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(0));
+        $this->assertMatchesRegularExpression('~01\.01\.1970,? 00:00:00~', $this->formatter->asDatetime(false));
     }
 
     public function testAsDatetime()
     {
         $value = time();
-        $this->assertRegExp(
+        $this->assertMatchesRegularExpression(
             $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value)),
             $this->sanitizeWhitespaces($this->formatter->asDatetime($value))
         );
         $this->assertSame(date('Y/m/d h:i:s A', $value), $this->formatter->asDatetime($value, 'php:Y/m/d h:i:s A'));
 
         $value = new DateTime();
-        $this->assertRegExp(
+        $this->assertMatchesRegularExpression(
             $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value->getTimestamp())),
             $this->sanitizeWhitespaces($this->formatter->asDatetime($value))
         );
@@ -195,7 +195,7 @@ public function testAsDatetime()
         $value = new DateTime();
         $date = $value->format('Y-m-d');
         $value = new DateTime($date);
-        $this->assertRegExp(
+        $this->assertMatchesRegularExpression(
             $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value->getTimestamp())),
             $this->sanitizeWhitespaces($this->formatter->asDatetime($date))
         );
@@ -203,7 +203,7 @@ public function testAsDatetime()
 
         if (PHP_VERSION_ID >= 50500) {
             $value = new \DateTimeImmutable();
-            $this->assertRegExp(
+            $this->assertMatchesRegularExpression(
                 $this->sanitizeWhitespaces(date('~M j, Y,? g:i:s A~', $value->getTimestamp())),
                 $this->sanitizeWhitespaces($this->formatter->asDatetime($value))
             );
@@ -217,15 +217,15 @@ public function testAsDatetime()
         }
 
         // empty input
-        $this->assertRegExp(
+        $this->assertMatchesRegularExpression(
             $this->sanitizeWhitespaces('~Jan 1, 1970,? 12:00:00 AM~'),
             $this->sanitizeWhitespaces($this->formatter->asDatetime(''))
         );
-        $this->assertRegExp(
+        $this->assertMatchesRegularExpression(
             $this->sanitizeWhitespaces('~Jan 1, 1970,? 12:00:00 AM~'),
             $this->sanitizeWhitespaces($this->formatter->asDatetime(0))
         );
-        $this->assertRegExp(
+        $this->assertMatchesRegularExpression(
             $this->sanitizeWhitespaces('~Jan 1, 1970,? 12:00:00 AM~'),
             $this->sanitizeWhitespaces($this->formatter->asDatetime(false))
         );
diff --git a/tests/framework/i18n/FormatterNumberTest.php b/tests/framework/i18n/FormatterNumberTest.php
index 234c9a5ea24..e572adb9021 100755
--- a/tests/framework/i18n/FormatterNumberTest.php
+++ b/tests/framework/i18n/FormatterNumberTest.php
@@ -22,7 +22,7 @@ class FormatterNumberTest extends TestCase
      */
     protected $formatter;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -35,7 +35,7 @@ protected function setUp()
         $this->formatter = new Formatter(['locale' => 'en-US']);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         IntlTestHelper::resetIntlStatus();
diff --git a/tests/framework/i18n/FormatterTest.php b/tests/framework/i18n/FormatterTest.php
index a44b74aec60..83d4f884212 100644
--- a/tests/framework/i18n/FormatterTest.php
+++ b/tests/framework/i18n/FormatterTest.php
@@ -24,7 +24,7 @@ class FormatterTest extends TestCase
      */
     protected $formatter;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -39,7 +39,7 @@ protected function setUp()
         }
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         IntlTestHelper::resetIntlStatus();
diff --git a/tests/framework/i18n/GettextPoFileTest.php b/tests/framework/i18n/GettextPoFileTest.php
index 2c202fad235..81a93e889ca 100644
--- a/tests/framework/i18n/GettextPoFileTest.php
+++ b/tests/framework/i18n/GettextPoFileTest.php
@@ -15,7 +15,7 @@
  */
 class GettextPoFileTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/i18n/I18NTest.php b/tests/framework/i18n/I18NTest.php
index 77a514acaf0..c95ed2248ab 100644
--- a/tests/framework/i18n/I18NTest.php
+++ b/tests/framework/i18n/I18NTest.php
@@ -25,7 +25,7 @@ class I18NTest extends TestCase
      */
     public $i18n;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/i18n/LocaleTest.php b/tests/framework/i18n/LocaleTest.php
index 60d1951eca9..2e5ef84ebaa 100644
--- a/tests/framework/i18n/LocaleTest.php
+++ b/tests/framework/i18n/LocaleTest.php
@@ -20,7 +20,7 @@ class LocaleTest extends TestCase
      */
     protected $locale;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -31,7 +31,7 @@ protected function setUp()
         $this->locale = new Locale(['locale' => 'en-US']);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         $this->locale = null;
diff --git a/tests/framework/log/DbTargetTest.php b/tests/framework/log/DbTargetTest.php
index 9d118d21bc1..caf553f40aa 100644
--- a/tests/framework/log/DbTargetTest.php
+++ b/tests/framework/log/DbTargetTest.php
@@ -64,7 +64,7 @@ protected static function runConsoleAction($route, $params = [])
         }
     }
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
         $databases = static::getParam('databases');
@@ -78,7 +78,7 @@ public function setUp()
         static::runConsoleAction('migrate/up', ['migrationPath' => '@yii/log/migrations/', 'interactive' => false]);
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         self::getConnection()->createCommand()->truncateTable(self::$logTable)->execute();
         static::runConsoleAction('migrate/down', ['migrationPath' => '@yii/log/migrations/', 'interactive' => false]);
diff --git a/tests/framework/log/DispatcherTest.php b/tests/framework/log/DispatcherTest.php
index 5cb35b52e3c..24af341a79d 100644
--- a/tests/framework/log/DispatcherTest.php
+++ b/tests/framework/log/DispatcherTest.php
@@ -52,7 +52,7 @@ class DispatcherTest extends TestCase
          */
         public static $functions = [];
 
-        protected function setUp()
+        protected function setUp(): void
         {
             static::$microtimeIsMocked = false;
             $this->dispatcher = new Dispatcher();
diff --git a/tests/framework/log/EmailTargetTest.php b/tests/framework/log/EmailTargetTest.php
index 7c3b4e008f2..9f974ee1b4b 100644
--- a/tests/framework/log/EmailTargetTest.php
+++ b/tests/framework/log/EmailTargetTest.php
@@ -24,7 +24,7 @@ class EmailTargetTest extends TestCase
     /**
      * Set up mailer.
      */
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mailer = $this->getMockBuilder('yii\\mail\\BaseMailer')
@@ -38,16 +38,17 @@ protected function setUp()
     public function testInitWithOptionTo()
     {
         $target = new EmailTarget(['mailer' => $this->mailer, 'message' => ['to' => 'developer1@example.com']]);
-        $this->assertInternalType('object', $target); // should be no exception during `init()`
+        $this->assertIsObject($target); // should be no exception during `init()`
     }
 
     /**
      * @covers \yii\log\EmailTarget::init()
-     * @expectedException \yii\base\InvalidConfigException
-     * @expectedExceptionMessage The "to" option must be set for EmailTarget::message.
      */
     public function testInitWithoutOptionTo()
     {
+        $this->expectException(\yii\base\InvalidConfigException::class);
+        $this->expectExceptionMessage('The "to" option must be set for EmailTarget::message.');
+
         new EmailTarget(['mailer' => $this->mailer]);
     }
 
diff --git a/tests/framework/log/FileTargetTest.php b/tests/framework/log/FileTargetTest.php
index 4f6eaf4ae75..6c23837f23c 100644
--- a/tests/framework/log/FileTargetTest.php
+++ b/tests/framework/log/FileTargetTest.php
@@ -20,7 +20,7 @@
  */
 class FileTargetTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -37,7 +37,7 @@ public function testInit()
         new FileTarget([
             'logFile' => Yii::getAlias('@yiiunit/runtime/log/filetargettest.log'),
         ]);
-        $this->assertFileNotExists(
+        $this->assertFileDoesNotExist(
             dirname($logFile),
             'Log directory should not be created during init process'
         );
@@ -72,10 +72,10 @@ public function testRotate()
         clearstatcache();
 
         $this->assertFileExists($logFile);
-        $this->assertFileNotExists($logFile . '.1');
-        $this->assertFileNotExists($logFile . '.2');
-        $this->assertFileNotExists($logFile . '.3');
-        $this->assertFileNotExists($logFile . '.4');
+        $this->assertFileDoesNotExist($logFile . '.1');
+        $this->assertFileDoesNotExist($logFile . '.2');
+        $this->assertFileDoesNotExist($logFile . '.3');
+        $this->assertFileDoesNotExist($logFile . '.4');
 
         // exceed max size
         for ($i = 0; $i < 1024; $i++) {
@@ -92,9 +92,9 @@ public function testRotate()
 
         $this->assertFileExists($logFile);
         $this->assertFileExists($logFile . '.1');
-        $this->assertFileNotExists($logFile . '.2');
-        $this->assertFileNotExists($logFile . '.3');
-        $this->assertFileNotExists($logFile . '.4');
+        $this->assertFileDoesNotExist($logFile . '.2');
+        $this->assertFileDoesNotExist($logFile . '.3');
+        $this->assertFileDoesNotExist($logFile . '.4');
 
         // second rotate
 
@@ -107,9 +107,9 @@ public function testRotate()
 
         $this->assertFileExists($logFile);
         $this->assertFileExists($logFile . '.1');
-        $this->assertFileNotExists($logFile . '.2');
-        $this->assertFileNotExists($logFile . '.3');
-        $this->assertFileNotExists($logFile . '.4');
+        $this->assertFileDoesNotExist($logFile . '.2');
+        $this->assertFileDoesNotExist($logFile . '.3');
+        $this->assertFileDoesNotExist($logFile . '.4');
     }
 
     public function testLogEmptyStrings()
@@ -142,17 +142,17 @@ public function testLogEmptyStrings()
         $logger->messages = array_fill(0, 1, 'yyy');
         $logger->export();
 
-        $this->assertFileNotExists($logFile);
+        $this->assertFileDoesNotExist($logFile);
 
         $logger->messages = array_fill(0, 10, '');
         $logger->export();
 
-        $this->assertFileNotExists($logFile);
+        $this->assertFileDoesNotExist($logFile);
 
         $logger->messages = array_fill(0, 10, null);
         $logger->export();
 
-        $this->assertFileNotExists($logFile);
+        $this->assertFileDoesNotExist($logFile);
     }
 
     private function clearLogFile($logFile)
diff --git a/tests/framework/log/LoggerTest.php b/tests/framework/log/LoggerTest.php
index d5ffa83aca4..3238ea0afd7 100644
--- a/tests/framework/log/LoggerTest.php
+++ b/tests/framework/log/LoggerTest.php
@@ -26,7 +26,7 @@ class LoggerTest extends TestCase
      */
     protected $dispatcher;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->logger = new Logger();
         $this->dispatcher = $this->getMockBuilder('yii\log\Dispatcher')
diff --git a/tests/framework/log/SyslogTargetTest.php b/tests/framework/log/SyslogTargetTest.php
index 3c9efd10aec..384b51ec5d7 100644
--- a/tests/framework/log/SyslogTargetTest.php
+++ b/tests/framework/log/SyslogTargetTest.php
@@ -52,7 +52,7 @@ class SyslogTargetTest extends TestCase
         /**
          * Set up syslogTarget as the mock object.
          */
-        protected function setUp()
+        protected function setUp(): void
         {
             $this->syslogTarget = $this->getMockBuilder('yii\\log\\SyslogTarget')
                 ->setMethods(['getMessagePrefix'])
diff --git a/tests/framework/log/TargetTest.php b/tests/framework/log/TargetTest.php
index eace93aa3bf..4450239f43e 100644
--- a/tests/framework/log/TargetTest.php
+++ b/tests/framework/log/TargetTest.php
@@ -118,23 +118,23 @@ public function testGetContextMessage()
             'C_c' => 1,
         ];
         $context = $target->getContextMessage();
-        $this->assertContains('A_a', $context);
-        $this->assertNotContains('A_b', $context);
-        $this->assertContains('A_c', $context);
-        $this->assertContains('B_a', $context);
-        $this->assertNotContains('B_b', $context);
-        $this->assertNotContains('B_c', $context);
-        $this->assertContains('C_a', $context);
-        $this->assertContains('C_b', $context);
-        $this->assertContains('C_c', $context);
-        $this->assertNotContains('D_a', $context);
-        $this->assertNotContains('D_b', $context);
-        $this->assertNotContains('D_c', $context);
-        $this->assertNotContains('E_a', $context);
-        $this->assertNotContains('E_b', $context);
-        $this->assertNotContains('E_c', $context);
-        $this->assertNotContains('mySecret', $context);
-        $this->assertContains('***', $context);
+        $this->assertStringContainsString('A_a', $context);
+        $this->assertStringNotContainsString('A_b', $context);
+        $this->assertStringContainsString('A_c', $context);
+        $this->assertStringContainsString('B_a', $context);
+        $this->assertStringNotContainsString('B_b', $context);
+        $this->assertStringNotContainsString('B_c', $context);
+        $this->assertStringContainsString('C_a', $context);
+        $this->assertStringContainsString('C_b', $context);
+        $this->assertStringContainsString('C_c', $context);
+        $this->assertStringNotContainsString('D_a', $context);
+        $this->assertStringNotContainsString('D_b', $context);
+        $this->assertStringNotContainsString('D_c', $context);
+        $this->assertStringNotContainsString('E_a', $context);
+        $this->assertStringNotContainsString('E_b', $context);
+        $this->assertStringNotContainsString('E_c', $context);
+        $this->assertStringNotContainsString('mySecret', $context);
+        $this->assertStringContainsString('***', $context);
     }
 
     /**
diff --git a/tests/framework/mail/BaseMailerTest.php b/tests/framework/mail/BaseMailerTest.php
index dc7e43deb0e..4e2f5f1a8f1 100644
--- a/tests/framework/mail/BaseMailerTest.php
+++ b/tests/framework/mail/BaseMailerTest.php
@@ -19,7 +19,7 @@
  */
 class BaseMailerTest extends TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -32,7 +32,7 @@ public function setUp()
         }
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $filePath = $this->getTestFilePath();
         if (file_exists($filePath)) {
@@ -85,7 +85,7 @@ public function testSetupView()
         ];
         $mailer->setView($viewConfig);
         $view = $mailer->getView();
-        $this->assertInternalType('object', $view, 'Unable to setup view via config!');
+        $this->assertIsObject($view, 'Unable to setup view via config!');
         $this->assertEquals($viewConfig['params'], $view->params, 'Unable to configure view via config array!');
     }
 
@@ -96,14 +96,14 @@ public function testGetDefaultView()
     {
         $mailer = new Mailer();
         $view = $mailer->getView();
-        $this->assertInternalType('object', $view, 'Unable to get default view!');
+        $this->assertIsObject($view, 'Unable to get default view!');
     }
 
     public function testCreateMessage()
     {
         $mailer = new Mailer();
         $message = $mailer->compose();
-        $this->assertInternalType('object', $message, 'Unable to create message instance!');
+        $this->assertIsObject($message, 'Unable to create message instance!');
         $this->assertEquals($mailer->messageClass, get_class($message), 'Invalid message class!');
     }
 
@@ -456,7 +456,7 @@ public function embedContent($content, array $options = [])
     {
     }
 
-    public function toString()
+    public function toString(): string
     {
         $mailer = $this->mailer;
         $this->mailer = null;
diff --git a/tests/framework/mail/BaseMessageTest.php b/tests/framework/mail/BaseMessageTest.php
index 9741f5d66d7..2df6dddf272 100644
--- a/tests/framework/mail/BaseMessageTest.php
+++ b/tests/framework/mail/BaseMessageTest.php
@@ -17,7 +17,7 @@
  */
 class BaseMessageTest extends TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         $this->mockApplication([
             'components' => [
@@ -173,7 +173,7 @@ public function embedContent($content, array $options = [])
     {
     }
 
-    public function toString()
+    public function toString(): string
     {
         return get_class($this);
     }
diff --git a/tests/framework/mutex/FileMutexTest.php b/tests/framework/mutex/FileMutexTest.php
index 48e3778c6ec..60947e750aa 100644
--- a/tests/framework/mutex/FileMutexTest.php
+++ b/tests/framework/mutex/FileMutexTest.php
@@ -47,6 +47,6 @@ public function testDeleteLockFile($mutexName)
         $this->assertFileExists($fileName);
 
         $mutex->release($mutexName);
-        $this->assertFileNotExists($fileName);
+        $this->assertFileDoesNotExist($fileName);
     }
 }
diff --git a/tests/framework/rbac/DbManagerTestCase.php b/tests/framework/rbac/DbManagerTestCase.php
index bb5debaddc8..3446266130b 100644
--- a/tests/framework/rbac/DbManagerTestCase.php
+++ b/tests/framework/rbac/DbManagerTestCase.php
@@ -36,6 +36,20 @@ abstract class DbManagerTestCase extends ManagerTestCase
      */
     protected $db;
 
+    public function testGetAssignmentsByRole()
+    {
+        $this->prepareData();
+        $reader = $this->auth->getRole('reader');
+        $this->auth->assign($reader, 123);
+
+        $this->auth = $this->createManager();
+
+        $this->assertEquals([], $this->auth->getUserIdsByRole('nonexisting'));
+        $this->assertEquals(['123', 'reader A'], $this->auth->getUserIdsByRole('reader'), '', 0.0, 10, true);
+        $this->assertEquals(['author B'], $this->auth->getUserIdsByRole('author'));
+        $this->assertEquals(['admin C'], $this->auth->getUserIdsByRole('admin'));
+    }
+
     protected static function runConsoleAction($route, $params = [])
     {
         if (Yii::$app === null) {
@@ -67,7 +81,7 @@ protected static function runConsoleAction($route, $params = [])
         }
     }
 
-    public static function setUpBeforeClass()
+    public static function setUpBeforeClass(): void
     {
         parent::setUpBeforeClass();
         $databases = static::getParam('databases');
@@ -81,13 +95,13 @@ public static function setUpBeforeClass()
         static::runConsoleAction('migrate/up', ['migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]);
     }
 
-    public static function tearDownAfterClass()
+    public static function tearDownAfterClass(): void
     {
         static::runConsoleAction('migrate/down', ['all', 'migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]);
         parent::tearDownAfterClass();
     }
 
-    protected function setUp()
+    protected function setUp(): void
     {
         if (defined('HHVM_VERSION') && static::$driverName === 'pgsql') {
             static::markTestSkipped('HHVM PDO for pgsql does not work with binary columns, which are essential for rbac schema. See https://github.com/yiisoft/yii2/issues/14244');
@@ -96,7 +110,7 @@ protected function setUp()
         $this->auth = $this->createManager();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         $this->auth->removeAll();
@@ -393,7 +407,10 @@ private function assertSingleQueryToAssignmentsTable($logTarget)
             return strpos($message[0], 'auth_assignment') !== false;
         });
         $this->assertCount(1, $messages, 'Only one query should have been performed, but there are the following logs: ' . print_r($logTarget->messages, true));
-        $this->assertContains('auth_assignment', $messages[0][0], 'Log message should be a query to auth_assignment table');
+        $this->assertStringContainsString(
+            'auth_assignment',
+            $messages[0][0], 'Log message should be a query to auth_assignment table',
+        );
         $logTarget->messages = [];
     }
 }
diff --git a/tests/framework/rbac/PhpManagerTest.php b/tests/framework/rbac/PhpManagerTest.php
index 38107d26a84..51c77bff027 100644
--- a/tests/framework/rbac/PhpManagerTest.php
+++ b/tests/framework/rbac/PhpManagerTest.php
@@ -74,7 +74,7 @@ protected function createManager()
         ]);
     }
 
-    protected function setUp()
+    protected function setUp(): void
     {
         static::$filemtime = null;
         static::$time = null;
@@ -89,7 +89,7 @@ protected function setUp()
         $this->auth = $this->createManager();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->removeDataFiles();
         static::$filemtime = null;
@@ -136,15 +136,15 @@ public function testUpdateDescription()
         $this->assertTrue($this->auth->update($name, $permission), 'You should be able to save w/o changing name.');
     }
 
-    /**
-     * @expectedException \yii\base\InvalidParamException
-     */
     public function testOverwriteName()
     {
         $this->prepareData();
         $name = 'readPost';
         $permission = $this->auth->getPermission($name);
         $permission->name = 'createPost';
+
+        $this->expectException(\yii\base\InvalidArgumentException::class);
+
         $this->auth->update($name, $permission);
     }
 
@@ -154,11 +154,11 @@ public function testSaveAssignments()
         $role = $this->auth->createRole('Admin');
         $this->auth->add($role);
         $this->auth->assign($role, 13);
-        $this->assertContains('Admin', file_get_contents($this->getAssignmentFile()));
+        $this->assertStringContainsString('Admin', file_get_contents($this->getAssignmentFile()));
         $role->name = 'NewAdmin';
         $this->auth->update('Admin', $role);
-        $this->assertContains('NewAdmin', file_get_contents($this->getAssignmentFile()));
+        $this->assertStringContainsString('NewAdmin', file_get_contents($this->getAssignmentFile()));
         $this->auth->remove($role);
-        $this->assertNotContains('NewAdmin', file_get_contents($this->getAssignmentFile()));
+        $this->assertStringNotContainsString('NewAdmin', file_get_contents($this->getAssignmentFile()));
     }
 }
diff --git a/tests/framework/rest/IndexActionTest.php b/tests/framework/rest/IndexActionTest.php
index d6481aa10e2..2b703d5494e 100644
--- a/tests/framework/rest/IndexActionTest.php
+++ b/tests/framework/rest/IndexActionTest.php
@@ -18,7 +18,7 @@
  */
 class IndexActionTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockWebApplication([
diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php
index 361aba38a91..d7516e0dae0 100644
--- a/tests/framework/rest/SerializerTest.php
+++ b/tests/framework/rest/SerializerTest.php
@@ -17,7 +17,7 @@
  */
 class SerializerTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication([
diff --git a/tests/framework/rest/UrlRuleTest.php b/tests/framework/rest/UrlRuleTest.php
index 0228742ce18..ce09bd81032 100644
--- a/tests/framework/rest/UrlRuleTest.php
+++ b/tests/framework/rest/UrlRuleTest.php
@@ -20,7 +20,7 @@
  */
 class UrlRuleTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -415,6 +415,8 @@ public function testGetCreateUrlStatus($ruleConfig, $tests)
      */
     public function testGetCreateUrlStatusProvider()
     {
+        $this->expectNotToPerformAssertions();
+
         return [
             'single controller' => [
                 // rule properties
diff --git a/tests/framework/test/ActiveFixtureTest.php b/tests/framework/test/ActiveFixtureTest.php
index ba52d0e286d..8b14060e6fe 100644
--- a/tests/framework/test/ActiveFixtureTest.php
+++ b/tests/framework/test/ActiveFixtureTest.php
@@ -23,7 +23,7 @@ class ActiveFixtureTest extends DatabaseTestCase
 {
     protected $driverName = 'mysql';
 
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
         $db = $this->getConnection();
@@ -31,7 +31,7 @@ public function setUp()
         ActiveRecord::$db = $db;
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         parent::tearDown();
     }
@@ -205,12 +205,12 @@ class BaseDbTestCase
 {
     use FixtureTrait;
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->initFixtures();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
     }
 }
diff --git a/tests/framework/test/ArrayFixtureTest.php b/tests/framework/test/ArrayFixtureTest.php
index 50ec62c3282..8eadfe8b8fc 100644
--- a/tests/framework/test/ArrayFixtureTest.php
+++ b/tests/framework/test/ArrayFixtureTest.php
@@ -20,7 +20,7 @@ class ArrayFixtureTest extends TestCase
      */
     private $_fixture;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->_fixture = new ArrayFixture();
@@ -47,12 +47,12 @@ public function testNothingToLoad()
         $this->assertEmpty($this->_fixture->data, 'fixture data should not be loaded');
     }
 
-    /**
-     * @expectedException \yii\base\InvalidConfigException
-     */
     public function testWrongDataFileException()
     {
         $this->_fixture->dataFile = 'wrong/fixtures/data/path/alias';
+
+        $this->expectException(\yii\base\InvalidConfigException::class);
+
         $this->_fixture->load();
     }
 }
diff --git a/tests/framework/test/FixtureTest.php b/tests/framework/test/FixtureTest.php
index 25c57bc5537..6ec23bae974 100644
--- a/tests/framework/test/FixtureTest.php
+++ b/tests/framework/test/FixtureTest.php
@@ -90,12 +90,12 @@ class MyTestCase
     public static $load;
     public static $unload;
 
-    public function setUp()
+    public function setUp(): void
     {
         $this->loadFixtures();
     }
 
-    public function tearDown()
+    public function tearDown(): void
     {
         $this->unloadFixtures();
     }
diff --git a/tests/framework/validators/BooleanValidatorTest.php b/tests/framework/validators/BooleanValidatorTest.php
index 63331f6136f..0405a518967 100644
--- a/tests/framework/validators/BooleanValidatorTest.php
+++ b/tests/framework/validators/BooleanValidatorTest.php
@@ -17,7 +17,7 @@
  */
 class BooleanValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/validators/CompareValidatorTest.php b/tests/framework/validators/CompareValidatorTest.php
index 2b600889d8c..69bc01b4c51 100644
--- a/tests/framework/validators/CompareValidatorTest.php
+++ b/tests/framework/validators/CompareValidatorTest.php
@@ -17,7 +17,7 @@
  */
 class CompareValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/validators/DateValidatorTest.php b/tests/framework/validators/DateValidatorTest.php
index fc3cd1ef3d6..c00017cb46c 100644
--- a/tests/framework/validators/DateValidatorTest.php
+++ b/tests/framework/validators/DateValidatorTest.php
@@ -18,7 +18,7 @@
  */
 class DateValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -30,7 +30,7 @@ protected function setUp()
         ]);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         parent::tearDown();
         IntlTestHelper::resetIntlStatus();
diff --git a/tests/framework/validators/DefaultValueValidatorTest.php b/tests/framework/validators/DefaultValueValidatorTest.php
index 9b25a1166ee..a76207b7f58 100644
--- a/tests/framework/validators/DefaultValueValidatorTest.php
+++ b/tests/framework/validators/DefaultValueValidatorTest.php
@@ -15,7 +15,7 @@
  */
 class DefaultValueValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/validators/EachValidatorTest.php b/tests/framework/validators/EachValidatorTest.php
index 8e32327b2f3..ac58d3ce5b6 100644
--- a/tests/framework/validators/EachValidatorTest.php
+++ b/tests/framework/validators/EachValidatorTest.php
@@ -20,7 +20,7 @@
  */
 class EachValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -76,12 +76,12 @@ public function testAllowMessageFromRule()
 
         $validator->allowMessageFromRule = true;
         $validator->validateAttribute($model, 'attr_one');
-        $this->assertContains('integer', $model->getFirstError('attr_one'));
+        $this->assertStringContainsString('integer', $model->getFirstError('attr_one'));
 
         $model->clearErrors();
         $validator->allowMessageFromRule = false;
         $validator->validateAttribute($model, 'attr_one');
-        $this->assertNotContains('integer', $model->getFirstError('attr_one'));
+        $this->assertStringNotContainsString('integer', $model->getFirstError('attr_one'));
     }
 
     /**
diff --git a/tests/framework/validators/EmailValidatorTest.php b/tests/framework/validators/EmailValidatorTest.php
index 7687b2bdc8f..fcf3b020871 100644
--- a/tests/framework/validators/EmailValidatorTest.php
+++ b/tests/framework/validators/EmailValidatorTest.php
@@ -16,7 +16,7 @@
  */
 class EmailValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/validators/ExistValidatorTest.php b/tests/framework/validators/ExistValidatorTest.php
index 259efe86e0d..1fc2e27b5ec 100644
--- a/tests/framework/validators/ExistValidatorTest.php
+++ b/tests/framework/validators/ExistValidatorTest.php
@@ -19,7 +19,7 @@
 
 abstract class ExistValidatorTest extends DatabaseTestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/validators/FileValidatorTest.php b/tests/framework/validators/FileValidatorTest.php
index 157269e5d41..05989ec5858 100644
--- a/tests/framework/validators/FileValidatorTest.php
+++ b/tests/framework/validators/FileValidatorTest.php
@@ -19,7 +19,7 @@
  */
 class FileValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -29,7 +29,7 @@ public function testAssureMessagesSetOnInit()
     {
         $val = new FileValidator();
         foreach (['message', 'uploadRequired', 'tooMany', 'wrongExtension', 'tooBig', 'tooSmall', 'wrongMimeType'] as $attr) {
-            $this->assertInternalType('string', $val->$attr);
+            $this->assertIsString($val->$attr);
         }
     }
 
@@ -653,8 +653,11 @@ public function testValidateAttributeErrNoTmpDir()
      * @param bool   $expected
      * @dataProvider mimeTypeCaseInsensitive
      */
-    public function testValidateMimeTypeCaseInsensitive($mask, $fileMimeType, $expected) {
-        $validator = $this->getMock('\yii\validators\FileValidator', ['getMimeTypeByFile']);
+    public function testValidateMimeTypeCaseInsensitive($mask, $fileMimeType, $expected)
+    {
+        $validator = $this->getMockBuilder(\yii\validators\FileValidator::class)
+            ->onlyMethods(['getMimeTypeByFile'])
+            ->getMock();
         $validator->method('getMimeTypeByFile')->willReturn($fileMimeType);
         $validator->mimeTypes = [$mask];
 
diff --git a/tests/framework/validators/FilterValidatorTest.php b/tests/framework/validators/FilterValidatorTest.php
index 06153d934a3..f574f259b5a 100644
--- a/tests/framework/validators/FilterValidatorTest.php
+++ b/tests/framework/validators/FilterValidatorTest.php
@@ -16,7 +16,7 @@
  */
 class FilterValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         // destroy application, Validator must work without Yii::$app
diff --git a/tests/framework/validators/IpValidatorTest.php b/tests/framework/validators/IpValidatorTest.php
index a6a365ffb46..b99f6ad6c36 100644
--- a/tests/framework/validators/IpValidatorTest.php
+++ b/tests/framework/validators/IpValidatorTest.php
@@ -16,7 +16,7 @@
  */
 class IpValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         // destroy application, Validator must work without Yii::$app
diff --git a/tests/framework/validators/NumberValidatorTest.php b/tests/framework/validators/NumberValidatorTest.php
index 826eb9cf915..7114e167351 100644
--- a/tests/framework/validators/NumberValidatorTest.php
+++ b/tests/framework/validators/NumberValidatorTest.php
@@ -48,7 +48,7 @@ private function restoreLocale()
         setlocale(LC_NUMERIC, $this->oldLocale);
     }
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -519,8 +519,8 @@ public function testClientValidateComparison()
         ]);
         $model = new FakedValidationModel();
         $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]]));
-        $this->assertContains('"min":5', $js);
-        $this->assertContains('"max":10', $js);
+        $this->assertStringContainsString('"min":5', $js);
+        $this->assertStringContainsString('"max":10', $js);
 
         $val = new NumberValidator([
             'min' => '5',
@@ -528,8 +528,8 @@ public function testClientValidateComparison()
         ]);
         $model = new FakedValidationModel();
         $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]]));
-        $this->assertContains('"min":5', $js);
-        $this->assertContains('"max":10', $js);
+        $this->assertStringContainsString('"min":5', $js);
+        $this->assertStringContainsString('"max":10', $js);
 
         $val = new NumberValidator([
             'min' => 5.65,
@@ -537,8 +537,8 @@ public function testClientValidateComparison()
         ]);
         $model = new FakedValidationModel();
         $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]]));
-        $this->assertContains('"min":5.65', $js);
-        $this->assertContains('"max":13.37', $js);
+        $this->assertStringContainsString('"min":5.65', $js);
+        $this->assertStringContainsString('"max":13.37', $js);
 
         $val = new NumberValidator([
             'min' => '5.65',
@@ -546,8 +546,8 @@ public function testClientValidateComparison()
         ]);
         $model = new FakedValidationModel();
         $js = $val->clientValidateAttribute($model, 'attr_number', new View(['assetBundles' => ['yii\validators\ValidationAsset' => true]]));
-        $this->assertContains('"min":5.65', $js);
-        $this->assertContains('"max":13.37', $js);
+        $this->assertStringContainsString('"min":5.65', $js);
+        $this->assertStringContainsString('"max":13.37', $js);
     }
 
     public function testValidateObject()
diff --git a/tests/framework/validators/RangeValidatorTest.php b/tests/framework/validators/RangeValidatorTest.php
index d86e0224e2b..67d843dc005 100644
--- a/tests/framework/validators/RangeValidatorTest.php
+++ b/tests/framework/validators/RangeValidatorTest.php
@@ -16,7 +16,7 @@
  */
 class RangeValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -34,7 +34,7 @@ public function testInitException()
     public function testAssureMessageSetOnInit()
     {
         $val = new RangeValidator(['range' => []]);
-        $this->assertInternalType('string', $val->message);
+        $this->assertIsString($val->message);
     }
 
     public function testValidateValue()
diff --git a/tests/framework/validators/RegularExpressionValidatorTest.php b/tests/framework/validators/RegularExpressionValidatorTest.php
index 76166d45a01..847f83724fc 100644
--- a/tests/framework/validators/RegularExpressionValidatorTest.php
+++ b/tests/framework/validators/RegularExpressionValidatorTest.php
@@ -16,7 +16,7 @@
  */
 class RegularExpressionValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -50,7 +50,7 @@ public function testValidateAttribute()
     public function testMessageSetOnInit()
     {
         $val = new RegularExpressionValidator(['pattern' => '/^[a-zA-Z0-9](\.)?([^\/]*)$/m']);
-        $this->assertInternalType('string', $val->message);
+        $this->assertIsString($val->message);
     }
 
     public function testInitException()
diff --git a/tests/framework/validators/RequiredValidatorTest.php b/tests/framework/validators/RequiredValidatorTest.php
index a45f3b10ef9..93a23837e45 100644
--- a/tests/framework/validators/RequiredValidatorTest.php
+++ b/tests/framework/validators/RequiredValidatorTest.php
@@ -17,7 +17,7 @@
  */
 class RequiredValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/validators/StringValidatorTest.php b/tests/framework/validators/StringValidatorTest.php
index bef0db0deb3..e02aff29249 100644
--- a/tests/framework/validators/StringValidatorTest.php
+++ b/tests/framework/validators/StringValidatorTest.php
@@ -16,7 +16,7 @@
  */
 class StringValidatorTest extends TestCase
 {
-    public function setUp()
+    public function setUp(): void
     {
         parent::setUp();
 
@@ -112,9 +112,9 @@ public function testValidateAttribute()
     public function testEnsureMessagesOnInit()
     {
         $val = new StringValidator(['min' => 1, 'max' => 2]);
-        $this->assertInternalType('string', $val->message);
-        $this->assertInternalType('string', $val->tooLong);
-        $this->assertInternalType('string', $val->tooShort);
+        $this->assertIsString($val->message);
+        $this->assertIsString($val->tooLong);
+        $this->assertIsString($val->tooShort);
     }
 
     public function testCustomErrorMessageInValidateAttribute()
diff --git a/tests/framework/validators/UniqueValidatorTest.php b/tests/framework/validators/UniqueValidatorTest.php
index 0c5149e5887..d580eefbc6d 100644
--- a/tests/framework/validators/UniqueValidatorTest.php
+++ b/tests/framework/validators/UniqueValidatorTest.php
@@ -22,7 +22,7 @@
 
 abstract class UniqueValidatorTest extends DatabaseTestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         ActiveRecord::$db = $this->getConnection();
@@ -34,7 +34,7 @@ protected function setUp()
     public function testAssureMessageSetOnInit()
     {
         $val = new UniqueValidator();
-        $this->assertInternalType('string', $val->message);
+        $this->assertIsString($val->message);
     }
 
     public function testCustomMessage()
diff --git a/tests/framework/validators/UrlValidatorTest.php b/tests/framework/validators/UrlValidatorTest.php
index 7872d9d21e9..99866a9655e 100644
--- a/tests/framework/validators/UrlValidatorTest.php
+++ b/tests/framework/validators/UrlValidatorTest.php
@@ -16,7 +16,7 @@
  */
 class UrlValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/validators/ValidatorTest.php b/tests/framework/validators/ValidatorTest.php
index 3f3eb8c0dd0..cd25e3895db 100644
--- a/tests/framework/validators/ValidatorTest.php
+++ b/tests/framework/validators/ValidatorTest.php
@@ -24,7 +24,7 @@
  */
 class ValidatorTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/web/AssetBundleTest.php b/tests/framework/web/AssetBundleTest.php
index a0399d0aa85..70471af07eb 100644
--- a/tests/framework/web/AssetBundleTest.php
+++ b/tests/framework/web/AssetBundleTest.php
@@ -18,7 +18,7 @@
  */
 class AssetBundleTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -124,7 +124,7 @@ public function testSourcesPublish_AssetManagerBeforeCopy()
         $this->assertFalse(is_dir($bundle->basePath));
         foreach ($bundle->js as $filename) {
             $publishedFile = $bundle->basePath . DIRECTORY_SEPARATOR . $filename;
-            $this->assertFileNotExists($publishedFile);
+            $this->assertFileDoesNotExist($publishedFile);
         }
     }
 
@@ -144,7 +144,7 @@ public function testSourcesPublish_AssetBeforeCopy()
         $this->assertFalse(is_dir($bundle->basePath));
         foreach ($bundle->js as $filename) {
             $publishedFile = $bundle->basePath . DIRECTORY_SEPARATOR . $filename;
-            $this->assertFileNotExists($publishedFile);
+            $this->assertFileDoesNotExist($publishedFile);
         }
     }
 
@@ -163,7 +163,7 @@ public function testSourcesPublish_publishOptions_Only()
         $bundle->publish($am);
 
         $notNeededFilesDir = dirname($bundle->basePath . DIRECTORY_SEPARATOR . $bundle->css[0]);
-        $this->assertFileNotExists($notNeededFilesDir);
+        $this->assertFileDoesNotExist($notNeededFilesDir);
 
         foreach ($bundle->js as $filename) {
             $publishedFile = $bundle->basePath . DIRECTORY_SEPARATOR . $filename;
@@ -189,7 +189,9 @@ public function testBasePathIsWritableOnPublish()
         $view = $this->getView(['basePath' => '@testReadOnlyAssetPath']);
         $bundle = new TestSourceAsset();
 
-        $this->setExpectedException('yii\base\InvalidConfigException', 'The directory is not writable by the Web process');
+        $this->expectException(\yii\base\InvalidConfigException::class);
+        $this->expectExceptionMessage('The directory is not writable by the Web process');
+
         $bundle->publish($view->getAssetManager());
 
         FileHelper::removeDirectory($path);
@@ -543,7 +545,7 @@ public function testCustomFilePublishWithTimestamp()
         $am = $view->assetManager;
         // publishing without timestamp
         $result = $am->publish($path . '/data.txt');
-        $this->assertRegExp('/.*data.txt$/i', $result[1]);
+        $this->assertMatchesRegularExpression('/.*data.txt$/i', $result[1]);
         unset($view, $am, $result);
 
         $view = $this->getView();
@@ -551,7 +553,7 @@ public function testCustomFilePublishWithTimestamp()
         // turn on timestamp appending
         $am->appendTimestamp = true;
         $result = $am->publish($path . '/data.txt');
-        $this->assertRegExp('/.*data.txt\?v=\d+$/i', $result[1]);
+        $this->assertMatchesRegularExpression('/.*data.txt\?v=\d+$/i', $result[1]);
     }
 
     /**
@@ -563,7 +565,7 @@ public function testNonRelativeAssetWebPathWithTimestamp()
 
         $view = $this->getView(['appendTimestamp' => true]);
         TestNonRelativeAsset::register($view);
-        $this->assertRegExp(
+        $this->assertMatchesRegularExpression(
             '~123<script src="http:\/\/example\.com\/js\/jquery\.js\?v=\d+"><\/script>4~',
             $view->renderFile('@yiiunit/data/views/rawlayout.php')
         );
diff --git a/tests/framework/web/AssetConverterTest.php b/tests/framework/web/AssetConverterTest.php
index 4b618bc81c0..0d439ee4e26 100644
--- a/tests/framework/web/AssetConverterTest.php
+++ b/tests/framework/web/AssetConverterTest.php
@@ -20,7 +20,7 @@ class AssetConverterTest extends \yiiunit\TestCase
      */
     protected $tmpPath;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -30,7 +30,7 @@ protected function setUp()
         }
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         if (is_dir($this->tmpPath)) {
             FileHelper::removeDirectory($this->tmpPath);
diff --git a/tests/framework/web/ControllerTest.php b/tests/framework/web/ControllerTest.php
index 1ce51eeb298..278a53ea781 100644
--- a/tests/framework/web/ControllerTest.php
+++ b/tests/framework/web/ControllerTest.php
@@ -24,7 +24,7 @@ class ControllerTest extends TestCase
     /** @var FakeController */
     private $controller;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/web/ErrorActionTest.php b/tests/framework/web/ErrorActionTest.php
index 73211650012..d2daa0943f3 100644
--- a/tests/framework/web/ErrorActionTest.php
+++ b/tests/framework/web/ErrorActionTest.php
@@ -19,7 +19,7 @@
  */
 class ErrorActionTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockWebApplication();
@@ -104,8 +104,9 @@ public function testDefaultView()
         // Unset view name. Class should try to load view that matches action name by default
         $action->view = null;
         $ds = preg_quote(DIRECTORY_SEPARATOR, '\\');
-        $this->expectException('yii\base\ViewNotFoundException');
-        $this->expectExceptionMessageRegExp('#The view file does not exist: .*?views' . $ds . 'test' . $ds . 'error.php#');
+        $this->expectException(\yii\base\ViewNotFoundException::class);
+        $this->expectExceptionMessageMatches('#The view file does not exist: .*?views' . $ds . 'test' . $ds . 'error.php#');
+
         $this->invokeMethod($action, 'renderHtmlResponse');
     }
 
diff --git a/tests/framework/web/ErrorHandlerTest.php b/tests/framework/web/ErrorHandlerTest.php
index 1634c572d4a..abf1a5ba2ed 100644
--- a/tests/framework/web/ErrorHandlerTest.php
+++ b/tests/framework/web/ErrorHandlerTest.php
@@ -14,7 +14,7 @@
 
 class ErrorHandlerTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockWebApplication([
@@ -66,7 +66,7 @@ public function testClearAssetFilesInErrorActionView()
         $this->invokeMethod($handler, 'renderException', [new NotFoundHttpException()]);
         ob_get_clean();
         $out = Yii::$app->response->data;
-        $this->assertNotContains('<script', $out);
+        $this->assertStringNotContainsString('<script', $out);
     }
 
     public function testRenderCallStackItem()
@@ -75,9 +75,9 @@ public function testRenderCallStackItem()
         $handler->traceLine = '<a href="netbeans://open?file={file}&line={line}">{html}</a>';
         $file = \yii\BaseYii::getAlias('@yii/web/Application.php');
 
-        $out = $handler->renderCallStackItem($file, 63, \yii\web\Application::className(), null, null, null);
+        $out = $handler->renderCallStackItem($file, 63, \yii\web\Application::class, null, null, null);
 
-        $this->assertContains('<a href="netbeans://open?file=' . $file . '&line=63">', $out);
+        $this->assertStringContainsString('<a href="netbeans://open?file=' . $file . '&line=63">', $out);
     }
 
     public function dataHtmlEncode()
diff --git a/tests/framework/web/FormatterTest.php b/tests/framework/web/FormatterTest.php
index e89e6dcf18c..a84fb310315 100644
--- a/tests/framework/web/FormatterTest.php
+++ b/tests/framework/web/FormatterTest.php
@@ -21,7 +21,7 @@ abstract class FormatterTest extends \yiiunit\TestCase
      */
     public $formatter;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         $this->mockApplication();
         $this->response = new Response();
diff --git a/tests/framework/web/GroupUrlRuleTest.php b/tests/framework/web/GroupUrlRuleTest.php
index 9bc8b26684d..cedb6c57f82 100644
--- a/tests/framework/web/GroupUrlRuleTest.php
+++ b/tests/framework/web/GroupUrlRuleTest.php
@@ -18,7 +18,7 @@
  */
 class GroupUrlRuleTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/web/RequestTest.php b/tests/framework/web/RequestTest.php
index fd4bcb021cc..dd177844eab 100644
--- a/tests/framework/web/RequestTest.php
+++ b/tests/framework/web/RequestTest.php
@@ -91,7 +91,7 @@ public function testCsrfTokenContainsASCIIOnly()
         $request->enableCsrfCookie = false;
 
         $token = $request->getCsrfToken();
-        $this->assertRegExp('~[-_=a-z0-9]~i', $token);
+        $this->assertMatchesRegularExpression('~[-_=a-z0-9]~i', $token);
     }
 
     public function testCsrfTokenValidation()
@@ -430,25 +430,23 @@ public function testSetHostInfo()
         $this->assertSame('servername.com', $request->getHostName());
     }
 
-    /**
-     * @expectedException \yii\base\InvalidConfigException
-     */
     public function testGetScriptFileWithEmptyServer()
     {
         $request = new Request();
         $_SERVER = [];
 
+        $this->expectException(\yii\base\InvalidConfigException::class);
+
         $request->getScriptFile();
     }
 
-    /**
-     * @expectedException \yii\base\InvalidConfigException
-     */
     public function testGetScriptUrlWithEmptyServer()
     {
         $request = new Request();
         $_SERVER = [];
 
+        $this->expectException(\yii\base\InvalidConfigException::class);
+
         $request->getScriptUrl();
     }
 
diff --git a/tests/framework/web/ResponseTest.php b/tests/framework/web/ResponseTest.php
index 2c49964fbcd..3ff3bfeb3f1 100644
--- a/tests/framework/web/ResponseTest.php
+++ b/tests/framework/web/ResponseTest.php
@@ -27,7 +27,7 @@ class ResponseTest extends \yiiunit\TestCase
      */
     public $response;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockWebApplication([
diff --git a/tests/framework/web/UploadedFileTest.php b/tests/framework/web/UploadedFileTest.php
index 0e0892ac004..9acdd0f04e4 100644
--- a/tests/framework/web/UploadedFileTest.php
+++ b/tests/framework/web/UploadedFileTest.php
@@ -19,7 +19,7 @@
  */
 class UploadedFileTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/web/UrlManagerParseUrlTest.php b/tests/framework/web/UrlManagerParseUrlTest.php
index 9111c02cc1d..ee09e05bd06 100644
--- a/tests/framework/web/UrlManagerParseUrlTest.php
+++ b/tests/framework/web/UrlManagerParseUrlTest.php
@@ -65,7 +65,7 @@ protected function getRequest($pathInfo, $hostInfo = 'http://www.example.com', $
         return new Request($config);
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         unset($_POST['_method']);
         parent::tearDown();
diff --git a/tests/framework/web/UrlNormalizerTest.php b/tests/framework/web/UrlNormalizerTest.php
index e2d8201149b..236eea0f3a6 100644
--- a/tests/framework/web/UrlNormalizerTest.php
+++ b/tests/framework/web/UrlNormalizerTest.php
@@ -20,7 +20,7 @@
  */
 class UrlNormalizerTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/web/UrlRuleTest.php b/tests/framework/web/UrlRuleTest.php
index 6dbfbc60598..59867efac08 100644
--- a/tests/framework/web/UrlRuleTest.php
+++ b/tests/framework/web/UrlRuleTest.php
@@ -22,7 +22,7 @@
  */
 class UrlRuleTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -1331,6 +1331,8 @@ public function testGetCreateUrlStatus($config, $tests)
      */
     public function testGetCreateUrlStatusProvider()
     {
+        $this->expectNotToPerformAssertions();
+
         return [
             'route' => [
                 // rule properties
diff --git a/tests/framework/web/UserTest.php b/tests/framework/web/UserTest.php
index e02fe1cf4d7..cf1cc55c735 100644
--- a/tests/framework/web/UserTest.php
+++ b/tests/framework/web/UserTest.php
@@ -38,7 +38,7 @@ class UserTest extends TestCase
      */
     public static $time;
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         Yii::$app->session->removeAll();
         static::$time = null;
@@ -404,14 +404,14 @@ public function testAccessChecker()
 
     public function testGetIdentityException()
     {
-        $session = $this->getMock('yii\web\Session');
+        $session = $this->getMockBuilder(\yii\web\Session::class)->getMock();
         $session->method('getHasSessionId')->willReturn(true);
         $session->method('get')->with($this->equalTo('__id'))->willReturn('1');
 
         $appConfig = [
             'components' => [
                 'user' => [
-                    'identityClass' => ExceptionIdentity::className(),
+                    'identityClass' => ExceptionIdentity::class,
                 ],
                 'session' => $session,
             ],
diff --git a/tests/framework/web/ViewTest.php b/tests/framework/web/ViewTest.php
index d572998cf65..4fcfc7e243c 100644
--- a/tests/framework/web/ViewTest.php
+++ b/tests/framework/web/ViewTest.php
@@ -16,7 +16,7 @@
  */
 class ViewTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
     }
@@ -35,7 +35,7 @@ public function testRegisterJsVar()
         $view = new View();
         $view->registerJsVar('username', 'samdark');
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script>var username = "samdark";</script></head>', $html);
+        $this->assertStringContainsString('<script>var username = "samdark";</script></head>', $html);
 
         $view = new View();
         $view->registerJsVar('objectTest',
@@ -44,7 +44,10 @@ public function testRegisterJsVar()
                 'question' => 'Unknown',
             ]);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script>var objectTest = {"number":42,"question":"Unknown"};</script></head>', $html);
+        $this->assertStringContainsString(
+            '<script>var objectTest = {"number":42,"question":"Unknown"};</script></head>',
+            $html,
+        );
     }
 
     public function testRegisterJsFileWithAlias()
@@ -61,7 +64,7 @@ public function testRegisterJsFileWithAlias()
         $view = new View();
         $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_HEAD]);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="/baseUrl/js/somefile.js"></script></head>', $html);
+        $this->assertStringContainsString('<script src="/baseUrl/js/somefile.js"></script></head>', $html);
 
         $view = new View();
         $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_BEGIN]);
@@ -71,13 +74,13 @@ public function testRegisterJsFileWithAlias()
         $view = new View();
         $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_END]);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="/baseUrl/js/somefile.js"></script></body>', $html);
+        $this->assertStringContainsString('<script src="/baseUrl/js/somefile.js"></script></body>', $html);
 
         // alias with depends
         $view = new View();
         $view->registerJsFile('@web/js/somefile.js', ['position' => View::POS_END, 'depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="/baseUrl/js/somefile.js"></script></body>', $html);
+        $this->assertStringContainsString('<script src="/baseUrl/js/somefile.js"></script></body>', $html);
     }
 
     public function testRegisterCssFileWithAlias()
@@ -94,14 +97,14 @@ public function testRegisterCssFileWithAlias()
         $view = new View();
         $view->registerCssFile('@web/css/somefile.css');
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="/baseUrl/css/somefile.css" rel="stylesheet"></head>', $html);
+        $this->assertStringContainsString('<link href="/baseUrl/css/somefile.css" rel="stylesheet"></head>', $html);
 
         // with depends
         $view = new View();
         $view->registerCssFile('@web/css/somefile.css',
             ['position' => View::POS_END, 'depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="/baseUrl/css/somefile.css" rel="stylesheet"></head>', $html);
+        $this->assertStringContainsString('<link href="/baseUrl/css/somefile.css" rel="stylesheet"></head>', $html);
     }
 
     public function testRegisterregisterCsrfMetaTags()
@@ -113,7 +116,7 @@ public function testRegisterregisterCsrfMetaTags()
                     'scriptUrl' => '/baseUrl/index.php',
                 ],
                 'cache' => [
-                    'class' => FileCache::className(),
+                    'class' => FileCache::class,
                 ],
             ],
         ]);
@@ -122,16 +125,16 @@ public function testRegisterregisterCsrfMetaTags()
 
         $view->registerCsrfMetaTags();
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<meta name="csrf-param" content="_csrf">', $html);
-        $this->assertContains('<meta name="csrf-token" content="', $html);
+        $this->assertStringContainsString('<meta name="csrf-param" content="_csrf">', $html);
+        $this->assertStringContainsString('<meta name="csrf-token" content="', $html);
         $csrfToken1 = $this->getCSRFTokenValue($html);
 
         // regenerate token
         \Yii::$app->request->getCsrfToken(true);
         $view->registerCsrfMetaTags();
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<meta name="csrf-param" content="_csrf">', $html);
-        $this->assertContains('<meta name="csrf-token" content="', $html);
+        $this->assertStringContainsString('<meta name="csrf-param" content="_csrf">', $html);
+        $this->assertStringContainsString('<meta name="csrf-token" content="', $html);
         $csrfToken2 = $this->getCSRFTokenValue($html);
 
         $this->assertNotSame($csrfToken1, $csrfToken2);
@@ -183,7 +186,7 @@ public function testAppendTimestampForRegisterJsFile()
         $view->registerJsFile('/assetSources/js/jquery.js',
             ['depends' => 'yii\web\AssetBundle']); // <script src="/assetSources/js/jquery.js?v=1541056962"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // test append timestamp when @web is prefixed in url
         \Yii::setAlias('@web', '/test-app');
@@ -191,7 +194,7 @@ public function testAppendTimestampForRegisterJsFile()
         $view->registerJsFile(\Yii::getAlias('@web/assetSources/js/jquery.js'),
             ['depends' => 'yii\web\AssetBundle']); // <script src="/assetSources/js/jquery.js?v=1541056962"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // test append timestamp when @web has the same name as the asset-source folder
         \Yii::setAlias('@web', '/assetSources/');
@@ -199,7 +202,7 @@ public function testAppendTimestampForRegisterJsFile()
         $view->registerJsFile(\Yii::getAlias('@web/assetSources/js/jquery.js'),
             ['depends' => 'yii\web\AssetBundle']); // <script src="/assetSources/js/jquery.js?v=1541056962"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
         // reset aliases
         $this->setUpAliases();
 
@@ -207,26 +210,26 @@ public function testAppendTimestampForRegisterJsFile()
         $view = new View();
         $view->registerJsFile('/assetSources/js/jquery.js'); // <script src="/assetSources/js/jquery.js?v=1541056962"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerJsFile('/assetSources/js/jquery.js',
             ['appendTimestamp' => true]); // <script src="/assetSources/js/jquery.js?v=1541056962"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // redefine AssetManager timestamp setting
         $view = new View();
         $view->registerJsFile('/assetSources/js/jquery.js',
             ['appendTimestamp' => false]); // <script src="/assetSources/js/jquery.js"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // with alias
         $view = new View();
         $view->registerJsFile('@web/assetSources/js/jquery.js'); // <script src="/assetSources/js/jquery.js?v=1541056962"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // with alias but wo timestamp
         // redefine AssetManager timestamp setting
@@ -237,35 +240,41 @@ public function testAppendTimestampForRegisterJsFile()
                 'depends' => 'yii\web\AssetBundle',
             ]); // <script src="/assetSources/js/jquery.js"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // wo depends == wo AssetManager
         $view = new View();
         $view->registerJsFile('@web/assetSources/js/jquery.js',
             ['appendTimestamp' => false]); // <script src="/assetSources/js/jquery.js"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // absolute link
         $view = new View();
         $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js');
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
-            $html);
+        $this->assertStringContainsString(
+            '<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
+            $html,
+        );
 
         $view = new View();
         $view->registerJsFile('//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
-            $html);
+        $this->assertStringContainsString(
+            '<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
+            $html,
+        );
 
         $view = new View();
         $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
-            $html);
+        $this->assertStringContainsString(
+            '<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
+            $html,
+        );
 
         \Yii::$app->assetManager->appendTimestamp = false;
 
@@ -273,18 +282,18 @@ public function testAppendTimestampForRegisterJsFile()
         $view->registerJsFile('/assetSources/js/jquery.js',
             ['depends' => 'yii\web\AssetBundle']); // <script src="/assetSources/js/jquery.js"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerJsFile('/assetSources/js/jquery.js'); // <script src="/assetSources/js/jquery.js"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerJsFile('/assetSources/js/jquery.js',
             ['appendTimestamp' => true]); // <script src="/assetSources/js/jquery.js?v=1541056962"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // redefine AssetManager timestamp setting
         $view = new View();
@@ -294,35 +303,40 @@ public function testAppendTimestampForRegisterJsFile()
                 'depends' => 'yii\web\AssetBundle',
             ]); // <script src="/assetSources/js/jquery.js?v=1602294572"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerJsFile('/assetSources/js/jquery.js',
             ['appendTimestamp' => false]); // <script src="/assetSources/js/jquery.js"></script>
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // absolute link
         $view = new View();
         $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js');
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
-            $html);
+        $this->assertStringContainsString(
+            '<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
+            $html,
+        );
 
         $view = new View();
         $view->registerJsFile('//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
-            $html);
+        $this->assertStringContainsString(
+            '<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
+            $html,
+        );
 
         $view = new View();
         $view->registerJsFile('http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
-            $html);
-
+        $this->assertStringContainsString(
+            '<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>',
+            $html,
+        );
     }
 
     public function testAppendTimestampForRegisterCssFile()
@@ -347,7 +361,7 @@ public function testAppendTimestampForRegisterCssFile()
         $view->registerCssFile('/assetSources/css/stub.css',
             ['depends' => 'yii\web\AssetBundle']); // <link href="/assetSources/css/stub.css?v=1541056962" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // test append timestamp when @web is prefixed in url
         \Yii::setAlias('@web', '/test-app');
@@ -355,7 +369,7 @@ public function testAppendTimestampForRegisterCssFile()
         $view->registerCssFile(\Yii::getAlias('@web/assetSources/css/stub.css'),
             ['depends' => 'yii\web\AssetBundle']); // <link href="/assetSources/css/stub.css?v=1541056962" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // test append timestamp when @web has the same name as the asset-source folder
         \Yii::setAlias('@web', '/assetSources/');
@@ -363,7 +377,7 @@ public function testAppendTimestampForRegisterCssFile()
         $view->registerCssFile(\Yii::getAlias('@web/assetSources/css/stub.css'),
             ['depends' => 'yii\web\AssetBundle']); // <link href="/assetSources/css/stub.css?v=1541056962" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
         // reset aliases
         $this->setUpAliases();
 
@@ -371,26 +385,26 @@ public function testAppendTimestampForRegisterCssFile()
         $view = new View();
         $view->registerCssFile('/assetSources/css/stub.css'); // <link href="/assetSources/css/stub.css?v=1541056962" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerCssFile('/assetSources/css/stub.css',
             ['appendTimestamp' => true]); // <link href="/assetSources/css/stub.css?v=1541056962" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // redefine AssetManager timestamp setting
         $view = new View();
         $view->registerCssFile('/assetSources/css/stub.css',
             ['appendTimestamp' => false]); // <link href="/assetSources/css/stub.css" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // with alias
         $view = new View();
         $view->registerCssFile('@web/assetSources/css/stub.css'); // <link href="/assetSources/css/stub.css?v=1541056962" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // with alias but wo timestamp
         // redefine AssetManager timestamp setting
@@ -401,35 +415,41 @@ public function testAppendTimestampForRegisterCssFile()
                 'depends' => 'yii\web\AssetBundle',
             ]); // <link href="/assetSources/css/stub.css" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // wo depends == wo AssetManager
         $view = new View();
         $view->registerCssFile('@web/assetSources/css/stub.css',
             ['appendTimestamp' => false]); // <link href="/assetSources/css/stub.css" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // absolute link
         $view = new View();
         $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css');
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
-            $html);
+        $this->assertStringContainsString(
+            '<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
+            $html,
+        );
 
         $view = new View();
         $view->registerCssFile('//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
-            $html);
+        $this->assertStringContainsString(
+            '<link href="//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
+            $html,
+        );
 
         $view = new View();
         $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
-            $html);
+        $this->assertStringContainsString(
+            '<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
+            $html,
+        );
 
         \Yii::$app->assetManager->appendTimestamp = false;
 
@@ -437,18 +457,18 @@ public function testAppendTimestampForRegisterCssFile()
         $view->registerCssFile('/assetSources/css/stub.css',
             ['depends' => 'yii\web\AssetBundle']); // <link href="/assetSources/css/stub.css" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerCssFile('/assetSources/css/stub.css'); // <link href="/assetSources/css/stub.css" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerCssFile('/assetSources/css/stub.css',
             ['appendTimestamp' => true]); // <link href="/assetSources/css/stub.css?v=1541056962" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         // redefine AssetManager timestamp setting
         $view = new View();
@@ -458,33 +478,39 @@ public function testAppendTimestampForRegisterCssFile()
                 'depends' => 'yii\web\AssetBundle',
             ]); // <link href="/assetSources/css/stub.css?v=1602294572" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertRegExp($pattern, $html);
+        $this->assertMatchesRegularExpression($pattern, $html);
 
         $view = new View();
         $view->registerCssFile('/assetSources/css/stub.css',
             ['appendTimestamp' => false]); // <link href="/assetSources/css/stub.css" rel="stylesheet" >
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertNotRegExp($pattern, $html);
+        $this->assertDoesNotMatchRegularExpression($pattern, $html);
 
         // absolute link
         $view = new View();
         $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css');
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
-            $html);
+        $this->assertStringContainsString(
+            '<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
+            $html,
+        );
 
         $view = new View();
         $view->registerCssFile('//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
-            $html);
+        $this->assertStringContainsString(
+            '<link href="//cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
+            $html,
+        );
 
         $view = new View();
         $view->registerCssFile('https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css',
             ['depends' => 'yii\web\AssetBundle']);
         $html = $view->render('@yiiunit/data/views/layout.php', ['content' => 'content']);
-        $this->assertContains('<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
-            $html);
+        $this->assertStringContainsString(
+            '<link href="https://cdnjs.cloudflare.com/ajax/libs/balloon-css/1.0.3/balloon.css" rel="stylesheet">',
+            $html,
+        );
     }
 }
diff --git a/tests/framework/web/session/AbstractDbSessionTest.php b/tests/framework/web/session/AbstractDbSessionTest.php
index 5fdfe50f98b..f8dbb32f550 100644
--- a/tests/framework/web/session/AbstractDbSessionTest.php
+++ b/tests/framework/web/session/AbstractDbSessionTest.php
@@ -27,7 +27,7 @@ abstract class AbstractDbSessionTest extends TestCase
      */
     abstract protected function getDriverNames();
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
@@ -37,7 +37,7 @@ protected function setUp()
         $this->createTableSession();
     }
 
-    protected function tearDown()
+    protected function tearDown(): void
     {
         $this->dropTableSession();
         parent::tearDown();
diff --git a/tests/framework/web/session/CacheSessionTest.php b/tests/framework/web/session/CacheSessionTest.php
index d34f7b7f82f..cc62e1b3681 100644
--- a/tests/framework/web/session/CacheSessionTest.php
+++ b/tests/framework/web/session/CacheSessionTest.php
@@ -18,7 +18,7 @@ class CacheSessionTest extends \yiiunit\TestCase
 {
     use SessionTestTrait;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/web/session/pgsql/DbSessionTest.php b/tests/framework/web/session/pgsql/DbSessionTest.php
index 8ef66fd0130..9af861b09f7 100644
--- a/tests/framework/web/session/pgsql/DbSessionTest.php
+++ b/tests/framework/web/session/pgsql/DbSessionTest.php
@@ -17,7 +17,7 @@
  */
 class DbSessionTest extends \yiiunit\framework\web\session\AbstractDbSessionTest
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         if (defined('HHVM_VERSION')) {
             $this->markTestSkipped('HHVMs PgSQL implementation does not seem to support blob columns in the way they are used here.');
diff --git a/tests/framework/web/session/sqlite/DbSessionTest.php b/tests/framework/web/session/sqlite/DbSessionTest.php
index e13539cebd0..a7e0154f538 100644
--- a/tests/framework/web/session/sqlite/DbSessionTest.php
+++ b/tests/framework/web/session/sqlite/DbSessionTest.php
@@ -19,7 +19,7 @@
  */
 class DbSessionTest extends \yiiunit\framework\web\session\AbstractDbSessionTest
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/widgets/ActiveFieldTest.php b/tests/framework/widgets/ActiveFieldTest.php
index 0ac63c77b3f..172439a150a 100644
--- a/tests/framework/widgets/ActiveFieldTest.php
+++ b/tests/framework/widgets/ActiveFieldTest.php
@@ -7,6 +7,7 @@
 
 namespace yiiunit\framework\widgets;
 
+use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
 use Yii;
 use yii\base\DynamicModel;
 use yii\web\AssetManager;
@@ -23,6 +24,8 @@
  */
 class ActiveFieldTest extends \yiiunit\TestCase
 {
+    use ArraySubsetAsserts;
+
     /**
      * @var ActiveFieldExtend
      */
@@ -37,7 +40,7 @@ class ActiveFieldTest extends \yiiunit\TestCase
     private $helperForm;
     private $attributeName = 'attributeName';
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         // dirty way to have Request object not throwing exception when running testHomeLinkNull()
@@ -668,26 +671,26 @@ public function testOptionsClass()
 
     public function testInputOptionsTransferToWidget()
     {
-        $widget = $this->activeField->widget(TestMaskedInput::className(), [
+        $widget = $this->activeField->widget(TestMaskedInput::class, [
             'mask' => '999-999-9999',
             'options' => ['placeholder' => 'pholder_direct'],
         ]);
-        $this->assertContains('placeholder="pholder_direct"', (string) $widget);
+        $this->assertStringContainsString('placeholder="pholder_direct"', (string) $widget);
 
         // transfer options from ActiveField to widget
         $this->activeField->inputOptions = ['placeholder' => 'pholder_input'];
-        $widget = $this->activeField->widget(TestMaskedInput::className(), [
+        $widget = $this->activeField->widget(TestMaskedInput::class, [
             'mask' => '999-999-9999',
         ]);
-        $this->assertContains('placeholder="pholder_input"', (string) $widget);
+        $this->assertStringContainsString('placeholder="pholder_input"', (string) $widget);
 
         // set both AF and widget options (second one takes precedence)
         $this->activeField->inputOptions = ['placeholder' => 'pholder_both_input'];
-        $widget = $this->activeField->widget(TestMaskedInput::className(), [
+        $widget = $this->activeField->widget(TestMaskedInput::class, [
             'mask' => '999-999-9999',
             'options' => ['placeholder' => 'pholder_both_direct']
         ]);
-        $this->assertContains('placeholder="pholder_both_direct"', (string) $widget);
+        $this->assertStringContainsString('placeholder="pholder_both_direct"', (string) $widget);
     }
 
     /**
diff --git a/tests/framework/widgets/ActiveFormTest.php b/tests/framework/widgets/ActiveFormTest.php
index 64f921b0c24..11f8a09b0b0 100644
--- a/tests/framework/widgets/ActiveFormTest.php
+++ b/tests/framework/widgets/ActiveFormTest.php
@@ -17,7 +17,7 @@
  */
 class ActiveFormTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
@@ -132,6 +132,9 @@ public function testRegisterClientScript()
         $form = ActiveForm::begin(['view' => $view, 'enableClientScript' => false]);
         $form->field($model, 'name');
         $form::end();
+
+        $this->expectNotToPerformAssertions();
+
         ob_get_clean();
     }
 
diff --git a/tests/framework/widgets/BlockTest.php b/tests/framework/widgets/BlockTest.php
index c7b8ad2f6ec..a6b6d7fc9c9 100644
--- a/tests/framework/widgets/BlockTest.php
+++ b/tests/framework/widgets/BlockTest.php
@@ -14,7 +14,7 @@
  */
 class BlockTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/widgets/BreadcrumbsTest.php b/tests/framework/widgets/BreadcrumbsTest.php
index 5a4fddcbb3b..fd2106c7bfc 100644
--- a/tests/framework/widgets/BreadcrumbsTest.php
+++ b/tests/framework/widgets/BreadcrumbsTest.php
@@ -19,7 +19,7 @@ class BreadcrumbsTest extends \yiiunit\TestCase
 {
     private $breadcrumbs;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         // dirty way to have Request object not throwing exception when running testHomeLinkNull()
diff --git a/tests/framework/widgets/ContentDecoratorTest.php b/tests/framework/widgets/ContentDecoratorTest.php
index 02fc9a49766..c33c507ea73 100644
--- a/tests/framework/widgets/ContentDecoratorTest.php
+++ b/tests/framework/widgets/ContentDecoratorTest.php
@@ -14,7 +14,7 @@
  */
 class ContentDecoratorTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/widgets/DetailViewTest.php b/tests/framework/widgets/DetailViewTest.php
index a2fd34ef124..6b2f7fe3d96 100644
--- a/tests/framework/widgets/DetailViewTest.php
+++ b/tests/framework/widgets/DetailViewTest.php
@@ -20,7 +20,7 @@ class DetailViewTest extends \yiiunit\TestCase
     /** @var DetailView */
     public $detailView;
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
 
diff --git a/tests/framework/widgets/FragmentCacheTest.php b/tests/framework/widgets/FragmentCacheTest.php
index a3b040e8f9d..a08a0795efb 100644
--- a/tests/framework/widgets/FragmentCacheTest.php
+++ b/tests/framework/widgets/FragmentCacheTest.php
@@ -17,7 +17,7 @@
  */
 class FragmentCacheTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockWebApplication();
diff --git a/tests/framework/widgets/LinkPagerTest.php b/tests/framework/widgets/LinkPagerTest.php
index 265b891362b..492bf891b4a 100644
--- a/tests/framework/widgets/LinkPagerTest.php
+++ b/tests/framework/widgets/LinkPagerTest.php
@@ -16,7 +16,7 @@
  */
 class LinkPagerTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication([
@@ -52,8 +52,14 @@ public function testFirstLastPageLabels()
             'lastPageLabel' => true,
         ]);
 
-        static::assertContains('<li class="first"><a href="/?r=test&amp;page=1" data-page="0">1</a></li>', $output);
-        static::assertContains('<li class="last"><a href="/?r=test&amp;page=25" data-page="24">25</a></li>', $output);
+        $this->assertStringContainsString(
+            '<li class="first"><a href="/?r=test&amp;page=1" data-page="0">1</a></li>',
+            $output,
+        );
+        $this->assertStringContainsString(
+            '<li class="last"><a href="/?r=test&amp;page=25" data-page="24">25</a></li>',
+            $output,
+        );
 
         $output = LinkPager::widget([
             'pagination' => $pagination,
@@ -61,8 +67,14 @@ public function testFirstLastPageLabels()
             'lastPageLabel' => 'Last',
         ]);
 
-        static::assertContains('<li class="first"><a href="/?r=test&amp;page=1" data-page="0">First</a></li>', $output);
-        static::assertContains('<li class="last"><a href="/?r=test&amp;page=25" data-page="24">Last</a></li>', $output);
+        $this->assertStringContainsString(
+            '<li class="first"><a href="/?r=test&amp;page=1" data-page="0">First</a></li>',
+            $output,
+        );
+        $this->assertStringContainsString(
+            '<li class="last"><a href="/?r=test&amp;page=25" data-page="24">Last</a></li>',
+            $output,
+        );
 
         $output = LinkPager::widget([
             'pagination' => $pagination,
@@ -70,8 +82,8 @@ public function testFirstLastPageLabels()
             'lastPageLabel' => false,
         ]);
 
-        static::assertNotContains('<li class="first">', $output);
-        static::assertNotContains('<li class="last">', $output);
+        $this->assertStringNotContainsString('<li class="first">', $output);
+        $this->assertStringNotContainsString('<li class="last">', $output);
     }
 
     public function testDisabledPageElementOptions()
@@ -81,7 +93,7 @@ public function testDisabledPageElementOptions()
             'disabledListItemSubTagOptions' => ['class' => 'foo-bar'],
         ]);
 
-        static::assertContains('<span class="foo-bar">&laquo;</span>', $output);
+        $this->assertStringContainsString('<span class="foo-bar">&laquo;</span>', $output);
     }
 
     public function testDisabledPageElementOptionsWithTagOption()
@@ -91,7 +103,7 @@ public function testDisabledPageElementOptionsWithTagOption()
             'disabledListItemSubTagOptions' => ['class' => 'foo-bar', 'tag' => 'div'],
         ]);
 
-        static::assertContains('<div class="foo-bar">&laquo;</div>', $output);
+        $this->assertStringContainsString('<div class="foo-bar">&laquo;</div>', $output);
     }
 
     public function testDisableCurrentPageButton()
@@ -102,14 +114,17 @@ public function testDisableCurrentPageButton()
             'disableCurrentPageButton' => false,
         ]);
 
-        static::assertContains('<li class="active"><a href="/?r=test&amp;page=6" data-page="5">6</a></li>', $output);
+        $this->assertStringContainsString(
+            '<li class="active"><a href="/?r=test&amp;page=6" data-page="5">6</a></li>',
+            $output,
+        );
 
         $output = LinkPager::widget([
             'pagination' => $pagination,
             'disableCurrentPageButton' => true,
         ]);
 
-        static::assertContains('<li class="active disabled"><span>6</span></li>', $output);
+        $this->assertStringContainsString('<li class="active disabled"><span>6</span></li>', $output);
     }
 
     public function testOptionsWithTagOption()
@@ -135,13 +150,13 @@ public function testLinkWrapOptions()
             ],
         ]);
 
-        $this->assertContains(
+        $this->assertStringContainsString(
             '<div class="my-class"><a href="/?r=test&amp;page=3" data-page="2">3</a></div>',
-            $output
+            $output,
         );
-        $this->assertContains(
+        $this->assertStringContainsString(
             '<div class="my-class active"><a href="/?r=test&amp;page=2" data-page="1">2</a></div>',
-            $output
+            $output,
         );
     }
 
diff --git a/tests/framework/widgets/LinkSorterTest.php b/tests/framework/widgets/LinkSorterTest.php
index 49da1fce71e..652b8c18c2d 100644
--- a/tests/framework/widgets/LinkSorterTest.php
+++ b/tests/framework/widgets/LinkSorterTest.php
@@ -22,7 +22,7 @@ class LinkSorterTest extends DatabaseTestCase
 {
     protected $driverName = 'sqlite';
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         ActiveRecord::$db = $this->getConnection();
diff --git a/tests/framework/widgets/ListViewTest.php b/tests/framework/widgets/ListViewTest.php
index 6d3ff286f1f..8f01b9e78bd 100644
--- a/tests/framework/widgets/ListViewTest.php
+++ b/tests/framework/widgets/ListViewTest.php
@@ -18,7 +18,7 @@
  */
 class ListViewTest extends TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/widgets/MenuTest.php b/tests/framework/widgets/MenuTest.php
index 192bb44131f..c8f8a3515bc 100644
--- a/tests/framework/widgets/MenuTest.php
+++ b/tests/framework/widgets/MenuTest.php
@@ -15,7 +15,7 @@
  */
 class MenuTest extends \yiiunit\TestCase
 {
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockApplication();
diff --git a/tests/framework/widgets/PjaxTest.php b/tests/framework/widgets/PjaxTest.php
index e08d5776f17..209fa16e0cc 100644
--- a/tests/framework/widgets/PjaxTest.php
+++ b/tests/framework/widgets/PjaxTest.php
@@ -33,7 +33,7 @@ public function testGeneratedIdByPjaxWidget()
         $this->assertEquals('p1', $pjax2->options['id']);
     }
 
-    protected function setUp()
+    protected function setUp(): void
     {
         parent::setUp();
         $this->mockWebApplication();

From 6f21a9c327d3aaa52eebf87641064dc466bf202c Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 12:57:40 -0300
Subject: [PATCH 02/11] Update `.appveyor.yml`.

---
 .appveyor.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.appveyor.yml b/.appveyor.yml
index 8b529e45537..87acc961fa7 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -4,7 +4,7 @@ clone_folder: C:\projects\yii2
 
 environment:
     matrix:
-      - php_ver: 7.2.4
+      - php_ver: 7.4.0
 
 cache:
     - '%APPDATA%\Composer'

From 100d7ae29d8ac3a6fdb392a5eaf5e2feaee620ba Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 13:29:55 -0300
Subject: [PATCH 03/11] Apply suggestion @rob006.

---
 .appveyor.yml               | 2 +-
 .github/workflows/build.yml | 4 ++++
 composer.json               | 2 +-
 framework/composer.json     | 2 +-
 4 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/.appveyor.yml b/.appveyor.yml
index 87acc961fa7..9293ea014ee 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -4,7 +4,7 @@ clone_folder: C:\projects\yii2
 
 environment:
     matrix:
-      - php_ver: 7.4.0
+      - php_ver: 7.3.0
 
 cache:
     - '%APPDATA%\Composer'
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ac2bb585fc6..84003c493bf 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -21,6 +21,10 @@ jobs:
       fail-fast: false
       matrix:
         include:
+          - php: 7.3
+            coverage: xdebug
+            extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
+            os: ubuntu-latest
           - php: 7.4
             coverage: xdebug
             extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
diff --git a/composer.json b/composer.json
index 79c07885295..6b4c9af96ca 100644
--- a/composer.json
+++ b/composer.json
@@ -68,7 +68,7 @@
         "yiisoft/yii2": "self.version"
     },
     "require": {
-        "php": ">=7.4.0",
+        "php": ">=7.3.0",
         "ext-mbstring": "*",
         "ext-ctype": "*",
         "lib-pcre": "*",
diff --git a/framework/composer.json b/framework/composer.json
index 2db0b478095..da43e4272f2 100644
--- a/framework/composer.json
+++ b/framework/composer.json
@@ -63,7 +63,7 @@
         "source": "https://github.com/yiisoft/yii2"
     },
     "require": {
-        "php": ">=7.4.0",
+        "php": ">=7.3.0",
         "ext-mbstring": "*",
         "ext-ctype": "*",
         "lib-pcre": "*",

From 1a25599ab5f1b03df76a1a0d00b964ddc1309fd7 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 13:34:27 -0300
Subject: [PATCH 04/11] Add compatibility `PHP 7.3`.

---
 tests/IsOneOfAssert.php | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/tests/IsOneOfAssert.php b/tests/IsOneOfAssert.php
index 830e560c564..bdb6b2bab89 100644
--- a/tests/IsOneOfAssert.php
+++ b/tests/IsOneOfAssert.php
@@ -14,10 +14,12 @@
  */
 class IsOneOfAssert extends \PHPUnit\Framework\Constraint\Constraint
 {
-    private array $allowedValues = [];
+    /**
+     * @var array the expected values
+     */
+    private $allowedValues = [];
 
-    /** @psalm-param string[] $allowedValues */
-    public function __construct(array $allowedValues)
+    public function __construct($allowedValues)
     {
         $this->allowedValues = $allowedValues;
     }

From 8ec7954764d22afaaf76b1fc798e7d93325b41c3 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 13:37:10 -0300
Subject: [PATCH 05/11] Reomove unsed class.

---
 framework/base/Object.php | 30 ------------------------------
 1 file changed, 30 deletions(-)
 delete mode 100644 framework/base/Object.php

diff --git a/framework/base/Object.php b/framework/base/Object.php
deleted file mode 100644
index 20b68f16958..00000000000
--- a/framework/base/Object.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * @link https://www.yiiframework.com/
- * @copyright Copyright (c) 2008 Yii Software LLC
- * @license https://www.yiiframework.com/license/
- */
-
-namespace yii\base;
-
-use Yii;
-
-/**
- * Object is the base class that implements the *property* feature.
- *
- * It has been replaced by [[BaseObject]] in version 2.0.13 because `object` has become a reserved word which can not be
- * used as class name in PHP 7.2.
- *
- * Please refer to [[BaseObject]] for detailed documentation and to the
- * [UPGRADE notes](https://github.com/yiisoft/yii2/blob/2.0.13/framework/UPGRADE.md#upgrade-from-yii-2012)
- * on how to migrate your application to use [[BaseObject]] class to make your application compatible with PHP 7.2.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @since 2.0
- * @deprecated since 2.0.13, the class name `Object` is invalid since PHP 7.2, use [[BaseObject]] instead.
- * @see https://wiki.php.net/rfc/object-typehint
- * @see https://github.com/yiisoft/yii2/issues/7936#issuecomment-315384669
- */
-class Object extends BaseObject
-{
-}

From a59e6d2015dc95ad1626a440406bd9406a623a13 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 13:44:09 -0300
Subject: [PATCH 06/11] Use composer v.2 in appveyor tests.

---
 .appveyor.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.appveyor.yml b/.appveyor.yml
index 9293ea014ee..d1d1cc0ba41 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -34,6 +34,7 @@ install:
 
 before_test:
     - cd C:\projects\yii2
+    - php C:\tools\composer.phar selfupdate --2
     - php C:\tools\composer.phar update --no-interaction --no-progress --prefer-stable --no-ansi
 
 test_script:

From 6cdef808cb5defcd437e5a5c44d090a46e5051c6 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 13:48:55 -0300
Subject: [PATCH 07/11] Download composer v.2.

---
 .appveyor.yml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/.appveyor.yml b/.appveyor.yml
index d1d1cc0ba41..92006505103 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -30,11 +30,10 @@ install:
     - echo extension=php_mbstring.dll >> php.ini
     - echo extension=php_openssl.dll >> php.ini
     - echo extension=php_pdo_sqlite.dll >> php.ini
-    - IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/1.4.1/composer.phar)
+    - IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/2.6.3/composer.phar)
 
 before_test:
     - cd C:\projects\yii2
-    - php C:\tools\composer.phar selfupdate --2
     - php C:\tools\composer.phar update --no-interaction --no-progress --prefer-stable --no-ansi
 
 test_script:

From 995740b891c5e9de2917c9cf568f0acc7963c35b Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Wed, 20 Sep 2023 14:26:55 -0300
Subject: [PATCH 08/11] Fix tests Oracle, add `expectNotToPerformAssertions()`
 in `testTransactionIsolation()`.

---
 tests/framework/db/ConnectionTest.php        | 5 +++--
 tests/framework/db/oci/ActiveRecordTest.php  | 6 +++---
 tests/framework/db/oci/ConnectionTest.php    | 3 +++
 tests/framework/db/pgsql/ConnectionTest.php  | 5 +++--
 tests/framework/db/sqlite/ConnectionTest.php | 5 +++--
 5 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/tests/framework/db/ConnectionTest.php b/tests/framework/db/ConnectionTest.php
index ed38ed785bb..848ec9ddad1 100644
--- a/tests/framework/db/ConnectionTest.php
+++ b/tests/framework/db/ConnectionTest.php
@@ -219,9 +219,10 @@ public function testTransactionIsolation()
         $transaction->commit();
 
         $transaction = $connection->beginTransaction(Transaction::SERIALIZABLE);
-        $transaction->commit();
 
-        $this->assertTrue(true); // should not be any exception so far
+        $this->expectNotToPerformAssertions();
+
+        $transaction->commit();
     }
 
     public function testTransactionShortcutException()
diff --git a/tests/framework/db/oci/ActiveRecordTest.php b/tests/framework/db/oci/ActiveRecordTest.php
index 6be10ccc352..b73224ee6de 100644
--- a/tests/framework/db/oci/ActiveRecordTest.php
+++ b/tests/framework/db/oci/ActiveRecordTest.php
@@ -25,9 +25,8 @@ class ActiveRecordTest extends \yiiunit\framework\db\ActiveRecordTest
 
     public function testCastValues()
     {
-        // pass, because boolean casting is not available
-        return;
         $model = new Type();
+
         $model->int_col = 123;
         $model->int_col2 = 456;
         $model->smallint_col = 42;
@@ -42,13 +41,14 @@ public function testCastValues()
 
         /* @var $model Type */
         $model = Type::find()->one();
+
         $this->assertSame(123, $model->int_col);
         $this->assertSame(456, $model->int_col2);
         $this->assertSame(42, $model->smallint_col);
         $this->assertSame('1337', trim($model->char_col));
         $this->assertSame('test', $model->char_col2);
         $this->assertSame('test123', $model->char_col3);
-        $this->assertSame(1337.42, $model->float_col);
+        $this->assertSame(3.742, $model->float_col);
         $this->assertSame(42.1337, $model->float_col2);
         $this->assertEquals('1', $model->bool_col);
         $this->assertEquals('0', $model->bool_col2);
diff --git a/tests/framework/db/oci/ConnectionTest.php b/tests/framework/db/oci/ConnectionTest.php
index 0d0bf842ef6..6a6aaba991e 100644
--- a/tests/framework/db/oci/ConnectionTest.php
+++ b/tests/framework/db/oci/ConnectionTest.php
@@ -84,6 +84,9 @@ public function testTransactionIsolation()
         $transaction->commit();
 
         $transaction = $connection->beginTransaction(Transaction::SERIALIZABLE);
+
+        $this->expectNotToPerformAssertions();
+
         $transaction->commit();
     }
 
diff --git a/tests/framework/db/pgsql/ConnectionTest.php b/tests/framework/db/pgsql/ConnectionTest.php
index c3a6d0c68eb..16defb7e8e3 100644
--- a/tests/framework/db/pgsql/ConnectionTest.php
+++ b/tests/framework/db/pgsql/ConnectionTest.php
@@ -99,8 +99,9 @@ public function testTransactionIsolation()
 
         $transaction = $connection->beginTransaction();
         $transaction->setIsolationLevel(Transaction::SERIALIZABLE . ' READ ONLY DEFERRABLE');
-        $transaction->commit();
 
-        $this->assertTrue(true); // No error occurred – assert passed.
+        $this->expectNotToPerformAssertions();
+
+        $transaction->commit();
     }
 }
diff --git a/tests/framework/db/sqlite/ConnectionTest.php b/tests/framework/db/sqlite/ConnectionTest.php
index 5ff572313f6..7b41cd5b44d 100644
--- a/tests/framework/db/sqlite/ConnectionTest.php
+++ b/tests/framework/db/sqlite/ConnectionTest.php
@@ -44,9 +44,10 @@ public function testTransactionIsolation()
         $transaction->rollBack();
 
         $transaction = $connection->beginTransaction(Transaction::SERIALIZABLE);
-        $transaction->rollBack();
 
-        $this->assertTrue(true); // No exceptions means test is passed.
+        $this->expectNotToPerformAssertions();
+
+        $transaction->rollBack();
     }
 
     public function testMasterSlave()

From 531b923785cbc4e00dd184c9b31e2d4ba79b8888 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Fri, 22 Sep 2023 12:59:10 -0300
Subject: [PATCH 09/11] Update `composer.lock`.

---
 composer.lock | 167 +++++++++++++++++---------------------------------
 1 file changed, 56 insertions(+), 111 deletions(-)

diff --git a/composer.lock b/composer.lock
index 6204433deab..3190b2d73c3 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "80e3f228bae519816def145a5a1d47ae",
+    "content-hash": "1431e21b5959846da9557d3544fe67f9",
     "packages": [
         {
             "name": "bower-asset/inputmask",
@@ -206,6 +206,56 @@
             },
             "time": "2022-09-18T07:06:19+00:00"
         },
+        {
+            "name": "paragonie/random_compat",
+            "version": "v9.99.100",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/random_compat.git",
+                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+                "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">= 7"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*|5.*",
+                "vimeo/psalm": "^1"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            },
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com"
+                }
+            ],
+            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+            "keywords": [
+                "csprng",
+                "polyfill",
+                "pseudorandom",
+                "random"
+            ],
+            "support": {
+                "email": "info@paragonie.com",
+                "issues": "https://github.com/paragonie/random_compat/issues",
+                "source": "https://github.com/paragonie/random_compat"
+            },
+            "time": "2020-10-15T08:29:30+00:00"
+        },
         {
             "name": "yiisoft/yii2-composer",
             "version": "2.0.10",
@@ -558,65 +608,7 @@
                 "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0"
             },
             "require-dev": {
-                "composer/composer": "~1.0 || ~2.0",
-                "phpunit/phpunit": "~4.6"
-            },
-            "type": "composer-plugin",
-            "extra": {
-                "class": "cweagans\\Composer\\Patches"
-            },
-            "autoload": {
-                "psr-4": {
-                    "cweagans\\Composer\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Cameron Eagans",
-                    "email": "me@cweagans.net"
-                }
-            ],
-            "description": "Provides a way to patch Composer packages.",
-            "support": {
-                "issues": "https://github.com/cweagans/composer-patches/issues",
-                "source": "https://github.com/cweagans/composer-patches/tree/1.7.3"
-            },
-            "time": "2022-12-20T22:53:13+00:00"
-        },
-        {
-            "name": "doctrine/annotations",
-            "version": "1.14.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/annotations.git",
-                "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af",
-                "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/lexer": "^1 || ^2",
-                "ext-tokenizer": "*",
-                "php": "^7.1 || ^8.0",
-                "psr/cache": "^1 || ^2 || ^3"
-            },
-            "require-dev": {
-                "doctrine/cache": "^1.11 || ^2.0",
-                "doctrine/coding-standard": "^9 || ^10",
-                "phpstan/phpstan": "~1.4.10 || ^1.8.0",
-                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "symfony/cache": "^4.4 || ^5.4 || ^6",
-                "vimeo/psalm": "^4.10"
-            },
-            "suggest": {
-                "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+                "dms/coding-standard": "^9"
             },
             "type": "library",
             "autoload": {
@@ -636,57 +628,10 @@
             ],
             "description": "This package provides ArraySubset and related asserts once deprecated in PHPUnit 8",
             "support": {
-                "issues": "https://github.com/doctrine/annotations/issues",
-                "source": "https://github.com/doctrine/annotations/tree/1.14.3"
-            },
-            "time": "2023-02-01T09:20:38+00:00"
-        },
-        {
-            "name": "doctrine/deprecations",
-            "version": "v1.1.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/deprecations.git",
-                "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
-                "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1 || ^8.0"
-            },
-            "require-dev": {
-                "doctrine/coding-standard": "^9",
-                "phpstan/phpstan": "1.4.10 || 1.10.15",
-                "phpstan/phpstan-phpunit": "^1.0",
-                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
-                "psalm/plugin-phpunit": "0.18.4",
-                "psr/log": "^1 || ^2 || ^3",
-                "vimeo/psalm": "4.30.0 || 5.12.0"
-            },
-            "suggest": {
-                "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
-            "homepage": "https://www.doctrine-project.org/",
-            "support": {
-                "issues": "https://github.com/doctrine/deprecations/issues",
-                "source": "https://github.com/doctrine/deprecations/tree/v1.1.1"
+                "issues": "https://github.com/rdohms/phpunit-arraysubset-asserts/issues",
+                "source": "https://github.com/rdohms/phpunit-arraysubset-asserts/tree/v0.5.0"
             },
-            "time": "2023-06-03T09:27:29+00:00"
+            "time": "2023-06-02T17:33:53+00:00"
         },
         {
             "name": "doctrine/instantiator",
@@ -3967,7 +3912,7 @@
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
-        "php": ">=7.4.0",
+        "php": ">=7.3.0",
         "ext-mbstring": "*",
         "ext-ctype": "*",
         "lib-pcre": "*"

From e79614b4af121afcc961392f25e0fa9532c04f5c Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Thu, 5 Oct 2023 12:01:20 -0300
Subject: [PATCH 10/11] Do not modify the code.

---
 framework/console/widgets/Table.php           | 5 -----
 tests/framework/console/widgets/TableTest.php | 2 +-
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/framework/console/widgets/Table.php b/framework/console/widgets/Table.php
index 070d6c77361..41d18a128bc 100644
--- a/framework/console/widgets/Table.php
+++ b/framework/console/widgets/Table.php
@@ -113,11 +113,6 @@ class Table extends Widget
      */
     protected $listPrefix = '• ';
 
-    public function getColumnWidths()
-    {
-        return $this->columnWidths;
-    }
-
     /**
      * Set table headers.
      *
diff --git a/tests/framework/console/widgets/TableTest.php b/tests/framework/console/widgets/TableTest.php
index 24f533cdf96..44e9f4427a9 100644
--- a/tests/framework/console/widgets/TableTest.php
+++ b/tests/framework/console/widgets/TableTest.php
@@ -502,7 +502,7 @@ public function testColorizedInputStripsANSIMarkersInternally()
             ->setScreenWidth(200)
             ->run();
 
-        $columnWidths = $table->getColumnWidths();
+        $columnWidths = $this->getInaccessibleProperty($table, 'columnWidths');
 
         $this->assertArrayHasKey(1, $columnWidths);
         $this->assertEquals(4+2, $columnWidths[1]);

From 826a0f24423b0f43fc24e592a733a9b375d27825 Mon Sep 17 00:00:00 2001
From: Wilmer Arambula <terabytesoftw@gmail.com>
Date: Fri, 6 Oct 2023 05:40:16 -0300
Subject: [PATCH 11/11] Fix calling `ReflectionProperty::setValue()` with a
 single argument is deprecated.

---
 tests/framework/data/BaseDataProviderTest.php | 22 +++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/tests/framework/data/BaseDataProviderTest.php b/tests/framework/data/BaseDataProviderTest.php
index ea5ae21cb69..1dfcf6d5809 100644
--- a/tests/framework/data/BaseDataProviderTest.php
+++ b/tests/framework/data/BaseDataProviderTest.php
@@ -17,10 +17,24 @@ class BaseDataProviderTest extends TestCase
 {
     public function testGenerateId()
     {
-        $rc = new \ReflectionClass(BaseDataProvider::className());
-        $rp = $rc->getProperty('counter');
-        $rp->setAccessible(true);
-        $rp->setValue(null);
+        $baseDataProvider = new class extends BaseDataProvider {
+            protected function prepareModels()
+            {
+                return [];
+            }
+
+            protected function prepareKeys($models)
+            {
+                return [];
+            }
+
+            protected function prepareTotalCount()
+            {
+                return 0;
+            }
+        };
+
+        $this->setInaccessibleProperty($baseDataProvider, 'counter', null);
 
         $this->assertNull((new ConcreteDataProvider())->id);
         $this->assertNotNull((new ConcreteDataProvider())->id);