diff --git .github/workflows/unit-tests.yml .github/workflows/unit-tests.yml
new file mode 100644
index 000000000..24ef1fa8d
--- /dev/null
+++ .github/workflows/unit-tests.yml
@@ -0,0 +1,96 @@
+name: Unit Tests
+
+on:
+  push:
+    branches: [ master ]
+
+jobs:
+  tests:
+    name: "WP: ${{ matrix.wp_version }} - PHP: ${{ matrix.php }}"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        php: ['7.4', '8.0']
+        wp_version: ['master']
+        include:
+          - php: '8.0'
+            wp_version: '5.7'
+          - php: '7.4'
+            wp_version: '5.7'
+    env:
+      WP_ENV_PHP_VERSION: ${{ matrix.php }}
+      WP_VERSION: ${{ matrix.wp_version }}
+
+    steps:
+      - name: Cancel previous runs of this workflow
+        uses: styfle/cancel-workflow-action@0.5.0
+        with:
+          access_token: ${{ github.token }}
+
+      - name: Checkout repository
+        uses: actions/checkout@v2
+
+      - name: Setup PHP
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php }}
+          tools: composer:v2
+          coverage: none
+
+      - name: Log information
+        run: |
+          echo "$GITHUB_REF"
+          echo "$GITHUB_EVENT_NAME"
+          npm --version
+          node --version
+          git --version
+          php --version
+          composer --version
+
+      - name: Validate Composer
+        run: composer validate --strict
+
+      - name: Install Composer dependencies
+        uses: ramsey/composer-install@v1
+        with:
+          composer-options: "--ignore-platform-reqs"
+
+      - name: Cache node modules
+        uses: actions/cache@v2
+        env:
+          cache-name: cache-node-modules
+        with:
+          # npm cache files are stored in `~/.npm` on Linux/macOS
+          path: ~/.npm
+          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
+          restore-keys: |
+            ${{ runner.os }}-build-${{ env.cache-name }}-
+            ${{ runner.os }}-build-
+            ${{ runner.os }}-
+
+      - name: Validate node modules
+        run: if [[ -f package.json ]]; then npm audit --audit-level=high --production --cache ~/.npm; fi
+
+      - name: Install node modules
+        run: npm ci --cache ~/.npm
+
+      - name: Setup WordPress
+        run: echo "{\"core\":\"WordPress/WordPress#${WP_VERSION}\"}" >> .wp-env.override.json
+
+      - name: Install WordPress
+        run: |
+          chmod -R 767 ./
+          npm run wp-env start -- --update
+
+      - name: Running single site unit tests
+        run: npm run test-php
+        if: ${{ success() || failure() }}
+
+      - name: Running multi site unit tests
+        run: npm run test-php-multisite
+        if: ${{ success() || failure() }}
+
+      - name: Stop Docker environment
+        run: npm run wp-env stop
+        if: ${{ success() || failure() }}
diff --git composer.json composer.json
index 3bf5b45c3..92645a69f 100644
--- composer.json
+++ composer.json
@@ -33,7 +33,9 @@
 	"require-dev": {
 		"phpcompatibility/phpcompatibility-wp": "^2.1.0",
 		"dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
-		"wp-phpunit/wp-phpunit": "^5.6",
+		"squizlabs/php_codesniffer" : "^3.5.4",
+		"wp-coding-standards/wpcs": "*",
+		"wp-phpunit/wp-phpunit": "^5.7",
 		"phpunit/phpunit": "^7.5"
 	}
 }
diff --git package.json package.json
index 89f7ec1ca..0326126af 100644
--- package.json
+++ package.json
@@ -5,10 +5,10 @@
 	},
 	"description": "BuddyPress adds community features to WordPress. Member Profiles, Activity Streams, Direct Messaging, Notifications, and more!",
 	"devDependencies": {
-		"@babel/core": "^7.11.6",
-		"@wordpress/babel-preset-default": "^5.0.1",
+		"@babel/core": "~7.13.14",
+		"@wordpress/babel-preset-default": "~5.1.0",
 		"@wordpress/browserslist-config": "~3.0.1",
-		"@wordpress/env": "^3.0.2",
+		"@wordpress/env": "^4.0.0",
 		"autoprefixer": "~8.5.2",
 		"grunt": "~1.3.0",
 		"grunt-check-dependencies": "~1.0.0",
@@ -18,21 +18,21 @@
 		"grunt-contrib-cssmin": "^3.0.0",
 		"grunt-contrib-imagemin": "~4.0.0",
 		"grunt-contrib-jshint": "^2.1.0",
-		"grunt-contrib-uglify": "^5.0.0",
+		"grunt-contrib-uglify": "~5.0.1",
 		"grunt-contrib-watch": "~1.1.0",
 		"grunt-exec": "^3.0.0",
 		"grunt-jsvalidate": "~0.2.2",
 		"grunt-legacy-util": "^2.0.0",
-		"grunt-patch-wordpress": "~3.0.0",
+		"grunt-patch-wordpress": "~3.0.1",
 		"grunt-postcss": "~0.9.0",
-		"grunt-rtlcss": "~2.0.1",
+		"grunt-rtlcss": "~2.0.2",
 		"grunt-sass": "~2.0.0",
 		"grunt-stylelint": "~0.15.0",
 		"matchdep": "~2.0.0",
 		"parcel-bundler": "~1.12.5",
-		"phplint": "^2.0.1",
+		"phplint": "~2.0.5",
 		"postcss-scss": "~2.0.0",
-		"stylelint": "~13.6.1",
+		"stylelint": "~13.13.1",
 		"stylelint-config-wordpress": "~17.0.0"
 	},
 	"engines": {
@@ -74,6 +74,6 @@
 		"extends @wordpress/browserslist-config"
 	],
 	"dependencies": {
-		"postcss": "~7.0.32"
+		"postcss": "~7.0.35"
 	}
 }
diff --git tests/phpunit/assets/phpunit-wp-config.php tests/phpunit/assets/phpunit-wp-config.php
index 5113dd55b..25f0abd81 100644
--- tests/phpunit/assets/phpunit-wp-config.php
+++ tests/phpunit/assets/phpunit-wp-config.php
@@ -26,10 +26,10 @@ define( 'DB_NAME', 'tests-wordpress');
 define( 'DB_USER', 'root');
 
 /** MySQL database password */
-define( 'DB_PASSWORD', '');
+define( 'DB_PASSWORD', 'password');
 
 /** MySQL hostname */
-define( 'DB_HOST', 'mysql');
+define( 'DB_HOST', 'tests-mysql');
 
 /** Database Charset to use in creating database tables. */
 define( 'DB_CHARSET', 'utf8');
