You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2026/02/24 14:35:46 UTC

(hbase) branch branch-3 updated (f70c97d464c -> 4b92bdb01d1)

This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a change to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git


    from f70c97d464c HBASE-29911 Upgrade hbase-examples to use junit5 (#7776)
     new e4e93a269dd HBASE-28913 LoadBalancerPerformanceEvaluation fails with NPE (#7745)
     new 4b92bdb01d1 HBASE-29910 Upgrade hbase-client to use junit5 (#7773)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../master/balancer/StochasticLoadBalancer.java    |   8 +-
 hbase-client/pom.xml                               |   5 -
 .../hadoop/hbase/TestCatalogFamilyFormat.java      |  49 ++--
 .../apache/hadoop/hbase/TestRegionLocations.java   |  22 +-
 .../hbase/client/TestAsyncAdminRpcPriority.java    |  38 ++-
 .../client/TestAsyncBatchRpcRetryingCaller.java    |  23 +-
 .../client/TestAsyncConnectionConfiguration.java   |  17 +-
 .../hbase/client/TestAsyncConnectionTracing.java   |  31 ++-
 .../client/TestAsyncMetaRegionLocatorFailFast.java |  24 +-
 .../client/TestAsyncRegionLocatorTracing.java      |  29 +--
 .../hbase/client/TestAsyncTableRpcPriority.java    | 148 ++++++------
 .../hadoop/hbase/client/TestAsyncTableTracing.java |  31 ++-
 .../apache/hadoop/hbase/client/TestAttributes.java | 131 +++++------
 ...estBufferedMutatorOverAsyncBufferedMutator.java |  25 +-
 .../hbase/client/TestBufferedMutatorParams.java    |  30 +--
 .../hbase/client/TestClientExponentialBackoff.java |  38 ++-
 .../client/TestColumnFamilyDescriptorBuilder.java  |  39 ++--
 .../TestColumnFamilyDescriptorLowerCaseEnum.java   |  19 +-
 .../hbase/client/TestConnectionConfiguration.java  |  15 +-
 .../TestConnectionFactoryApplyURIQueries.java      |  23 +-
 .../hbase/client/TestConnectionRegistryLeak.java   |  23 +-
 .../client/TestConnectionRegistryUriParsing.java   |  25 +-
 .../hbase/client/TestCoprocessorDescriptor.java    |  30 +--
 .../hadoop/hbase/client/TestDeleteTimeStamp.java   |  18 +-
 .../org/apache/hadoop/hbase/client/TestGet.java    |  85 ++++---
 .../hadoop/hbase/client/TestImmutableScan.java     |  17 +-
 .../apache/hadoop/hbase/client/TestIncrement.java  |  15 +-
 .../hadoop/hbase/client/TestInterfaceAlign.java    |  19 +-
 .../hadoop/hbase/client/TestMetricsConnection.java | 103 ++++-----
 .../apache/hadoop/hbase/client/TestMutation.java   |  33 ++-
 .../hadoop/hbase/client/TestOnlineLogRecord.java   |  28 ++-
 .../apache/hadoop/hbase/client/TestOperation.java  | 254 ++++++++++-----------
 .../apache/hadoop/hbase/client/TestPutDotHas.java  |  43 ++--
 .../hadoop/hbase/client/TestPutWriteToWal.java     |   4 +-
 .../hadoop/hbase/client/TestRegionInfoBuilder.java |  68 +++---
 .../hadoop/hbase/client/TestRegionInfoDisplay.java |  58 +++--
 .../client/TestRegistryEndpointsRefresher.java     |  31 ++-
 .../hadoop/hbase/client/TestResultStatsUtil.java   |  16 +-
 .../TestRetriesExhaustedWithDetailsException.java  |  24 +-
 .../hadoop/hbase/client/TestRowComparator.java     |  19 +-
 .../client/TestRpcBasedRegistryHedgedReads.java    |  29 +--
 .../org/apache/hadoop/hbase/client/TestScan.java   |  82 +++----
 .../hbase/client/TestSimpleRequestController.java  |  24 +-
 .../hbase/client/TestTableDescriptorBuilder.java   | 126 +++++-----
 .../hbase/client/TestTableDescriptorUtils.java     |  13 +-
 .../hbase/client/TestTableEnableDisableError.java  |  25 +-
 .../TestHBaseServerExceptionPauseManager.java      |  19 +-
 .../hbase/exceptions/TestClientExceptionsUtil.java |  14 +-
 .../hadoop/hbase/filter/TestComparators.java       |  19 +-
 .../hadoop/hbase/filter/TestKeyOnlyFilter.java     |  37 ++-
 .../hadoop/hbase/filter/TestLongComparator.java    |  13 +-
 .../hadoop/hbase/ipc/TestCellBlockBuilder.java     |  18 +-
 .../apache/hadoop/hbase/ipc/TestConnectionId.java  |  20 +-
 .../hadoop/hbase/ipc/TestFailedServersLog.java     |  23 +-
 .../hbase/ipc/TestHBaseRpcControllerImpl.java      |  20 +-
 .../org/apache/hadoop/hbase/ipc/TestIPCUtil.java   |  17 +-
 .../hadoop/hbase/ipc/TestNettyRpcConnection.java   |  27 +--
 .../hbase/ipc/TestRemoteWithExtrasException.java   |  19 +-
 .../ipc/TestRpcClientDeprecatedNameMapping.java    |  13 +-
 .../hadoop/hbase/ipc/TestTLSHandshadeFailure.java  |  23 +-
 .../hadoop/hbase/quotas/TestQuotaFilter.java       |  12 +-
 .../quotas/TestQuotaGlobalsSettingsBypass.java     |  18 +-
 .../hbase/quotas/TestQuotaSettingsFactory.java     |  96 ++++----
 .../hbase/quotas/TestRpcThrottlingException.java   |  14 +-
 .../hbase/quotas/TestSpaceLimitSettings.java       |  67 +++---
 .../hadoop/hbase/quotas/TestThrottleSettings.java  |  22 +-
 .../hbase/security/TestHBaseSaslRpcClient.java     |  21 +-
 .../apache/hadoop/hbase/security/TestSaslUtil.java |  30 +--
 .../provider/TestDefaultProviderSelector.java      |  44 ++--
 .../hbase/security/token/TestClientTokenUtil.java  |  26 +--
 .../hbase/shaded/protobuf/TestProtobufUtil.java    |  19 +-
 .../apache/hadoop/hbase/util/BuilderStyleTest.java |   4 +-
 .../apache/hadoop/hbase/util/PoolMapTestBase.java  |   4 +-
 .../apache/hadoop/hbase/util/TestRotateFile.java   |  44 ++--
 .../hadoop/hbase/util/TestRoundRobinPoolMap.java   |  17 +-
 .../hadoop/hbase/util/TestThreadLocalPoolMap.java  |  15 +-
 .../hadoop/hbase/zookeeper/TestZNodePaths.java     |  17 +-
 .../LoadBalancerPerformanceEvaluation.java         | 121 +++++++++-
 .../TestLoadBalancerPerformanceEvaluation.java     | 103 +++++++++
 79 files changed, 1383 insertions(+), 1550 deletions(-)
 create mode 100644 hbase-diagnostics/src/test/java/org/apache/hadoop/hbase/master/balancer/TestLoadBalancerPerformanceEvaluation.java


(hbase) 01/02: HBASE-28913 LoadBalancerPerformanceEvaluation fails with NPE (#7745)

Posted by zh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit e4e93a269dd911a56cfe76c8a267ee6c5ef42784
Author: Liu Xiao <42...@users.noreply.github.com>
AuthorDate: Tue Feb 24 22:16:54 2026 +0800

    HBASE-28913 LoadBalancerPerformanceEvaluation fails with NPE (#7745)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
    (cherry picked from commit a444fc509c3dfcbfddabba4236e82815512ecfab)
---
 .../master/balancer/StochasticLoadBalancer.java    |   8 +-
 .../LoadBalancerPerformanceEvaluation.java         | 121 ++++++++++++++++++++-
 .../TestLoadBalancerPerformanceEvaluation.java     | 103 ++++++++++++++++++
 3 files changed, 222 insertions(+), 10 deletions(-)

diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
index 075d970fc69..0eedc8fc5c5 100644
--- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
+++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java
@@ -291,10 +291,10 @@ public class StochasticLoadBalancer extends BaseLoadBalancer {
     curFunctionCosts = new double[costFunctions.size()];
     tempFunctionCosts = new double[costFunctions.size()];
 
-    LOG.info("Loaded config; maxSteps=" + maxSteps + ", runMaxSteps=" + runMaxSteps
-      + ", stepsPerRegion=" + stepsPerRegion + ", maxRunningTime=" + maxRunningTime + ", isByTable="
-      + isByTable + ", CostFunctions=" + Arrays.toString(getCostFunctionNames())
-      + " , sum of multiplier of cost functions = " + sumMultiplier + " etc.");
+    LOG.info(
+      "Loaded config: maxSteps={}, runMaxSteps={}, stepsPerRegion={}, maxRunningTime={}, isByTable={}, CostFunctions={}, sum of multiplier of cost functions = {} etc.",
+      maxSteps, runMaxSteps, stepsPerRegion, maxRunningTime, isByTable,
+      Arrays.toString(getCostFunctionNames()), sumMultiplier);
   }
 
   @Override
diff --git a/hbase-diagnostics/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java b/hbase-diagnostics/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java
index 0e3977dc31a..5c8adeedf46 100644
--- a/hbase-diagnostics/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java
+++ b/hbase-diagnostics/src/main/java/org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java
@@ -19,18 +19,28 @@ package org.apache.hadoop.hbase.master.balancer;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HBaseInterfaceAudience;
 import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HDFSBlocksDistribution;
+import org.apache.hadoop.hbase.ServerMetrics;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.BalancerDecision;
+import org.apache.hadoop.hbase.client.BalancerRejection;
+import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.RegionInfoBuilder;
+import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.master.LoadBalancer;
 import org.apache.hadoop.hbase.util.AbstractHBaseTool;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -55,16 +65,16 @@ public class LoadBalancerPerformanceEvaluation extends AbstractHBaseTool {
     LoggerFactory.getLogger(LoadBalancerPerformanceEvaluation.class.getName());
 
   private static final int DEFAULT_NUM_REGIONS = 1000000;
-  private static Option NUM_REGIONS_OPT = new Option("regions", true,
+  private static final Option NUM_REGIONS_OPT = new Option("regions", true,
     "Number of regions to consider by load balancer. Default: " + DEFAULT_NUM_REGIONS);
 
   private static final int DEFAULT_NUM_SERVERS = 1000;
-  private static Option NUM_SERVERS_OPT = new Option("servers", true,
+  private static final Option NUM_SERVERS_OPT = new Option("servers", true,
     "Number of servers to consider by load balancer. Default: " + DEFAULT_NUM_SERVERS);
 
   private static final String DEFAULT_LOAD_BALANCER =
     "org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer";
-  private static Option LOAD_BALANCER_OPT = new Option("load_balancer", true,
+  private static final Option LOAD_BALANCER_OPT = new Option("load_balancer", true,
     "Type of Load Balancer to use. Default: " + DEFAULT_LOAD_BALANCER);
 
   private int numRegions;
@@ -85,6 +95,13 @@ public class LoadBalancerPerformanceEvaluation extends AbstractHBaseTool {
     conf.setClass(HConstants.HBASE_MASTER_LOADBALANCER_CLASS, loadBalancerClazz,
       LoadBalancer.class);
     loadBalancer = LoadBalancerFactory.getLoadBalancer(conf);
+    loadBalancer.setClusterInfoProvider(new DummyClusterInfoProvider(conf));
+    try {
+      loadBalancer.initialize();
+    } catch (IOException e) {
+      LOG.error("Failed to initialize load balancer", e);
+      throw new RuntimeException("Failed to initialize load balancer", e);
+    }
   }
 
   private void generateRegionsAndServers() {
@@ -152,19 +169,19 @@ public class LoadBalancerPerformanceEvaluation extends AbstractHBaseTool {
     generateRegionsAndServers();
 
     String methodName = "roundRobinAssignment";
-    LOG.info("Calling " + methodName);
+    LOG.info("Calling {}", methodName);
     Stopwatch watch = Stopwatch.createStarted();
     loadBalancer.roundRobinAssignment(regions, servers);
     System.out.print(formatResults(methodName, watch.elapsed(TimeUnit.MILLISECONDS)));
 
     methodName = "retainAssignment";
-    LOG.info("Calling " + methodName);
+    LOG.info("Calling {}", methodName);
     watch.reset().start();
     loadBalancer.retainAssignment(regionServerMap, servers);
     System.out.print(formatResults(methodName, watch.elapsed(TimeUnit.MILLISECONDS)));
 
     methodName = "balanceCluster";
-    LOG.info("Calling " + methodName);
+    LOG.info("Calling {}", methodName);
     watch.reset().start();
 
     loadBalancer.balanceCluster(tableServerRegionMap);
@@ -178,4 +195,96 @@ public class LoadBalancerPerformanceEvaluation extends AbstractHBaseTool {
     tool.setConf(HBaseConfiguration.create());
     tool.run(args);
   }
+
+  private static class DummyClusterInfoProvider implements ClusterInfoProvider {
+
+    private volatile Configuration conf;
+
+    public DummyClusterInfoProvider(Configuration conf) {
+      this.conf = conf;
+    }
+
+    @Override
+    public Configuration getConfiguration() {
+      return conf;
+    }
+
+    @Override
+    public Connection getConnection() {
+      return null;
+    }
+
+    @Override
+    public List<RegionInfo> getAssignedRegions() {
+      return Collections.emptyList();
+    }
+
+    @Override
+    public void unassign(RegionInfo regionInfo) throws IOException {
+
+    }
+
+    @Override
+    public TableDescriptor getTableDescriptor(TableName tableName) throws IOException {
+      return null;
+    }
+
+    @Override
+    public int getNumberOfTables() throws IOException {
+      return 0;
+    }
+
+    @Override
+    public HDFSBlocksDistribution computeHDFSBlocksDistribution(Configuration conf,
+      TableDescriptor tableDescriptor, RegionInfo regionInfo) throws IOException {
+      return new HDFSBlocksDistribution();
+    }
+
+    @Override
+    public boolean hasRegionReplica(Collection<RegionInfo> regions) throws IOException {
+      return false;
+    }
+
+    @Override
+    public List<ServerName> getOnlineServersList() {
+      return Collections.emptyList();
+    }
+
+    @Override
+    public List<ServerName> getOnlineServersListWithPredicator(List<ServerName> servers,
+      Predicate<ServerMetrics> filter) {
+      return Collections.emptyList();
+    }
+
+    @Override
+    public Map<ServerName, List<RegionInfo>>
+      getSnapShotOfAssignment(Collection<RegionInfo> regions) {
+      return Collections.emptyMap();
+    }
+
+    @Override
+    public boolean isOffPeakHour() {
+      return false;
+    }
+
+    @Override
+    public void recordBalancerDecision(Supplier<BalancerDecision> decision) {
+
+    }
+
+    @Override
+    public void recordBalancerRejection(Supplier<BalancerRejection> rejection) {
+
+    }
+
+    @Override
+    public ServerMetrics getLoad(ServerName serverName) {
+      return null;
+    }
+
+    @Override
+    public void onConfigurationChange(Configuration conf) {
+      this.conf = conf;
+    }
+  }
 }
diff --git a/hbase-diagnostics/src/test/java/org/apache/hadoop/hbase/master/balancer/TestLoadBalancerPerformanceEvaluation.java b/hbase-diagnostics/src/test/java/org/apache/hadoop/hbase/master/balancer/TestLoadBalancerPerformanceEvaluation.java
new file mode 100644
index 00000000000..044eb410433
--- /dev/null
+++ b/hbase-diagnostics/src/test/java/org/apache/hadoop/hbase/master/balancer/TestLoadBalancerPerformanceEvaluation.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.master.balancer;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.io.IOException;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.master.LoadBalancer;
+import org.apache.hadoop.hbase.testclassification.LargeTests;
+import org.apache.hadoop.hbase.testclassification.MasterTests;
+import org.apache.hadoop.hbase.util.AbstractHBaseTool;
+import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+@Tag(MasterTests.TAG)
+@Tag(LargeTests.TAG)
+public class TestLoadBalancerPerformanceEvaluation {
+
+  private static final LoadBalancerPerformanceEvaluation tool =
+    new LoadBalancerPerformanceEvaluation();
+
+  @BeforeEach
+  public void setUpBeforeEach() {
+    tool.setConf(HBaseConfiguration.create());
+  }
+
+  @AfterEach
+  public void tearDownAfterEach() {
+    DefaultMetricsSystem.shutdown();
+  }
+
+  @Test
+  public void testLoadBalancerWithDefaultParams() throws IOException {
+    int ret = tool.run(new String[0]);
+    assertEquals(AbstractHBaseTool.EXIT_SUCCESS, ret);
+  }
+
+  @Test
+  public void testStochasticLoadBalancer() throws Exception {
+    testLoadBalancer(StochasticLoadBalancer.class);
+  }
+
+  @Test
+  public void testSimpleLoadBalancer() throws Exception {
+    testLoadBalancer(SimpleLoadBalancer.class);
+  }
+
+  @Test
+  public void testCacheAwareLoadBalancer() throws Exception {
+    testLoadBalancer(CacheAwareLoadBalancer.class);
+  }
+
+  private void testLoadBalancer(Class<? extends LoadBalancer> loadBalancerClass) throws Exception {
+    String[] args =
+      { "-regions", "1000", "-servers", "100", "-load_balancer", loadBalancerClass.getName() };
+    int ret = tool.run(args);
+    assertEquals(AbstractHBaseTool.EXIT_SUCCESS, ret);
+  }
+
+  @Test
+  public void testInvalidRegions() {
+    String[] args = { "-regions", "-100" };
+    IllegalArgumentException exception =
+      assertThrows(IllegalArgumentException.class, () -> tool.run(args));
+    assertEquals("Invalid number of regions!", exception.getMessage());
+  }
+
+  @Test
+  public void testInvalidServers() {
+    String[] args = { "-servers", "0" };
+    IllegalArgumentException exception =
+      assertThrows(IllegalArgumentException.class, () -> tool.run(args));
+    assertEquals("Invalid number of servers!", exception.getMessage());
+  }
+
+  @Test
+  public void testEmptyLoadBalancer() {
+    String[] args = { "-load_balancer", "" };
+    IllegalArgumentException exception =
+      assertThrows(IllegalArgumentException.class, () -> tool.run(args));
+    assertEquals("Invalid load balancer type!", exception.getMessage());
+  }
+}


(hbase) 02/02: HBASE-29910 Upgrade hbase-client to use junit5 (#7773)

Posted by zh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 4b92bdb01d1c63510a0b3786b2d04f2abcefaf79
Author: Liu Xiao <42...@users.noreply.github.com>
AuthorDate: Tue Feb 24 22:31:16 2026 +0800

    HBASE-29910 Upgrade hbase-client to use junit5 (#7773)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
    (cherry picked from commit 2ac4974afab1d7c35bbf3ab588d2a4976aa15789)
---
 hbase-client/pom.xml                               |   5 -
 .../hadoop/hbase/TestCatalogFamilyFormat.java      |  49 ++--
 .../apache/hadoop/hbase/TestRegionLocations.java   |  22 +-
 .../hbase/client/TestAsyncAdminRpcPriority.java    |  38 ++-
 .../client/TestAsyncBatchRpcRetryingCaller.java    |  23 +-
 .../client/TestAsyncConnectionConfiguration.java   |  17 +-
 .../hbase/client/TestAsyncConnectionTracing.java   |  31 ++-
 .../client/TestAsyncMetaRegionLocatorFailFast.java |  24 +-
 .../client/TestAsyncRegionLocatorTracing.java      |  29 +--
 .../hbase/client/TestAsyncTableRpcPriority.java    | 148 ++++++------
 .../hadoop/hbase/client/TestAsyncTableTracing.java |  31 ++-
 .../apache/hadoop/hbase/client/TestAttributes.java | 131 +++++------
 ...estBufferedMutatorOverAsyncBufferedMutator.java |  25 +-
 .../hbase/client/TestBufferedMutatorParams.java    |  30 +--
 .../hbase/client/TestClientExponentialBackoff.java |  38 ++-
 .../client/TestColumnFamilyDescriptorBuilder.java  |  39 ++--
 .../TestColumnFamilyDescriptorLowerCaseEnum.java   |  19 +-
 .../hbase/client/TestConnectionConfiguration.java  |  15 +-
 .../TestConnectionFactoryApplyURIQueries.java      |  23 +-
 .../hbase/client/TestConnectionRegistryLeak.java   |  23 +-
 .../client/TestConnectionRegistryUriParsing.java   |  25 +-
 .../hbase/client/TestCoprocessorDescriptor.java    |  30 +--
 .../hadoop/hbase/client/TestDeleteTimeStamp.java   |  18 +-
 .../org/apache/hadoop/hbase/client/TestGet.java    |  85 ++++---
 .../hadoop/hbase/client/TestImmutableScan.java     |  17 +-
 .../apache/hadoop/hbase/client/TestIncrement.java  |  15 +-
 .../hadoop/hbase/client/TestInterfaceAlign.java    |  19 +-
 .../hadoop/hbase/client/TestMetricsConnection.java | 103 ++++-----
 .../apache/hadoop/hbase/client/TestMutation.java   |  33 ++-
 .../hadoop/hbase/client/TestOnlineLogRecord.java   |  28 ++-
 .../apache/hadoop/hbase/client/TestOperation.java  | 254 ++++++++++-----------
 .../apache/hadoop/hbase/client/TestPutDotHas.java  |  43 ++--
 .../hadoop/hbase/client/TestPutWriteToWal.java     |   4 +-
 .../hadoop/hbase/client/TestRegionInfoBuilder.java |  68 +++---
 .../hadoop/hbase/client/TestRegionInfoDisplay.java |  58 +++--
 .../client/TestRegistryEndpointsRefresher.java     |  31 ++-
 .../hadoop/hbase/client/TestResultStatsUtil.java   |  16 +-
 .../TestRetriesExhaustedWithDetailsException.java  |  24 +-
 .../hadoop/hbase/client/TestRowComparator.java     |  19 +-
 .../client/TestRpcBasedRegistryHedgedReads.java    |  29 +--
 .../org/apache/hadoop/hbase/client/TestScan.java   |  82 +++----
 .../hbase/client/TestSimpleRequestController.java  |  24 +-
 .../hbase/client/TestTableDescriptorBuilder.java   | 126 +++++-----
 .../hbase/client/TestTableDescriptorUtils.java     |  13 +-
 .../hbase/client/TestTableEnableDisableError.java  |  25 +-
 .../TestHBaseServerExceptionPauseManager.java      |  19 +-
 .../hbase/exceptions/TestClientExceptionsUtil.java |  14 +-
 .../hadoop/hbase/filter/TestComparators.java       |  19 +-
 .../hadoop/hbase/filter/TestKeyOnlyFilter.java     |  37 ++-
 .../hadoop/hbase/filter/TestLongComparator.java    |  13 +-
 .../hadoop/hbase/ipc/TestCellBlockBuilder.java     |  18 +-
 .../apache/hadoop/hbase/ipc/TestConnectionId.java  |  20 +-
 .../hadoop/hbase/ipc/TestFailedServersLog.java     |  23 +-
 .../hbase/ipc/TestHBaseRpcControllerImpl.java      |  20 +-
 .../org/apache/hadoop/hbase/ipc/TestIPCUtil.java   |  17 +-
 .../hadoop/hbase/ipc/TestNettyRpcConnection.java   |  27 +--
 .../hbase/ipc/TestRemoteWithExtrasException.java   |  19 +-
 .../ipc/TestRpcClientDeprecatedNameMapping.java    |  13 +-
 .../hadoop/hbase/ipc/TestTLSHandshadeFailure.java  |  23 +-
 .../hadoop/hbase/quotas/TestQuotaFilter.java       |  12 +-
 .../quotas/TestQuotaGlobalsSettingsBypass.java     |  18 +-
 .../hbase/quotas/TestQuotaSettingsFactory.java     |  96 ++++----
 .../hbase/quotas/TestRpcThrottlingException.java   |  14 +-
 .../hbase/quotas/TestSpaceLimitSettings.java       |  67 +++---
 .../hadoop/hbase/quotas/TestThrottleSettings.java  |  22 +-
 .../hbase/security/TestHBaseSaslRpcClient.java     |  21 +-
 .../apache/hadoop/hbase/security/TestSaslUtil.java |  30 +--
 .../provider/TestDefaultProviderSelector.java      |  44 ++--
 .../hbase/security/token/TestClientTokenUtil.java  |  26 +--
 .../hbase/shaded/protobuf/TestProtobufUtil.java    |  19 +-
 .../apache/hadoop/hbase/util/BuilderStyleTest.java |   4 +-
 .../apache/hadoop/hbase/util/PoolMapTestBase.java  |   4 +-
 .../apache/hadoop/hbase/util/TestRotateFile.java   |  44 ++--
 .../hadoop/hbase/util/TestRoundRobinPoolMap.java   |  17 +-
 .../hadoop/hbase/util/TestThreadLocalPoolMap.java  |  15 +-
 .../hadoop/hbase/zookeeper/TestZNodePaths.java     |  17 +-
 76 files changed, 1161 insertions(+), 1540 deletions(-)

diff --git a/hbase-client/pom.xml b/hbase-client/pom.xml
index 4e118f65166..796fc23d7d6 100644
--- a/hbase-client/pom.xml
+++ b/hbase-client/pom.xml
@@ -175,11 +175,6 @@
       <artifactId>junit-jupiter-params</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.junit.vintage</groupId>
-      <artifactId>junit-vintage-engine</artifactId>
-      <scope>test</scope>
-    </dependency>
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestCatalogFamilyFormat.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestCatalogFamilyFormat.java
index 1d33307b9ca..d5a8f015602 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestCatalogFamilyFormat.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestCatalogFamilyFormat.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import org.apache.hadoop.hbase.client.RegionInfo;
@@ -27,22 +27,14 @@ import org.apache.hadoop.hbase.client.RegionInfoBuilder;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestCatalogFamilyFormat {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestCatalogFamilyFormat.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   @Test
   public void testParseReplicaIdFromServerColumn() {
     String column1 = HConstants.SERVER_QUALIFIER_STR;
@@ -84,21 +76,22 @@ public class TestCatalogFamilyFormat {
    * The info we can get from the regionName is: table name, start key, regionId, replicaId.
    */
   @Test
-  public void testParseRegionInfoFromRegionName() throws IOException {
+  public void testParseRegionInfoFromRegionName(TestInfo testInfo) throws IOException {
+    String name = testInfo.getTestMethod().get().getName();
     RegionInfo originalRegionInfo =
-      RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName())).setRegionId(999999L)
+      RegionInfoBuilder.newBuilder(TableName.valueOf(name)).setRegionId(999999L)
         .setStartKey(Bytes.toBytes("2")).setEndKey(Bytes.toBytes("3")).setReplicaId(1).build();
     RegionInfo newParsedRegionInfo =
       CatalogFamilyFormat.parseRegionInfoFromRegionName(originalRegionInfo.getRegionName());
-    assertEquals("Parse TableName error", originalRegionInfo.getTable(),
-      newParsedRegionInfo.getTable());
-    assertEquals("Parse regionId error", originalRegionInfo.getRegionId(),
-      newParsedRegionInfo.getRegionId());
-    assertTrue("Parse startKey error",
-      Bytes.equals(originalRegionInfo.getStartKey(), newParsedRegionInfo.getStartKey()));
-    assertEquals("Parse replicaId error", originalRegionInfo.getReplicaId(),
-      newParsedRegionInfo.getReplicaId());
-    assertTrue("We can't parse endKey from regionName only",
-      Bytes.equals(HConstants.EMPTY_END_ROW, newParsedRegionInfo.getEndKey()));
+    assertEquals(originalRegionInfo.getTable(), newParsedRegionInfo.getTable(),
+      "Parse TableName error");
+    assertEquals(originalRegionInfo.getRegionId(), newParsedRegionInfo.getRegionId(),
+      "Parse regionId error");
+    assertTrue(Bytes.equals(originalRegionInfo.getStartKey(), newParsedRegionInfo.getStartKey()),
+      "Parse startKey error");
+    assertEquals(originalRegionInfo.getReplicaId(), newParsedRegionInfo.getReplicaId(),
+      "Parse replicaId error");
+    assertTrue(Bytes.equals(HConstants.EMPTY_END_ROW, newParsedRegionInfo.getEndKey()),
+      "We can't parse endKey from regionName only");
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestRegionLocations.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestRegionLocations.java
index b60fb727b69..5ebe10bad30 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestRegionLocations.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestRegionLocations.java
@@ -17,27 +17,23 @@
  */
 package org.apache.hadoop.hbase;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.RegionInfoBuilder;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRegionLocations {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRegionLocations.class);
-
   ServerName sn0 = ServerName.valueOf("host0", 10, 10);
   ServerName sn1 = ServerName.valueOf("host1", 10, 10);
   ServerName sn2 = ServerName.valueOf("host2", 10, 10);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminRpcPriority.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminRpcPriority.java
index f65c7ccb6e7..55ca7e90a3b 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminRpcPriority.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminRpcPriority.java
@@ -31,7 +31,6 @@ import static org.mockito.Mockito.verify;
 import java.io.IOException;
 import java.util.concurrent.CompletableFuture;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
@@ -40,12 +39,10 @@ import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.security.UserProvider;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 import org.mockito.ArgumentMatcher;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -69,13 +66,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.StopMaster
 /**
  * Confirm that we will set the priority in {@link HBaseRpcController} for several admin operations.
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestAsyncAdminRpcPriority {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncAdminRpcPriority.class);
-
   private static Configuration CONF = HBaseConfiguration.create();
 
   private MasterService.Interface masterStub;
@@ -84,11 +78,11 @@ public class TestAsyncAdminRpcPriority {
 
   private AsyncConnection conn;
 
-  @Rule
-  public TestName name = new TestName();
+  public String name;
 
-  @Before
-  public void setUp() throws IOException {
+  @BeforeEach
+  public void setUp(TestInfo testInfo) throws IOException {
+    name = testInfo.getTestMethod().get().getName();
     masterStub = mock(MasterService.Interface.class);
     adminStub = mock(AdminService.Interface.class);
     doAnswer(new Answer<Void>() {
@@ -170,10 +164,8 @@ public class TestAsyncAdminRpcPriority {
 
   @Test
   public void testCreateNormalTable() {
-    conn.getAdmin()
-      .createTable(TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-        .setColumnFamily(ColumnFamilyDescriptorBuilder.of("cf")).build())
-      .join();
+    conn.getAdmin().createTable(TableDescriptorBuilder.newBuilder(TableName.valueOf(name))
+      .setColumnFamily(ColumnFamilyDescriptorBuilder.of("cf")).build()).join();
     verify(masterStub, times(1)).createTable(assertPriority(NORMAL_QOS),
       any(CreateTableRequest.class), any());
   }
@@ -183,9 +175,9 @@ public class TestAsyncAdminRpcPriority {
   @Test
   public void testCreateSystemTable() {
     conn.getAdmin()
-      .createTable(TableDescriptorBuilder
-        .newBuilder(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
-        .setColumnFamily(ColumnFamilyDescriptorBuilder.of("cf")).build())
+      .createTable(
+        TableDescriptorBuilder.newBuilder(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
+          .setColumnFamily(ColumnFamilyDescriptorBuilder.of("cf")).build())
       .join();
     verify(masterStub, times(1)).createTable(assertPriority(SYSTEMTABLE_QOS),
       any(CreateTableRequest.class), any());
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncBatchRpcRetryingCaller.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncBatchRpcRetryingCaller.java
index 0d37ee454b1..ab4c1fe3d58 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncBatchRpcRetryingCaller.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncBatchRpcRetryingCaller.java
@@ -20,7 +20,7 @@ package org.apache.hadoop.hbase.client;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
@@ -32,7 +32,6 @@ import static org.mockito.Mockito.when;
 import java.io.IOException;
 import java.util.IdentityHashMap;
 import java.util.concurrent.atomic.AtomicReference;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
@@ -41,24 +40,20 @@ import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestAsyncBatchRpcRetryingCaller {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncBatchRpcRetryingCaller.class);
-
   private org.apache.logging.log4j.core.Appender mockAppender;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     mockAppender = mock(org.apache.logging.log4j.core.Appender.class);
     when(mockAppender.getName()).thenReturn("mockAppender");
@@ -68,7 +63,7 @@ public class TestAsyncBatchRpcRetryingCaller {
 
   }
 
-  @After
+  @AfterEach
   public void tearDown() {
     ((org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
       .getLogger(AsyncBatchRpcRetryingCaller.class)).removeAppender(mockAppender);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionConfiguration.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionConfiguration.java
index 49f595a6945..8514cf52ea7 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionConfiguration.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionConfiguration.java
@@ -17,30 +17,25 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.concurrent.TimeUnit;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 /**
  * See HBASE-24513, HBASE-28608.
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestAsyncConnectionConfiguration {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncConnectionConfiguration.class);
-
   @Test
   public void itHandlesDeprecatedPauseForCQTBE() {
     Configuration conf = new Configuration();
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionTracing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionTracing.java
index e56fffbb264..051aaae75c9 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionTracing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncConnectionTracing.java
@@ -17,16 +17,15 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import io.opentelemetry.api.trace.SpanKind;
 import io.opentelemetry.api.trace.StatusCode;
-import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;
+import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
 import io.opentelemetry.sdk.trace.data.SpanData;
 import java.io.IOException;
 import java.util.concurrent.CompletableFuture;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.Waiter;
@@ -36,22 +35,18 @@ import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.trace.HBaseSemanticAttributes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import org.apache.hbase.thirdparty.com.google.common.io.Closeables;
 
-@Category({ ClientTests.class, MediumTests.class })
+@Tag(ClientTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestAsyncConnectionTracing {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncConnectionTracing.class);
-
   private static Configuration CONF = HBaseConfiguration.create();
 
   private ServerName masterServer =
@@ -59,10 +54,10 @@ public class TestAsyncConnectionTracing {
 
   private AsyncConnection conn;
 
-  @Rule
-  public OpenTelemetryRule traceRule = OpenTelemetryRule.create();
+  @RegisterExtension
+  public static final OpenTelemetryExtension traceRule = OpenTelemetryExtension.create();
 
-  @Before
+  @BeforeEach
   public void setUp() throws IOException {
     User user = UserProvider.instantiate(CONF).getCurrent();
     ConnectionRegistry registry = new DoNothingConnectionRegistry(CONF, user) {
@@ -75,7 +70,7 @@ public class TestAsyncConnectionTracing {
     conn = new AsyncConnectionImpl(CONF, registry, "test", null, user);
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close(conn, true);
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocatorFailFast.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocatorFailFast.java
index 6380f1f6fb0..fb7188ab3fa 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocatorFailFast.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncMetaRegionLocatorFailFast.java
@@ -17,11 +17,12 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 import java.io.IOException;
 import java.util.concurrent.CompletableFuture;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.RegionLocations;
 import org.apache.hadoop.hbase.security.User;
@@ -29,18 +30,14 @@ import org.apache.hadoop.hbase.security.UserProvider;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.FutureUtils;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestAsyncMetaRegionLocatorFailFast {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncMetaRegionLocatorFailFast.class);
-
   private static Configuration CONF = HBaseConfiguration.create();
 
   private static AsyncMetaRegionLocator LOCATOR;
@@ -57,14 +54,15 @@ public class TestAsyncMetaRegionLocatorFailFast {
     }
   }
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws IOException {
     LOCATOR = new AsyncMetaRegionLocator(
       new FaultyConnectionRegistry(CONF, UserProvider.instantiate(CONF).getCurrent()));
   }
 
-  @Test(expected = DoNotRetryIOException.class)
+  @Test
   public void test() throws IOException {
-    FutureUtils.get(LOCATOR.getRegionLocations(RegionInfo.DEFAULT_REPLICA_ID, false));
+    assertThrows(DoNotRetryIOException.class,
+      () -> FutureUtils.get(LOCATOR.getRegionLocations(RegionInfo.DEFAULT_REPLICA_ID, false)));
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocatorTracing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocatorTracing.java
index a7df92999d0..2b0518d9199 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocatorTracing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncRegionLocatorTracing.java
@@ -33,14 +33,13 @@ import static org.hamcrest.Matchers.hasItem;
 
 import io.opentelemetry.api.trace.SpanKind;
 import io.opentelemetry.api.trace.StatusCode;
-import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;
+import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
 import io.opentelemetry.sdk.trace.data.SpanData;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionLocation;
@@ -55,35 +54,31 @@ import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.hamcrest.Matcher;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.io.Closeables;
 
-@Category({ ClientTests.class, MediumTests.class })
+@Tag(ClientTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestAsyncRegionLocatorTracing {
   private static final Logger LOG = LoggerFactory.getLogger(TestAsyncRegionLocatorTracing.class);
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncRegionLocatorTracing.class);
-
   private static final Configuration CONF = HBaseConfiguration.create();
 
   private AsyncConnectionImpl conn;
 
   private RegionLocations locs;
 
-  @Rule
-  public OpenTelemetryRule traceRule = OpenTelemetryRule.create();
+  @RegisterExtension
+  public static final OpenTelemetryExtension traceRule = OpenTelemetryExtension.create();
 
-  @Before
+  @BeforeEach
   public void setUp() throws IOException {
     RegionInfo metaRegionInfo = RegionInfoBuilder.newBuilder(TableName.META_TABLE_NAME).build();
     locs = new RegionLocations(
@@ -103,7 +98,7 @@ public class TestAsyncRegionLocatorTracing {
     }, "test", null, user);
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close(conn, true);
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableRpcPriority.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableRpcPriority.java
index cb5431c35d3..aaa81b90b5d 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableRpcPriority.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableRpcPriority.java
@@ -21,10 +21,10 @@ import static org.apache.hadoop.hbase.HConstants.HIGH_QOS;
 import static org.apache.hadoop.hbase.HConstants.NORMAL_QOS;
 import static org.apache.hadoop.hbase.HConstants.SYSTEMTABLE_QOS;
 import static org.apache.hadoop.hbase.NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -47,7 +47,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellBuilderFactory;
 import org.apache.hadoop.hbase.CellBuilderType;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.ServerName;
@@ -58,12 +57,10 @@ import org.apache.hadoop.hbase.security.UserProvider;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 import org.mockito.ArgumentMatcher;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -88,13 +85,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRespon
 /**
  * Confirm that we will set the priority in {@link HBaseRpcController} for several table operations.
  */
-@Category({ ClientTests.class, MediumTests.class })
+@Tag(ClientTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestAsyncTableRpcPriority {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncTableRpcPriority.class);
-
   private static Configuration CONF = HBaseConfiguration.create();
 
   private ClientService.Interface stub;
@@ -103,11 +97,11 @@ public class TestAsyncTableRpcPriority {
 
   private AsyncConnection conn;
 
-  @Rule
-  public TestName name = new TestName();
+  public String name;
 
-  @Before
-  public void setUp() throws IOException {
+  @BeforeEach
+  public void setUp(TestInfo testInfo) throws IOException {
+    name = testInfo.getTestMethod().get().getName();
     this.threadPool = Executors.newSingleThreadExecutor();
     stub = mock(ClientService.Interface.class);
 
@@ -217,21 +211,20 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testGet() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .get(new Get(Bytes.toBytes(0)).setPriority(11)).join();
+    conn.getTable(TableName.valueOf(name)).get(new Get(Bytes.toBytes(0)).setPriority(11)).join();
     verify(stub, times(1)).get(assertPriority(11), any(GetRequest.class), any());
   }
 
   @Test
   public void testGetNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName())).get(new Get(Bytes.toBytes(0))).join();
+    conn.getTable(TableName.valueOf(name)).get(new Get(Bytes.toBytes(0))).join();
     verify(stub, times(1)).get(assertPriority(NORMAL_QOS), any(GetRequest.class), any());
   }
 
   @Test
   public void testGetSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
-      .get(new Get(Bytes.toBytes(0))).join();
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name)).get(new Get(Bytes.toBytes(0)))
+      .join();
     verify(stub, times(1)).get(assertPriority(SYSTEMTABLE_QOS), any(GetRequest.class), any());
   }
 
@@ -243,26 +236,22 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testPut() {
-    conn
-      .getTable(TableName.valueOf(name.getMethodName())).put(new Put(Bytes.toBytes(0))
-        .setPriority(12).addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v")))
-      .join();
+    conn.getTable(TableName.valueOf(name)).put(new Put(Bytes.toBytes(0)).setPriority(12)
+      .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v"))).join();
     verify(stub, times(1)).mutate(assertPriority(12), any(MutateRequest.class), any());
   }
 
   @Test
   public void testPutNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName())).put(new Put(Bytes.toBytes(0))
+    conn.getTable(TableName.valueOf(name)).put(new Put(Bytes.toBytes(0))
       .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v"))).join();
     verify(stub, times(1)).mutate(assertPriority(NORMAL_QOS), any(MutateRequest.class), any());
   }
 
   @Test
   public void testPutSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
-      .put(new Put(Bytes.toBytes(0)).addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"),
-        Bytes.toBytes("v")))
-      .join();
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name)).put(new Put(Bytes.toBytes(0))
+      .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v"))).join();
     verify(stub, times(1)).mutate(assertPriority(SYSTEMTABLE_QOS), any(MutateRequest.class), any());
   }
 
@@ -275,21 +264,20 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testDelete() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .delete(new Delete(Bytes.toBytes(0)).setPriority(13)).join();
+    conn.getTable(TableName.valueOf(name)).delete(new Delete(Bytes.toBytes(0)).setPriority(13))
+      .join();
     verify(stub, times(1)).mutate(assertPriority(13), any(MutateRequest.class), any());
   }
 
   @Test
   public void testDeleteNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName())).delete(new Delete(Bytes.toBytes(0)))
-      .join();
+    conn.getTable(TableName.valueOf(name)).delete(new Delete(Bytes.toBytes(0))).join();
     verify(stub, times(1)).mutate(assertPriority(NORMAL_QOS), any(MutateRequest.class), any());
   }
 
   @Test
   public void testDeleteSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
       .delete(new Delete(Bytes.toBytes(0))).join();
     verify(stub, times(1)).mutate(assertPriority(SYSTEMTABLE_QOS), any(MutateRequest.class), any());
   }
@@ -302,23 +290,21 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testAppend() {
-    conn
-      .getTable(TableName.valueOf(name.getMethodName())).append(new Append(Bytes.toBytes(0))
-        .setPriority(14).addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v")))
-      .join();
+    conn.getTable(TableName.valueOf(name)).append(new Append(Bytes.toBytes(0)).setPriority(14)
+      .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v"))).join();
     verify(stub, times(1)).mutate(assertPriority(14), any(MutateRequest.class), any());
   }
 
   @Test
   public void testAppendNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName())).append(new Append(Bytes.toBytes(0))
+    conn.getTable(TableName.valueOf(name)).append(new Append(Bytes.toBytes(0))
       .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v"))).join();
     verify(stub, times(1)).mutate(assertPriority(NORMAL_QOS), any(MutateRequest.class), any());
   }
 
   @Test
   public void testAppendSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
       .append(new Append(Bytes.toBytes(0)).addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"),
         Bytes.toBytes("v")))
       .join();
@@ -334,21 +320,21 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testIncrement() {
-    conn.getTable(TableName.valueOf(name.getMethodName())).increment(new Increment(Bytes.toBytes(0))
+    conn.getTable(TableName.valueOf(name)).increment(new Increment(Bytes.toBytes(0))
       .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), 1).setPriority(15)).join();
     verify(stub, times(1)).mutate(assertPriority(15), any(MutateRequest.class), any());
   }
 
   @Test
   public void testIncrementNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
+    conn.getTable(TableName.valueOf(name))
       .incrementColumnValue(Bytes.toBytes(0), Bytes.toBytes("cf"), Bytes.toBytes("cq"), 1).join();
     verify(stub, times(1)).mutate(assertPriority(NORMAL_QOS), any(MutateRequest.class), any());
   }
 
   @Test
   public void testIncrementSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
       .incrementColumnValue(Bytes.toBytes(0), Bytes.toBytes("cf"), Bytes.toBytes("cq"), 1).join();
     verify(stub, times(1)).mutate(assertPriority(SYSTEMTABLE_QOS), any(MutateRequest.class), any());
   }
@@ -362,9 +348,8 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testCheckAndPut() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
-      .ifNotExists()
+    conn.getTable(TableName.valueOf(name)).checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf"))
+      .qualifier(Bytes.toBytes("cq")).ifNotExists()
       .thenPut(new Put(Bytes.toBytes(0))
         .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v")).setPriority(16))
       .join();
@@ -373,17 +358,16 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testCheckAndPutNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
-      .ifNotExists().thenPut(new Put(Bytes.toBytes(0)).addColumn(Bytes.toBytes("cf"),
-        Bytes.toBytes("cq"), Bytes.toBytes("v")))
+    conn.getTable(TableName.valueOf(name)).checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf"))
+      .qualifier(Bytes.toBytes("cq")).ifNotExists().thenPut(new Put(Bytes.toBytes(0))
+        .addColumn(Bytes.toBytes("cf"), Bytes.toBytes("cq"), Bytes.toBytes("v")))
       .join();
     verify(stub, times(1)).mutate(assertPriority(NORMAL_QOS), any(MutateRequest.class), any());
   }
 
   @Test
   public void testCheckAndPutSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
       .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
       .ifNotExists().thenPut(new Put(Bytes.toBytes(0)).addColumn(Bytes.toBytes("cf"),
         Bytes.toBytes("cq"), Bytes.toBytes("v")))
@@ -402,23 +386,23 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testCheckAndDelete() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
-      .ifEquals(Bytes.toBytes("v")).thenDelete(new Delete(Bytes.toBytes(0)).setPriority(17)).join();
+    conn.getTable(TableName.valueOf(name)).checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf"))
+      .qualifier(Bytes.toBytes("cq")).ifEquals(Bytes.toBytes("v"))
+      .thenDelete(new Delete(Bytes.toBytes(0)).setPriority(17)).join();
     verify(stub, times(1)).mutate(assertPriority(17), any(MutateRequest.class), any());
   }
 
   @Test
   public void testCheckAndDeleteNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
-      .ifEquals(Bytes.toBytes("v")).thenDelete(new Delete(Bytes.toBytes(0))).join();
+    conn.getTable(TableName.valueOf(name)).checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf"))
+      .qualifier(Bytes.toBytes("cq")).ifEquals(Bytes.toBytes("v"))
+      .thenDelete(new Delete(Bytes.toBytes(0))).join();
     verify(stub, times(1)).mutate(assertPriority(NORMAL_QOS), any(MutateRequest.class), any());
   }
 
   @Test
   public void testCheckAndDeleteSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
       .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
       .ifEquals(Bytes.toBytes("v")).thenDelete(new Delete(Bytes.toBytes(0))).join();
     verify(stub, times(1)).mutate(assertPriority(SYSTEMTABLE_QOS), any(MutateRequest.class), any());
@@ -435,9 +419,9 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testCheckAndMutate() throws IOException {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
-      .ifEquals(Bytes.toBytes("v")).thenMutate(new RowMutations(Bytes.toBytes(0))
+    conn.getTable(TableName.valueOf(name)).checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf"))
+      .qualifier(Bytes.toBytes("cq")).ifEquals(Bytes.toBytes("v"))
+      .thenMutate(new RowMutations(Bytes.toBytes(0))
         .add((Mutation) new Delete(Bytes.toBytes(0)).setPriority(18)))
       .join();
     verify(stub, times(1)).multi(assertPriority(18), any(ClientProtos.MultiRequest.class), any());
@@ -445,9 +429,8 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testCheckAndMutateNormalTable() throws IOException {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
-      .ifEquals(Bytes.toBytes("v"))
+    conn.getTable(TableName.valueOf(name)).checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf"))
+      .qualifier(Bytes.toBytes("cq")).ifEquals(Bytes.toBytes("v"))
       .thenMutate(new RowMutations(Bytes.toBytes(0)).add((Mutation) new Delete(Bytes.toBytes(0))))
       .join();
     verify(stub, times(1)).multi(assertPriority(NORMAL_QOS), any(ClientProtos.MultiRequest.class),
@@ -456,7 +439,7 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testCheckAndMutateSystemTable() throws IOException {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
       .checkAndMutate(Bytes.toBytes(0), Bytes.toBytes("cf")).qualifier(Bytes.toBytes("cq"))
       .ifEquals(Bytes.toBytes("v"))
       .thenMutate(new RowMutations(Bytes.toBytes(0)).add((Mutation) new Delete(Bytes.toBytes(0))))
@@ -495,8 +478,8 @@ public class TestAsyncTableRpcPriority {
               future.complete(null);
             }
 
-            assertFalse("close scanner should not come in with scan priority " + scanPriority,
-              req.hasCloseScanner() && req.getCloseScanner());
+            assertFalse(req.hasCloseScanner() && req.getCloseScanner(),
+              "close scanner should not come in with scan priority " + scanPriority);
 
             Cell cell = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
               .setType(Cell.Type.Put).setRow(Bytes.toBytes(scanNextCalled.incrementAndGet()))
@@ -520,10 +503,10 @@ public class TestAsyncTableRpcPriority {
         threadPool.submit(() -> {
           ScanRequest req = invocation.getArgument(1);
           RpcCallback<ScanResponse> done = invocation.getArgument(2);
-          assertTrue("close request should have scannerId", req.hasScannerId());
-          assertEquals("close request's scannerId should match", scannerId, req.getScannerId());
-          assertTrue("close request should have closerScanner set",
-            req.hasCloseScanner() && req.getCloseScanner());
+          assertTrue(req.hasScannerId(), "close request should have scannerId");
+          assertEquals(scannerId, req.getScannerId(), "close request's scannerId should match");
+          assertTrue(req.hasCloseScanner() && req.getCloseScanner(),
+            "close request should have closerScanner set");
 
           done.run(ScanResponse.getDefaultInstance());
         });
@@ -536,20 +519,19 @@ public class TestAsyncTableRpcPriority {
   @Test
   public void testScan() throws Exception {
     CompletableFuture<Void> renewFuture = mockScanReturnRenewFuture(19);
-    testForTable(TableName.valueOf(name.getMethodName()), renewFuture, Optional.of(19));
+    testForTable(TableName.valueOf(name), renewFuture, Optional.of(19));
   }
 
   @Test
   public void testScanNormalTable() throws Exception {
     CompletableFuture<Void> renewFuture = mockScanReturnRenewFuture(NORMAL_QOS);
-    testForTable(TableName.valueOf(name.getMethodName()), renewFuture, Optional.of(NORMAL_QOS));
+    testForTable(TableName.valueOf(name), renewFuture, Optional.of(NORMAL_QOS));
   }
 
   @Test
   public void testScanSystemTable() throws Exception {
     CompletableFuture<Void> renewFuture = mockScanReturnRenewFuture(SYSTEMTABLE_QOS);
-    testForTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()), renewFuture,
-      Optional.empty());
+    testForTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name), renewFuture, Optional.empty());
   }
 
   @Test
@@ -582,15 +564,15 @@ public class TestAsyncTableRpcPriority {
 
   @Test
   public void testBatchNormalTable() {
-    conn.getTable(TableName.valueOf(name.getMethodName()))
-      .batchAll(Arrays.asList(new Delete(Bytes.toBytes(0)))).join();
+    conn.getTable(TableName.valueOf(name)).batchAll(Arrays.asList(new Delete(Bytes.toBytes(0))))
+      .join();
     verify(stub, times(1)).multi(assertPriority(NORMAL_QOS), any(ClientProtos.MultiRequest.class),
       any());
   }
 
   @Test
   public void testBatchSystemTable() {
-    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()))
+    conn.getTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name))
       .batchAll(Arrays.asList(new Delete(Bytes.toBytes(0)))).join();
     verify(stub, times(1)).multi(assertPriority(SYSTEMTABLE_QOS),
       any(ClientProtos.MultiRequest.class), any());
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableTracing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableTracing.java
index 2cecc974b6e..0488d9b724d 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableTracing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTableTracing.java
@@ -32,7 +32,7 @@ import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.hasItem;
 import static org.hamcrest.Matchers.hasSize;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -41,7 +41,7 @@ import static org.mockito.Mockito.mock;
 
 import io.opentelemetry.api.trace.SpanKind;
 import io.opentelemetry.api.trace.StatusCode;
-import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule;
+import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
 import io.opentelemetry.sdk.trace.data.SpanData;
 import java.io.IOException;
 import java.util.Arrays;
@@ -56,7 +56,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellBuilderFactory;
 import org.apache.hadoop.hbase.CellBuilderType;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.MatcherPredicate;
@@ -72,12 +71,11 @@ import org.apache.hadoop.hbase.testclassification.MediumTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.hamcrest.Matcher;
 import org.hamcrest.core.IsAnything;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
@@ -99,13 +97,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ResultOrEx
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse;
 
-@Category({ ClientTests.class, MediumTests.class })
+@Tag(ClientTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestAsyncTableTracing {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncTableTracing.class);
-
   private static Configuration CONF = HBaseConfiguration.create();
 
   private ClientService.Interface stub;
@@ -114,10 +109,10 @@ public class TestAsyncTableTracing {
 
   private AsyncTable<ScanResultConsumer> table;
 
-  @Rule
-  public OpenTelemetryRule traceRule = OpenTelemetryRule.create();
+  @RegisterExtension
+  public static final OpenTelemetryExtension traceRule = OpenTelemetryExtension.create();
 
-  @Before
+  @BeforeEach
   public void setUp() throws IOException {
     stub = mock(ClientService.Interface.class);
     AtomicInteger scanNextCalled = new AtomicInteger(0);
@@ -243,7 +238,7 @@ public class TestAsyncTableTracing {
     table = conn.getTable(TableName.valueOf("table"), ForkJoinPool.commonPool());
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close(conn, true);
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAttributes.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAttributes.java
index efb993561a5..94ac18655fc 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAttributes.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAttributes.java
@@ -17,161 +17,154 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.Arrays;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestAttributes {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAttributes.class);
 
   private static final byte[] ROW = new byte[] { 'r' };
 
   @Test
   public void testPutAttributes() {
     Put put = new Put(ROW);
-    Assert.assertTrue(put.getAttributesMap().isEmpty());
-    Assert.assertNull(put.getAttribute("absent"));
+    assertTrue(put.getAttributesMap().isEmpty());
+    assertNull(put.getAttribute("absent"));
 
     put.setAttribute("absent", null);
-    Assert.assertTrue(put.getAttributesMap().isEmpty());
-    Assert.assertNull(put.getAttribute("absent"));
+    assertTrue(put.getAttributesMap().isEmpty());
+    assertNull(put.getAttribute("absent"));
 
     // adding attribute
     put.setAttribute("attribute1", Bytes.toBytes("value1"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), put.getAttribute("attribute1")));
-    Assert.assertEquals(1, put.getAttributesMap().size());
-    Assert
-      .assertTrue(Arrays.equals(Bytes.toBytes("value1"), put.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), put.getAttribute("attribute1")));
+    assertEquals(1, put.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), put.getAttributesMap().get("attribute1")));
 
     // overriding attribute value
     put.setAttribute("attribute1", Bytes.toBytes("value12"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value12"), put.getAttribute("attribute1")));
-    Assert.assertEquals(1, put.getAttributesMap().size());
-    Assert.assertTrue(
-      Arrays.equals(Bytes.toBytes("value12"), put.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), put.getAttribute("attribute1")));
+    assertEquals(1, put.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), put.getAttributesMap().get("attribute1")));
 
     // adding another attribute
     put.setAttribute("attribute2", Bytes.toBytes("value2"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), put.getAttribute("attribute2")));
-    Assert.assertEquals(2, put.getAttributesMap().size());
-    Assert
-      .assertTrue(Arrays.equals(Bytes.toBytes("value2"), put.getAttributesMap().get("attribute2")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), put.getAttribute("attribute2")));
+    assertEquals(2, put.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), put.getAttributesMap().get("attribute2")));
 
     // removing attribute
     put.setAttribute("attribute2", null);
-    Assert.assertNull(put.getAttribute("attribute2"));
-    Assert.assertEquals(1, put.getAttributesMap().size());
-    Assert.assertNull(put.getAttributesMap().get("attribute2"));
+    assertNull(put.getAttribute("attribute2"));
+    assertEquals(1, put.getAttributesMap().size());
+    assertNull(put.getAttributesMap().get("attribute2"));
 
     // removing non-existed attribute
     put.setAttribute("attribute2", null);
-    Assert.assertNull(put.getAttribute("attribute2"));
-    Assert.assertEquals(1, put.getAttributesMap().size());
-    Assert.assertNull(put.getAttributesMap().get("attribute2"));
+    assertNull(put.getAttribute("attribute2"));
+    assertEquals(1, put.getAttributesMap().size());
+    assertNull(put.getAttributesMap().get("attribute2"));
 
     // removing another attribute
     put.setAttribute("attribute1", null);
-    Assert.assertNull(put.getAttribute("attribute1"));
-    Assert.assertTrue(put.getAttributesMap().isEmpty());
-    Assert.assertNull(put.getAttributesMap().get("attribute1"));
+    assertNull(put.getAttribute("attribute1"));
+    assertTrue(put.getAttributesMap().isEmpty());
+    assertNull(put.getAttributesMap().get("attribute1"));
   }
 
   @Test
   public void testDeleteAttributes() {
     Delete del = new Delete(new byte[] { 'r' });
-    Assert.assertTrue(del.getAttributesMap().isEmpty());
-    Assert.assertNull(del.getAttribute("absent"));
+    assertTrue(del.getAttributesMap().isEmpty());
+    assertNull(del.getAttribute("absent"));
 
     del.setAttribute("absent", null);
-    Assert.assertTrue(del.getAttributesMap().isEmpty());
-    Assert.assertNull(del.getAttribute("absent"));
+    assertTrue(del.getAttributesMap().isEmpty());
+    assertNull(del.getAttribute("absent"));
 
     // adding attribute
     del.setAttribute("attribute1", Bytes.toBytes("value1"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), del.getAttribute("attribute1")));
-    Assert.assertEquals(1, del.getAttributesMap().size());
-    Assert
-      .assertTrue(Arrays.equals(Bytes.toBytes("value1"), del.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), del.getAttribute("attribute1")));
+    assertEquals(1, del.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), del.getAttributesMap().get("attribute1")));
 
     // overriding attribute value
     del.setAttribute("attribute1", Bytes.toBytes("value12"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value12"), del.getAttribute("attribute1")));
-    Assert.assertEquals(1, del.getAttributesMap().size());
-    Assert.assertTrue(
-      Arrays.equals(Bytes.toBytes("value12"), del.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), del.getAttribute("attribute1")));
+    assertEquals(1, del.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), del.getAttributesMap().get("attribute1")));
 
     // adding another attribute
     del.setAttribute("attribute2", Bytes.toBytes("value2"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), del.getAttribute("attribute2")));
-    Assert.assertEquals(2, del.getAttributesMap().size());
-    Assert
-      .assertTrue(Arrays.equals(Bytes.toBytes("value2"), del.getAttributesMap().get("attribute2")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), del.getAttribute("attribute2")));
+    assertEquals(2, del.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), del.getAttributesMap().get("attribute2")));
 
     // removing attribute
     del.setAttribute("attribute2", null);
-    Assert.assertNull(del.getAttribute("attribute2"));
-    Assert.assertEquals(1, del.getAttributesMap().size());
-    Assert.assertNull(del.getAttributesMap().get("attribute2"));
+    assertNull(del.getAttribute("attribute2"));
+    assertEquals(1, del.getAttributesMap().size());
+    assertNull(del.getAttributesMap().get("attribute2"));
 
     // removing non-existed attribute
     del.setAttribute("attribute2", null);
-    Assert.assertNull(del.getAttribute("attribute2"));
-    Assert.assertEquals(1, del.getAttributesMap().size());
-    Assert.assertNull(del.getAttributesMap().get("attribute2"));
+    assertNull(del.getAttribute("attribute2"));
+    assertEquals(1, del.getAttributesMap().size());
+    assertNull(del.getAttributesMap().get("attribute2"));
 
     // removing another attribute
     del.setAttribute("attribute1", null);
-    Assert.assertNull(del.getAttribute("attribute1"));
-    Assert.assertTrue(del.getAttributesMap().isEmpty());
-    Assert.assertNull(del.getAttributesMap().get("attribute1"));
+    assertNull(del.getAttribute("attribute1"));
+    assertTrue(del.getAttributesMap().isEmpty());
+    assertNull(del.getAttributesMap().get("attribute1"));
   }
 
   @Test
   public void testGetId() {
     Get get = new Get(ROW);
-    Assert.assertNull("Make sure id is null if unset", get.toMap().get("id"));
+    assertNull(get.toMap().get("id"), "Make sure id is null if unset");
     get.setId("myId");
-    Assert.assertEquals("myId", get.toMap().get("id"));
+    assertEquals("myId", get.toMap().get("id"));
   }
 
   @Test
   public void testAppendId() {
     Append append = new Append(ROW);
-    Assert.assertNull("Make sure id is null if unset", append.toMap().get("id"));
+    assertNull(append.toMap().get("id"), "Make sure id is null if unset");
     append.setId("myId");
-    Assert.assertEquals("myId", append.toMap().get("id"));
+    assertEquals("myId", append.toMap().get("id"));
   }
 
   @Test
   public void testDeleteId() {
     Delete delete = new Delete(ROW);
-    Assert.assertNull("Make sure id is null if unset", delete.toMap().get("id"));
+    assertNull(delete.toMap().get("id"), "Make sure id is null if unset");
     delete.setId("myId");
-    Assert.assertEquals("myId", delete.toMap().get("id"));
+    assertEquals("myId", delete.toMap().get("id"));
   }
 
   @Test
   public void testPutId() {
     Put put = new Put(ROW);
-    Assert.assertNull("Make sure id is null if unset", put.toMap().get("id"));
+    assertNull(put.toMap().get("id"), "Make sure id is null if unset");
     put.setId("myId");
-    Assert.assertEquals("myId", put.toMap().get("id"));
+    assertEquals("myId", put.toMap().get("id"));
   }
 
   @Test
   public void testScanId() {
     Scan scan = new Scan();
-    Assert.assertNull("Make sure id is null if unset", scan.toMap().get("id"));
+    assertNull(scan.toMap().get("id"), "Make sure id is null if unset");
     scan.setId("myId");
-    Assert.assertEquals("myId", scan.toMap().get("id"));
+    assertEquals("myId", scan.toMap().get("id"));
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorOverAsyncBufferedMutator.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorOverAsyncBufferedMutator.java
index bcbaadf26dd..33448b07fba 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorOverAsyncBufferedMutator.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorOverAsyncBufferedMutator.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.hbase.client;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.Mockito.mock;
@@ -37,27 +37,22 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.MockedStatic;
 
 import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestBufferedMutatorOverAsyncBufferedMutator {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestBufferedMutatorOverAsyncBufferedMutator.class);
-
   private AsyncBufferedMutator asyncMutator;
 
   private BufferedMutatorOverAsyncBufferedMutator mutator;
@@ -66,7 +61,7 @@ public class TestBufferedMutatorOverAsyncBufferedMutator {
 
   private MockedStatic<Pair> mockedPair;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     asyncMutator = mock(AsyncBufferedMutator.class);
     when(asyncMutator.getWriteBufferSize()).thenReturn(1024L * 1024);
@@ -78,7 +73,7 @@ public class TestBufferedMutatorOverAsyncBufferedMutator {
     mockedPair = mockStatic(Pair.class);
   }
 
-  @After
+  @AfterEach
   public void tearDown() {
     mockedPair.closeOnDemand();
     executor.shutdown();
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorParams.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorParams.java
index b6c52a0cd0d..d6e44b5c1eb 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorParams.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutatorParams.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
@@ -30,26 +30,17 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestBufferedMutatorParams {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestBufferedMutatorParams.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   /**
    * Just to create in instance, this doesn't actually function.
    */
@@ -134,9 +125,10 @@ public class TestBufferedMutatorParams {
   }
 
   @Test
-  public void testClone() {
+  public void testClone(TestInfo testInfo) {
     ExecutorService pool = new MockExecutorService();
-    final String tableName = name.getMethodName();
+    final String tableName = testInfo.getTestMethod().get().getName();
+    ;
     BufferedMutatorParams bmp = new BufferedMutatorParams(TableName.valueOf(tableName));
 
     BufferedMutator.ExceptionListener listener = new MockExceptionListener();
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientExponentialBackoff.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientExponentialBackoff.java
index 6ae602aaadb..c1045c8ed50 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientExponentialBackoff.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientExponentialBackoff.java
@@ -17,30 +17,26 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.client.backoff.ExponentialClientBackoffPolicy;
 import org.apache.hadoop.hbase.client.backoff.ServerStatistics;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestClientExponentialBackoff {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestClientExponentialBackoff.class);
 
   ServerName server = Mockito.mock(ServerName.class);
   byte[] regionname = Bytes.toBytes("region");
@@ -105,8 +101,8 @@ public class TestClientExponentialBackoff {
     for (int i = 1; i <= 100; i++) {
       update(stats, i);
       long next = backoff.getBackoffTime(server, regionname, stats);
-      assertTrue("Previous backoff time" + previous + " >= " + next + ", the next backoff time for "
-        + "load " + i, previous < next);
+      assertTrue(previous < next, "Previous backoff time" + previous + " >= " + next
+        + ", the next backoff time for " + "load " + i);
       previous = next;
     }
   }
@@ -121,18 +117,18 @@ public class TestClientExponentialBackoff {
 
     update(stats, 0, 95, 0);
     backoffTime = backoff.getBackoffTime(server, regionname, stats);
-    assertTrue("Heap occupancy at low watermark had no effect", backoffTime > 0);
+    assertTrue(backoffTime > 0, "Heap occupancy at low watermark had no effect");
 
     long previous = backoffTime;
     update(stats, 0, 96, 0);
     backoffTime = backoff.getBackoffTime(server, regionname, stats);
-    assertTrue("Increase above low watermark should have increased backoff",
-      backoffTime > previous);
+    assertTrue(backoffTime > previous,
+      "Increase above low watermark should have increased backoff");
 
     update(stats, 0, 98, 0);
     backoffTime = backoff.getBackoffTime(server, regionname, stats);
-    assertEquals("We should be using max backoff when at high watermark",
-      ExponentialClientBackoffPolicy.DEFAULT_MAX_BACKOFF, backoffTime);
+    assertEquals(ExponentialClientBackoffPolicy.DEFAULT_MAX_BACKOFF, backoffTime,
+      "We should be using max backoff when at high watermark");
   }
 
   @Test
@@ -145,17 +141,17 @@ public class TestClientExponentialBackoff {
 
     update(stats, 0, 0, 0);
     backoffTime = backoff.getBackoffTime(server, regionname, stats);
-    assertTrue("Compaction pressure has no effect", backoffTime == 0);
+    assertTrue(backoffTime == 0, "Compaction pressure has no effect");
 
     long previous = backoffTime;
     update(stats, 0, 0, 50);
     backoffTime = backoff.getBackoffTime(server, regionname, stats);
-    assertTrue("Compaction pressure should be bigger", backoffTime > previous);
+    assertTrue(backoffTime > previous, "Compaction pressure should be bigger");
 
     update(stats, 0, 0, 100);
     backoffTime = backoff.getBackoffTime(server, regionname, stats);
-    assertEquals("under heavy compaction pressure",
-      ExponentialClientBackoffPolicy.DEFAULT_MAX_BACKOFF, backoffTime);
+    assertEquals(ExponentialClientBackoffPolicy.DEFAULT_MAX_BACKOFF, backoffTime,
+      "under heavy compaction pressure");
   }
 
   private void update(ServerStatistics stats, int load) {
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorBuilder.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorBuilder.java
index b7323879308..f66328656dd 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorBuilder.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorBuilder.java
@@ -17,13 +17,12 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.Map;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeepDeletedCells;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
@@ -38,16 +37,12 @@ import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.BuilderStyleTest;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.PrettyPrinter;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestColumnFamilyDescriptorBuilder {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestColumnFamilyDescriptorBuilder.class);
 
   @Test
   public void testBuilder() throws DeserializationException {
@@ -100,8 +95,8 @@ public class TestColumnFamilyDescriptorBuilder {
    */
   @Test
   public void testHColumnDescriptorShouldThrowIAEWhenFamilyNameEmpty() throws Exception {
-    assertThrows("Column Family name can not be empty", IllegalArgumentException.class,
-      () -> ColumnFamilyDescriptorBuilder.of(""));
+    assertThrows(IllegalArgumentException.class, () -> ColumnFamilyDescriptorBuilder.of(""),
+      "Column Family name can not be empty");
   }
 
   /**
@@ -158,31 +153,31 @@ public class TestColumnFamilyDescriptorBuilder {
 
     ttl = "50000";
     builder.setTimeToLive(ttl);
-    Assert.assertEquals(50000, builder.build().getTimeToLive());
+    assertEquals(50000, builder.build().getTimeToLive());
 
     ttl = "50000 seconds";
     builder.setTimeToLive(ttl);
-    Assert.assertEquals(50000, builder.build().getTimeToLive());
+    assertEquals(50000, builder.build().getTimeToLive());
 
     ttl = "";
     builder.setTimeToLive(ttl);
-    Assert.assertEquals(0, builder.build().getTimeToLive());
+    assertEquals(0, builder.build().getTimeToLive());
 
     ttl = "FOREVER";
     builder.setTimeToLive(ttl);
-    Assert.assertEquals(HConstants.FOREVER, builder.build().getTimeToLive());
+    assertEquals(HConstants.FOREVER, builder.build().getTimeToLive());
 
     ttl = "1 HOUR 10 minutes 1 second";
     builder.setTimeToLive(ttl);
-    Assert.assertEquals(4201, builder.build().getTimeToLive());
+    assertEquals(4201, builder.build().getTimeToLive());
 
     ttl = "500 Days 23 HOURS";
     builder.setTimeToLive(ttl);
-    Assert.assertEquals(43282800, builder.build().getTimeToLive());
+    assertEquals(43282800, builder.build().getTimeToLive());
 
     ttl = "43282800 SECONDS (500 Days 23 hours)";
     builder.setTimeToLive(ttl);
-    Assert.assertEquals(43282800, builder.build().getTimeToLive());
+    assertEquals(43282800, builder.build().getTimeToLive());
   }
 
   @Test
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorLowerCaseEnum.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorLowerCaseEnum.java
index 900f4093d1b..277b677eb44 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorLowerCaseEnum.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestColumnFamilyDescriptorLowerCaseEnum.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -25,26 +25,21 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.NoSuchElementException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Testcase for HBASE-21732. Make sure that all enum configurations can accept lower case value.
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestColumnFamilyDescriptorLowerCaseEnum {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestColumnFamilyDescriptorLowerCaseEnum.class);
-
   private static final Logger LOG =
     LoggerFactory.getLogger(TestColumnFamilyDescriptorLowerCaseEnum.class);
 
@@ -97,8 +92,8 @@ public class TestColumnFamilyDescriptorLowerCaseEnum {
 
     ColumnFamilyDescriptor desc2 = builder2.build();
     for (Map.Entry<Method, Enum<?>> entry : getMethod2Value.entrySet()) {
-      assertEquals(entry.getKey() + " should return " + entry.getValue(), entry.getValue(),
-        entry.getKey().invoke(desc2));
+      assertEquals(entry.getValue(), entry.getKey().invoke(desc2),
+        entry.getKey() + " should return " + entry.getValue());
     }
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionConfiguration.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionConfiguration.java
index 9d2e467d3b1..a2b6994087a 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionConfiguration.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionConfiguration.java
@@ -17,28 +17,23 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 /**
  * See HBASE-28608. Configuration tests for (non async) connections
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestConnectionConfiguration {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionConfiguration.class);
-
   @Test
   public void testDefaultMetaOperationTimeout() {
     Configuration conf = HBaseConfiguration.create();
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryApplyURIQueries.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryApplyURIQueries.java
index 806c5edeb7f..3317ccd7b12 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryApplyURIQueries.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryApplyURIQueries.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
@@ -26,32 +26,27 @@ import static org.mockito.Mockito.when;
 import java.net.URI;
 import java.util.concurrent.CompletableFuture;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.MockedStatic;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestConnectionFactoryApplyURIQueries {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionFactoryApplyURIQueries.class);
-
   private Configuration conf;
 
   private MockedStatic<ConnectionRegistryFactory> mockedConnectionRegistryFactory;
 
   private ConnectionRegistry registry;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     conf = HBaseConfiguration.create();
     mockedConnectionRegistryFactory = mockStatic(ConnectionRegistryFactory.class);
@@ -61,7 +56,7 @@ public class TestConnectionFactoryApplyURIQueries {
     when(registry.getClusterId()).thenReturn(CompletableFuture.completedFuture("cluster"));
   }
 
-  @After
+  @AfterEach
   public void tearDown() {
     mockedConnectionRegistryFactory.closeOnDemand();
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryLeak.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryLeak.java
index bd2ca9867f3..b026fac149d 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryLeak.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryLeak.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -27,25 +27,20 @@ import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.FutureUtils;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestConnectionRegistryLeak {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionRegistryLeak.class);
-
   public static final class ConnectionRegistryForTest extends DoNothingConnectionRegistry {
 
     private boolean closed = false;
@@ -70,7 +65,7 @@ public class TestConnectionRegistryLeak {
 
   private static Configuration CONF = HBaseConfiguration.create();
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() {
     CONF.setClass(HConstants.CLIENT_CONNECTION_REGISTRY_IMPL_CONF_KEY,
       ConnectionRegistryForTest.class, ConnectionRegistry.class);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryUriParsing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryUriParsing.java
index c841346e810..b2eab03785a 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryUriParsing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionRegistryUriParsing.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockConstruction;
 import static org.mockito.Mockito.mockStatic;
@@ -26,18 +26,16 @@ import static org.mockito.Mockito.mockStatic;
 import java.net.URI;
 import java.util.List;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.ReflectionUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.MockedConstruction;
 import org.mockito.MockedStatic;
@@ -45,13 +43,10 @@ import org.mockito.MockedStatic;
 /**
  * Make sure we can successfully parse the URI component
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestConnectionRegistryUriParsing {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionRegistryUriParsing.class);
-
   private Configuration conf;
 
   private User user;
@@ -64,7 +59,7 @@ public class TestConnectionRegistryUriParsing {
 
   private List<?> args;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     conf = HBaseConfiguration.create();
     user = mock(User.class);
@@ -78,7 +73,7 @@ public class TestConnectionRegistryUriParsing {
     mockedReflectionUtils = mockStatic(ReflectionUtils.class);
   }
 
-  @After
+  @AfterEach
   public void tearDown() {
     mockedRpcRegistry.closeOnDemand();
     mockedZkRegistry.closeOnDemand();
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestCoprocessorDescriptor.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestCoprocessorDescriptor.java
index a56c863ce61..108985f6be8 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestCoprocessorDescriptor.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestCoprocessorDescriptor.java
@@ -17,33 +17,24 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 
-@Category({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestCoprocessorDescriptor {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestCoprocessorDescriptor.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   @Test
   public void testBuild() {
     String className = "className";
@@ -61,7 +52,8 @@ public class TestCoprocessorDescriptor {
   }
 
   @Test
-  public void testSetCoprocessor() throws IOException {
+  public void testSetCoprocessor(TestInfo testInfo) throws IOException {
+    String name = testInfo.getTestMethod().get().getName();
     String propertyKey = "propertyKey";
     List<CoprocessorDescriptor> cps = new ArrayList<>();
     for (String className : Arrays.asList("className0", "className1", "className2")) {
@@ -71,8 +63,8 @@ public class TestCoprocessorDescriptor {
       cps.add(CoprocessorDescriptorBuilder.newBuilder(className).setJarPath(path)
         .setPriority(priority).setProperty(propertyKey, propertyValue).build());
     }
-    TableDescriptor tableDescriptor = TableDescriptorBuilder
-      .newBuilder(TableName.valueOf(name.getMethodName())).setCoprocessors(cps).build();
+    TableDescriptor tableDescriptor =
+      TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setCoprocessors(cps).build();
     for (CoprocessorDescriptor cp : cps) {
       boolean match = false;
       for (CoprocessorDescriptor that : tableDescriptor.getCoprocessorDescriptors()) {
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestDeleteTimeStamp.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestDeleteTimeStamp.java
index cce3ba4e4e3..0818ee1057d 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestDeleteTimeStamp.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestDeleteTimeStamp.java
@@ -17,26 +17,22 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.NavigableMap;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestDeleteTimeStamp {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestDeleteTimeStamp.class);
-
   private static final byte[] ROW = Bytes.toBytes("testRow");
   private static final byte[] FAMILY = Bytes.toBytes("testFamily");
   private static final byte[] QUALIFIER = Bytes.toBytes("testQualifier");
@@ -53,7 +49,7 @@ public class TestDeleteTimeStamp {
     NavigableMap<byte[], List<Cell>> familyCellmap = delete.getFamilyCellMap();
     for (Entry<byte[], List<Cell>> entry : familyCellmap.entrySet()) {
       for (Cell cell : entry.getValue()) {
-        Assert.assertEquals(ts, cell.getTimestamp());
+        assertEquals(ts, cell.getTimestamp());
       }
     }
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestGet.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestGet.java
index e6eed365cd0..c385161aaac 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestGet.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestGet.java
@@ -19,10 +19,12 @@ package org.apache.hadoop.hbase.client;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -33,7 +35,6 @@ import java.util.Base64;
 import java.util.List;
 import java.util.Set;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.filter.Filter;
 import org.apache.hadoop.hbase.filter.FilterList;
@@ -43,10 +44,8 @@ import org.apache.hadoop.hbase.security.visibility.Authorizations;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.base.Throwables;
 
@@ -54,10 +53,9 @@ import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;
 
 // TODO: cover more test cases
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestGet {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule.forClass(TestGet.class);
 
   private static final byte[] ROW = new byte[] { 'r' };
 
@@ -101,61 +99,58 @@ public class TestGet {
     ClientProtos.Get getProto = ProtobufUtil.toGet(get);
 
     Get get2 = ProtobufUtil.toGet(getProto);
-    Assert.assertNull(get2.getAttribute("absent"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), get2.getAttribute("attribute1")));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), get2.getAttribute("attribute2")));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value3"), get2.getAttribute("attribute3")));
-    Assert.assertEquals(3, get2.getAttributesMap().size());
+    assertNull(get2.getAttribute("absent"));
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), get2.getAttribute("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), get2.getAttribute("attribute2")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value3"), get2.getAttribute("attribute3")));
+    assertEquals(3, get2.getAttributesMap().size());
   }
 
   @Test
   public void testGetAttributes() {
     Get get = new Get(ROW);
-    Assert.assertTrue(get.getAttributesMap().isEmpty());
-    Assert.assertNull(get.getAttribute("absent"));
+    assertTrue(get.getAttributesMap().isEmpty());
+    assertNull(get.getAttribute("absent"));
 
     get.setAttribute("absent", null);
-    Assert.assertTrue(get.getAttributesMap().isEmpty());
-    Assert.assertNull(get.getAttribute("absent"));
+    assertTrue(get.getAttributesMap().isEmpty());
+    assertNull(get.getAttribute("absent"));
 
     // adding attribute
     get.setAttribute("attribute1", Bytes.toBytes("value1"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), get.getAttribute("attribute1")));
-    Assert.assertEquals(1, get.getAttributesMap().size());
-    Assert
-      .assertTrue(Arrays.equals(Bytes.toBytes("value1"), get.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), get.getAttribute("attribute1")));
+    assertEquals(1, get.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), get.getAttributesMap().get("attribute1")));
 
     // overriding attribute value
     get.setAttribute("attribute1", Bytes.toBytes("value12"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value12"), get.getAttribute("attribute1")));
-    Assert.assertEquals(1, get.getAttributesMap().size());
-    Assert.assertTrue(
-      Arrays.equals(Bytes.toBytes("value12"), get.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), get.getAttribute("attribute1")));
+    assertEquals(1, get.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), get.getAttributesMap().get("attribute1")));
 
     // adding another attribute
     get.setAttribute("attribute2", Bytes.toBytes("value2"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), get.getAttribute("attribute2")));
-    Assert.assertEquals(2, get.getAttributesMap().size());
-    Assert
-      .assertTrue(Arrays.equals(Bytes.toBytes("value2"), get.getAttributesMap().get("attribute2")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), get.getAttribute("attribute2")));
+    assertEquals(2, get.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), get.getAttributesMap().get("attribute2")));
 
     // removing attribute
     get.setAttribute("attribute2", null);
-    Assert.assertNull(get.getAttribute("attribute2"));
-    Assert.assertEquals(1, get.getAttributesMap().size());
-    Assert.assertNull(get.getAttributesMap().get("attribute2"));
+    assertNull(get.getAttribute("attribute2"));
+    assertEquals(1, get.getAttributesMap().size());
+    assertNull(get.getAttributesMap().get("attribute2"));
 
     // removing non-existed attribute
     get.setAttribute("attribute2", null);
-    Assert.assertNull(get.getAttribute("attribute2"));
-    Assert.assertEquals(1, get.getAttributesMap().size());
-    Assert.assertNull(get.getAttributesMap().get("attribute2"));
+    assertNull(get.getAttribute("attribute2"));
+    assertEquals(1, get.getAttributesMap().size());
+    assertNull(get.getAttributesMap().get("attribute2"));
 
     // removing another attribute
     get.setAttribute("attribute1", null);
-    Assert.assertNull(get.getAttribute("attribute1"));
-    Assert.assertTrue(get.getAttributesMap().isEmpty());
-    Assert.assertNull(get.getAttributesMap().get("attribute1"));
+    assertNull(get.getAttribute("attribute1"));
+    assertTrue(get.getAttributesMap().isEmpty());
+    assertNull(get.getAttributesMap().get("attribute1"));
   }
 
   @Test
@@ -164,7 +159,7 @@ public class TestGet {
     byte[] family = Bytes.toBytes("family");
     get.addColumn(family, null);
     Set<byte[]> qualifiers = get.getFamilyMap().get(family);
-    Assert.assertEquals(1, qualifiers.size());
+    assertEquals(1, qualifiers.size());
   }
 
   @Test
@@ -215,7 +210,7 @@ public class TestGet {
     String localPath = conf.get("hbase.local.dir") + File.separator + "jars" + File.separator;
     File jarFile = new File(localPath, "MockFilter.jar");
     jarFile.delete();
-    assertFalse("Should be deleted: " + jarFile.getPath(), jarFile.exists());
+    assertFalse(jarFile.exists(), "Should be deleted: " + jarFile.getPath());
 
     ClientProtos.Get getProto1 = ClientProtos.Get.parseFrom(Base64.getDecoder().decode(PB_GET));
     ClientProtos.Get getProto2 =
@@ -257,6 +252,6 @@ public class TestGet {
     ByteBuffer rowBuffer = ByteBuffer.wrap(row1);
     Get get1 = new Get(rowBuffer);
     Get get2 = new Get(row2, 4, 7);
-    Assert.assertArrayEquals(get1.getRow(), get2.getRow());
+    assertArrayEquals(get1.getRow(), get2.getRow());
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java
index 2c8f38ed157..9bb0ae967d7 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableScan.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
@@ -26,7 +26,6 @@ import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.Map;
 import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.filter.Filter;
 import org.apache.hadoop.hbase.filter.FilterList;
 import org.apache.hadoop.hbase.security.access.Permission;
@@ -34,9 +33,8 @@ import org.apache.hadoop.hbase.security.visibility.Authorizations;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,13 +42,10 @@ import org.slf4j.LoggerFactory;
 /**
  * Small tests for ImmutableScan
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestImmutableScan {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestImmutableScan.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestImmutableScan.class);
 
   @Test
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestIncrement.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestIncrement.java
index 309c1007ae0..b42f1b235f6 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestIncrement.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestIncrement.java
@@ -17,25 +17,20 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Map;
 import java.util.NavigableMap;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestIncrement {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestIncrement.class);
-
   @Test
   public void testIncrementInstance() {
     final long expected = 13;
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestInterfaceAlign.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestInterfaceAlign.java
index a3f170bfcd7..5cf0664865b 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestInterfaceAlign.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestInterfaceAlign.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.Closeable;
 import java.lang.annotation.Annotation;
@@ -27,20 +27,15 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.apache.hadoop.hbase.Abortable;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestInterfaceAlign {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestInterfaceAlign.class);
-
   /**
    * Test methods name match up
    */
@@ -64,14 +59,14 @@ public class TestInterfaceAlign {
       if (method.endsWith("Async")) {
         contains = asyncAdminMethodNames.contains(method.replace("Async", ""));
       }
-      assertTrue("Admin method " + method + " should in AsyncAdmin too", contains);
+      assertTrue(contains, "Admin method " + method + " should in AsyncAdmin too");
     });
     asyncAdminMethodNames.forEach(method -> {
       boolean contains = adminMethodNames.contains(method);
       if (!contains) {
         contains = adminMethodNames.contains(method + "Async");
       }
-      assertTrue("AsyncAdmin method " + method + " should in Admin too", contains);
+      assertTrue(contains, "AsyncAdmin method " + method + " should in Admin too");
     });
   }
 
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMetricsConnection.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMetricsConnection.java
index e0d18f6bbb7..2897f64a96c 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMetricsConnection.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMetricsConnection.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import com.codahale.metrics.Counter;
 import com.codahale.metrics.RatioGauge;
@@ -27,13 +27,13 @@ import com.codahale.metrics.RatioGauge.Ratio;
 import com.codahale.metrics.Timer;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadPoolExecutor;
+import java.util.stream.Stream;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.ipc.CallTimeoutException;
 import org.apache.hadoop.hbase.ipc.RemoteWithExtrasException;
@@ -42,15 +42,11 @@ import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.MetricsTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 
 import org.apache.hbase.thirdparty.com.google.protobuf.ByteString;
 
@@ -65,12 +61,11 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanReques
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;
 
-@RunWith(Parameterized.class)
-@Category({ ClientTests.class, MetricsTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(MetricsTests.TAG)
+@Tag(SmallTests.TAG)
+@HBaseParameterizedTestTemplate
 public class TestMetricsConnection {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMetricsConnection.class);
 
   private static final Configuration conf = new Configuration();
   private static MetricsConnection METRICS;
@@ -79,27 +74,25 @@ public class TestMetricsConnection {
 
   private static final String MOCK_CONN_STR = "mocked-connection";
 
-  @Parameter()
   public boolean tableMetricsEnabled;
 
-  @Parameters
-  public static List<Boolean> params() {
-    return Arrays.asList(false, true);
+  public static Stream<Arguments> parameters() {
+    return Stream.of(Arguments.of(true), Arguments.of(false));
   }
 
-  @Before
+  @BeforeEach
   public void before() {
     conf.setBoolean(MetricsConnection.CLIENT_SIDE_TABLE_METRICS_ENABLED_KEY, tableMetricsEnabled);
     METRICS =
       MetricsConnection.getMetricsConnection(conf, MOCK_CONN_STR, () -> BATCH_POOL, () -> null);
   }
 
-  @After
+  @AfterEach
   public void after() {
     MetricsConnection.deleteMetricsConnection(MOCK_CONN_STR);
   }
 
-  @Test
+  @TestTemplate
   public void testMetricsConnectionScope() throws IOException {
     Configuration conf = new Configuration();
     String clusterId = "foo";
@@ -108,18 +101,18 @@ public class TestMetricsConnection {
 
     AsyncConnectionImpl impl = new AsyncConnectionImpl(conf, null, "foo", null, User.getCurrent());
     Optional<MetricsConnection> metrics = impl.getConnectionMetrics();
-    assertTrue("Metrics should be present", metrics.isPresent());
+    assertTrue(metrics.isPresent(), "Metrics should be present");
     assertEquals(clusterId + "@" + Integer.toHexString(impl.hashCode()),
       metrics.get().getMetricScope());
     conf.set(MetricsConnection.METRICS_SCOPE_KEY, scope);
     impl = new AsyncConnectionImpl(conf, null, "foo", null, User.getCurrent());
 
     metrics = impl.getConnectionMetrics();
-    assertTrue("Metrics should be present", metrics.isPresent());
+    assertTrue(metrics.isPresent(), "Metrics should be present");
     assertEquals(scope, metrics.get().getMetricScope());
   }
 
-  @Test
+  @TestTemplate
   public void testMetricsWithMultiConnections() throws IOException {
     Configuration conf = new Configuration();
     conf.setBoolean(MetricsConnection.CLIENT_SIDE_METRICS_ENABLED_KEY, true);
@@ -139,11 +132,11 @@ public class TestMetricsConnection {
     /* verify metrics presence */
     impl = connList.get(0);
     Optional<MetricsConnection> metrics = impl.getConnectionMetrics();
-    assertTrue("Metrics should be present", metrics.isPresent());
+    assertTrue(metrics.isPresent(), "Metrics should be present");
 
     /* verify connection count in a shared metrics */
     long count = metrics.get().getConnectionCount();
-    assertEquals("Failed to verify connection count." + count, count, num);
+    assertEquals(count, num, "Failed to verify connection count." + count);
 
     /* close some connections */
     for (int i = 0; i < num - 1; i++) {
@@ -153,18 +146,18 @@ public class TestMetricsConnection {
     /* verify metrics presence again */
     impl = connList.get(num - 1);
     metrics = impl.getConnectionMetrics();
-    assertTrue("Metrics should be present after some of connections are closed.",
-      metrics.isPresent());
+    assertTrue(metrics.isPresent(),
+      "Metrics should be present after some of connections are closed.");
 
     /* verify count of remaining connections */
     count = metrics.get().getConnectionCount();
-    assertEquals("Connection count suppose to be 1 but got: " + count, count, 1);
+    assertEquals(count, 1, "Connection count suppose to be 1 but got: " + count);
 
     /* shutdown */
     impl.close();
   }
 
-  @Test
+  @TestTemplate
   public void testStaticMetrics() throws IOException {
     final byte[] foo = Bytes.toBytes("foo");
     String table = "TableX";
@@ -230,19 +223,19 @@ public class TestMetricsConnection {
     metricKey = "rpcRemoteExceptions_IOException";
     counter = METRICS.getRpcCounters().get(metricKey);
     metricVal = (counter != null) ? counter.getCount() : 0;
-    assertEquals("metric: " + metricKey + " val: " + metricVal, metricVal, loop);
+    assertEquals(metricVal, loop, "metric: " + metricKey + " val: " + metricVal);
 
     // local exception
     metricKey = "rpcLocalExceptions_CallTimeoutException";
     counter = METRICS.getRpcCounters().get(metricKey);
     metricVal = (counter != null) ? counter.getCount() : 0;
-    assertEquals("metric: " + metricKey + " val: " + metricVal, metricVal, loop * 2);
+    assertEquals(metricVal, loop * 2, "metric: " + metricKey + " val: " + metricVal);
 
     // total exception
     metricKey = "rpcTotalExceptions";
     counter = METRICS.getRpcCounters().get(metricKey);
     metricVal = (counter != null) ? counter.getCount() : 0;
-    assertEquals("metric: " + metricKey + " val: " + metricVal, metricVal, loop * 3);
+    assertEquals(metricVal, loop * 3, "metric: " + metricKey + " val: " + metricVal);
 
     testRpcCallTableMetrics(table, loop);
 
@@ -250,9 +243,9 @@ public class TestMetricsConnection {
       METRICS.getGetTracker(), METRICS.getScanTracker(), METRICS.getMultiTracker(),
       METRICS.getAppendTracker(), METRICS.getDeleteTracker(), METRICS.getIncrementTracker(),
       METRICS.getPutTracker() }) {
-      assertEquals("Failed to invoke callTimer on " + t, loop, t.callTimer.getCount());
-      assertEquals("Failed to invoke reqHist on " + t, loop, t.reqHist.getCount());
-      assertEquals("Failed to invoke respHist on " + t, loop, t.respHist.getCount());
+      assertEquals(loop, t.callTimer.getCount(), "Failed to invoke callTimer on " + t);
+      assertEquals(loop, t.reqHist.getCount(), "Failed to invoke reqHist on " + t);
+      assertEquals(loop, t.respHist.getCount(), "Failed to invoke respHist on " + t);
     }
     RatioGauge executorMetrics =
       (RatioGauge) METRICS.getMetricRegistry().getMetrics().get(METRICS.getExecutorPoolName());
@@ -276,10 +269,10 @@ public class TestMetricsConnection {
         long numOps = timer.getCount();
         double p95 = timer.getSnapshot().get95thPercentile();
         double p99 = timer.getSnapshot().get99thPercentile();
-        assertEquals("metric: " + metricKey + numOpsSuffix + " val: " + numOps, expectedVal,
-          numOps);
-        assertTrue("metric: " + metricKey + p95Suffix + " val: " + p95, p95 >= 0);
-        assertTrue("metric: " + metricKey + p99Suffix + " val: " + p99, p99 >= 0);
+        assertEquals(expectedVal, numOps,
+          "metric: " + metricKey + numOpsSuffix + " val: " + numOps);
+        assertTrue(p95 >= 0, "metric: " + metricKey + p95Suffix + " val: " + p95);
+        assertTrue(p99 >= 0, "metric: " + metricKey + p99Suffix + " val: " + p99);
       } else {
         assertNull(timer);
       }
@@ -295,10 +288,10 @@ public class TestMetricsConnection {
         long numOps = timer.getCount();
         double p95 = timer.getSnapshot().get95thPercentile();
         double p99 = timer.getSnapshot().get99thPercentile();
-        assertEquals("metric: " + metricKey + numOpsSuffix + " val: " + numOps, expectedVal,
-          numOps);
-        assertTrue("metric: " + metricKey + p95Suffix + " val: " + p95, p95 >= 0);
-        assertTrue("metric: " + metricKey + p99Suffix + " val: " + p99, p99 >= 0);
+        assertEquals(expectedVal, numOps,
+          "metric: " + metricKey + numOpsSuffix + " val: " + numOps);
+        assertTrue(p95 >= 0, "metric: " + metricKey + p95Suffix + " val: " + p95);
+        assertTrue(p99 >= 0, "metric: " + metricKey + p99Suffix + " val: " + p99);
       } else {
         assertNull(timer);
       }
@@ -317,7 +310,7 @@ public class TestMetricsConnection {
       // rpc call count
       metricKey = rpcCountPrefix + method;
       metricVal = METRICS.getRpcCounters().get(metricKey).getCount();
-      assertEquals("metric: " + metricKey + " val: " + metricVal, metricVal, expectedVal);
+      assertEquals(metricVal, expectedVal, "metric: " + metricKey + " val: " + metricVal);
 
       // rpc failure call
       metricKey = tableMetricsEnabled
@@ -327,10 +320,10 @@ public class TestMetricsConnection {
       metricVal = (counter != null) ? counter.getCount() : 0;
       if (method.equals("Get")) {
         // no failure
-        assertEquals("metric: " + metricKey + " val: " + metricVal, 0, metricVal);
+        assertEquals(0, metricVal, "metric: " + metricKey + " val: " + metricVal);
       } else {
         // has failure
-        assertEquals("metric: " + metricKey + " val: " + metricVal, metricVal, expectedVal);
+        assertEquals(metricVal, expectedVal, "metric: " + metricKey + " val: " + metricVal);
       }
     }
 
@@ -339,7 +332,7 @@ public class TestMetricsConnection {
       // rpc call count
       metricKey = rpcCountPrefix + method + "(" + mutationType + ")";
       metricVal = METRICS.getRpcCounters().get(metricKey).getCount();
-      assertEquals("metric: " + metricKey + " val: " + metricVal, metricVal, expectedVal);
+      assertEquals(metricVal, expectedVal, "metric: " + metricKey + " val: " + metricVal);
 
       // rpc failure call
       metricKey = tableMetricsEnabled
@@ -349,10 +342,10 @@ public class TestMetricsConnection {
       metricVal = (counter != null) ? counter.getCount() : 0;
       if (mutationType.equals("Put")) {
         // has failure
-        assertEquals("metric: " + metricKey + " val: " + metricVal, metricVal, expectedVal);
+        assertEquals(metricVal, expectedVal, "metric: " + metricKey + " val: " + metricVal);
       } else {
         // no failure
-        assertEquals("metric: " + metricKey + " val: " + metricVal, 0, metricVal);
+        assertEquals(0, metricVal, "metric: " + metricKey + " val: " + metricVal);
       }
     }
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMutation.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMutation.java
index 5da59b144a5..5a5ace7fd38 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMutation.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestMutation.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.util.List;
@@ -27,24 +27,19 @@ import org.apache.hadoop.hbase.CellBuilderFactory;
 import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.ExtendedCell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.PrivateCellUtil;
 import org.apache.hadoop.hbase.io.TimeRange;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ SmallTests.class, ClientTests.class })
+@Tag(SmallTests.TAG)
+@Tag(ClientTests.TAG)
 public class TestMutation {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestMutation.class);
-
   @Test
   public void testAppendCopyConstructor() throws IOException {
     Append origin = new Append(Bytes.toBytes("ROW-01"));
@@ -124,11 +119,11 @@ public class TestMutation {
   }
 
   private void assertEquals(Mutation origin, Mutation clone) {
-    Assert.assertEquals(origin.getFamilyCellMap().size(), clone.getFamilyCellMap().size());
+    Assertions.assertEquals(origin.getFamilyCellMap().size(), clone.getFamilyCellMap().size());
     for (byte[] family : origin.getFamilyCellMap().keySet()) {
       List<ExtendedCell> originCells = origin.getCellList(family);
       List<ExtendedCell> cloneCells = clone.getCellList(family);
-      Assert.assertEquals(originCells.size(), cloneCells.size());
+      Assertions.assertEquals(originCells.size(), cloneCells.size());
       for (int i = 0; i != cloneCells.size(); ++i) {
         ExtendedCell originCell = originCells.get(i);
         ExtendedCell cloneCell = cloneCells.get(i);
@@ -136,14 +131,14 @@ public class TestMutation {
         assertTrue(CellUtil.matchingValue(originCell, cloneCell));
       }
     }
-    Assert.assertEquals(origin.getAttributesMap().size(), clone.getAttributesMap().size());
+    Assertions.assertEquals(origin.getAttributesMap().size(), clone.getAttributesMap().size());
     for (String name : origin.getAttributesMap().keySet()) {
       byte[] originValue = origin.getAttributesMap().get(name);
       byte[] cloneValue = clone.getAttributesMap().get(name);
       assertTrue(Bytes.equals(originValue, cloneValue));
     }
-    Assert.assertEquals(origin.getTimestamp(), clone.getTimestamp());
-    Assert.assertEquals(origin.getPriority(), clone.getPriority());
+    Assertions.assertEquals(origin.getTimestamp(), clone.getTimestamp());
+    Assertions.assertEquals(origin.getPriority(), clone.getPriority());
     if (origin instanceof Append) {
       assertEquals(((Append) origin).getTimeRange(), ((Append) clone).getTimeRange());
     }
@@ -153,8 +148,8 @@ public class TestMutation {
   }
 
   private static void assertEquals(TimeRange origin, TimeRange clone) {
-    Assert.assertEquals(origin.getMin(), clone.getMin());
-    Assert.assertEquals(origin.getMax(), clone.getMax());
+    Assertions.assertEquals(origin.getMin(), clone.getMin());
+    Assertions.assertEquals(origin.getMax(), clone.getMax());
   }
 
   // HBASE-14881
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOnlineLogRecord.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOnlineLogRecord.java
index 4446ab0f726..b2a8cf94d1c 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOnlineLogRecord.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOnlineLogRecord.java
@@ -17,28 +17,26 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableMap;
 import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestOnlineLogRecord {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestOnlineLogRecord.class);
-
   @Test
   public void itSerializesScan() {
     Scan scan = new Scan();
@@ -63,7 +61,7 @@ public class TestOnlineLogRecord {
       null, 6, 7, 0, scan, Collections.emptyMap(), Collections.emptyMap());
     String actualOutput = o.toJsonPrettyPrint();
     System.out.println(actualOutput);
-    Assert.assertEquals(expectedOutput, actualOutput);
+    assertEquals(expectedOutput, actualOutput);
   }
 
   @Test
@@ -77,7 +75,7 @@ public class TestOnlineLogRecord {
       null, 6, 7, 0, null, requestAttributes, Collections.emptyMap());
     String actualOutput = o.toJsonPrettyPrint();
     System.out.println(actualOutput);
-    expectedOutputs.forEach(expected -> Assert.assertTrue(actualOutput.contains(expected)));
+    expectedOutputs.forEach(expected -> assertTrue(actualOutput.contains(expected)));
   }
 
   @Test
@@ -86,7 +84,7 @@ public class TestOnlineLogRecord {
       null, 6, 7, 0, null, Collections.emptyMap(), Collections.emptyMap());
     String actualOutput = o.toJsonPrettyPrint();
     System.out.println(actualOutput);
-    Assert.assertFalse(actualOutput.contains("requestAttributes"));
+    assertFalse(actualOutput.contains("requestAttributes"));
   }
 
   @Test
@@ -100,7 +98,7 @@ public class TestOnlineLogRecord {
       null, 6, 7, 0, null, Collections.emptyMap(), connectionAttributes);
     String actualOutput = o.toJsonPrettyPrint();
     System.out.println(actualOutput);
-    expectedOutputs.forEach(expected -> Assert.assertTrue(actualOutput.contains(expected)));
+    expectedOutputs.forEach(expected -> assertTrue(actualOutput.contains(expected)));
   }
 
   @Test
@@ -109,6 +107,6 @@ public class TestOnlineLogRecord {
       null, 6, 7, 0, null, Collections.emptyMap(), Collections.emptyMap());
     String actualOutput = o.toJsonPrettyPrint();
     System.out.println(actualOutput);
-    Assert.assertFalse(actualOutput.contains("connectionAttributes"));
+    assertFalse(actualOutput.contains("connectionAttributes"));
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java
index 96feaca575f..24dc93a9311 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestOperation.java
@@ -17,8 +17,9 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import java.io.IOException;
 import java.lang.reflect.Type;
@@ -31,7 +32,6 @@ import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.CompareOperator;
 import org.apache.hadoop.hbase.ExtendedCell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.filter.BinaryComparator;
@@ -63,10 +63,8 @@ import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.BuilderStyleTest;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.GsonUtil;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.reflect.TypeToken;
 import org.apache.hbase.thirdparty.com.google.gson.Gson;
@@ -78,11 +76,9 @@ import org.apache.hbase.thirdparty.com.google.gson.ToNumberPolicy;
  * Run tests that use the functionality of the Operation superclass for Puts, Gets, Deletes, Scans,
  * and MultiPuts.
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestOperation {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestOperation.class);
 
   private static byte[] ROW = Bytes.toBytes("testRow");
   private static byte[] FAMILY = Bytes.toBytes("testFamily");
@@ -270,8 +266,8 @@ public class TestOperation {
   };
 
   static {
-    assertEquals("The sizes of static arrays do not match: " + "[FILTERS: %d <=> FILTERS_INFO: %d]",
-      FILTERS.length, FILTERS_INFO.length);
+    assertEquals(FILTERS.length, FILTERS_INFO.length,
+      "The sizes of static arrays do not match: " + "[FILTERS: %d <=> FILTERS_INFO: %d]");
   }
 
   /**
@@ -290,14 +286,14 @@ public class TestOperation {
     }.getType();
     Map<String, Object> parsedJSON = GSON.fromJson(json, typeOfHashMap);
     // check for the row
-    assertEquals("startRow incorrect in Scan.toJSON()", Bytes.toStringBinary(ROW),
-      parsedJSON.get("startRow"));
+    assertEquals(Bytes.toStringBinary(ROW), parsedJSON.get("startRow"),
+      "startRow incorrect in Scan.toJSON()");
     // check for the family and the qualifier.
     List familyInfo = (List) ((Map) parsedJSON.get("families")).get(Bytes.toStringBinary(FAMILY));
-    assertNotNull("Family absent in Scan.toJSON()", familyInfo);
-    assertEquals("Qualifier absent in Scan.toJSON()", 1, familyInfo.size());
-    assertEquals("Qualifier incorrect in Scan.toJSON()", Bytes.toStringBinary(QUALIFIER),
-      familyInfo.get(0));
+    assertNotNull(familyInfo, "Family absent in Scan.toJSON()");
+    assertEquals(1, familyInfo.size(), "Qualifier absent in Scan.toJSON()");
+    assertEquals(Bytes.toStringBinary(QUALIFIER), familyInfo.get(0),
+      "Qualifier incorrect in Scan.toJSON()");
 
     // produce a Get Operation
     Get get = new Get(ROW);
@@ -306,13 +302,13 @@ public class TestOperation {
     json = get.toJSON();
     parsedJSON = GSON.fromJson(json, typeOfHashMap);
     // check for the row
-    assertEquals("row incorrect in Get.toJSON()", Bytes.toStringBinary(ROW), parsedJSON.get("row"));
+    assertEquals(Bytes.toStringBinary(ROW), parsedJSON.get("row"), "row incorrect in Get.toJSON()");
     // check for the family and the qualifier.
     familyInfo = (List) ((Map) parsedJSON.get("families")).get(Bytes.toStringBinary(FAMILY));
-    assertNotNull("Family absent in Get.toJSON()", familyInfo);
-    assertEquals("Qualifier absent in Get.toJSON()", 1, familyInfo.size());
-    assertEquals("Qualifier incorrect in Get.toJSON()", Bytes.toStringBinary(QUALIFIER),
-      familyInfo.get(0));
+    assertNotNull(familyInfo, "Family absent in Get.toJSON()");
+    assertEquals(1, familyInfo.size(), "Qualifier absent in Get.toJSON()");
+    assertEquals(Bytes.toStringBinary(QUALIFIER), familyInfo.get(0),
+      "Qualifier incorrect in Get.toJSON()");
 
     // produce a Put operation
     Put put = new Put(ROW);
@@ -321,16 +317,16 @@ public class TestOperation {
     json = put.toJSON();
     parsedJSON = GSON.fromJson(json, typeOfHashMap);
     // check for the row
-    assertEquals("row absent in Put.toJSON()", Bytes.toStringBinary(ROW), parsedJSON.get("row"));
+    assertEquals(Bytes.toStringBinary(ROW), parsedJSON.get("row"), "row absent in Put.toJSON()");
     // check for the family and the qualifier.
     familyInfo = (List) ((Map) parsedJSON.get("families")).get(Bytes.toStringBinary(FAMILY));
-    assertNotNull("Family absent in Put.toJSON()", familyInfo);
-    assertEquals("KeyValue absent in Put.toJSON()", 1, familyInfo.size());
+    assertNotNull(familyInfo, "Family absent in Put.toJSON()");
+    assertEquals(1, familyInfo.size(), "KeyValue absent in Put.toJSON()");
     Map kvMap = (Map) familyInfo.get(0);
-    assertEquals("Qualifier incorrect in Put.toJSON()", Bytes.toStringBinary(QUALIFIER),
-      kvMap.get("qualifier"));
-    assertEquals("Value length incorrect in Put.toJSON()", VALUE.length,
-      ((Number) kvMap.get("vlen")).intValue());
+    assertEquals(Bytes.toStringBinary(QUALIFIER), kvMap.get("qualifier"),
+      "Qualifier incorrect in Put.toJSON()");
+    assertEquals(VALUE.length, ((Number) kvMap.get("vlen")).intValue(),
+      "Value length incorrect in Put.toJSON()");
 
     // produce a Delete operation
     Delete delete = new Delete(ROW);
@@ -339,14 +335,14 @@ public class TestOperation {
     json = delete.toJSON();
     parsedJSON = GSON.fromJson(json, typeOfHashMap);
     // check for the row
-    assertEquals("row absent in Delete.toJSON()", Bytes.toStringBinary(ROW), parsedJSON.get("row"));
+    assertEquals(Bytes.toStringBinary(ROW), parsedJSON.get("row"), "row absent in Delete.toJSON()");
     // check for the family and the qualifier.
     familyInfo = (List) ((Map) parsedJSON.get("families")).get(Bytes.toStringBinary(FAMILY));
-    assertNotNull("Family absent in Delete.toJSON()", familyInfo);
-    assertEquals("KeyValue absent in Delete.toJSON()", 1, familyInfo.size());
+    assertNotNull(familyInfo, "Family absent in Delete.toJSON()");
+    assertEquals(1, familyInfo.size(), "KeyValue absent in Delete.toJSON()");
     kvMap = (Map) familyInfo.get(0);
-    assertEquals("Qualifier incorrect in Delete.toJSON()", Bytes.toStringBinary(QUALIFIER),
-      kvMap.get("qualifier"));
+    assertEquals(Bytes.toStringBinary(QUALIFIER), kvMap.get("qualifier"),
+      "Qualifier incorrect in Delete.toJSON()");
   }
 
   /**
@@ -390,57 +386,57 @@ public class TestOperation {
       .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE).create();
     Map<String, Object> parsedJSON = gson.fromJson(json, typeOfHashMap);
     // check for the row
-    assertEquals("startRow incorrect in Scan.toJSON()", Bytes.toStringBinary(ROW),
-      parsedJSON.get("startRow"));
+    assertEquals(Bytes.toStringBinary(ROW), parsedJSON.get("startRow"),
+      "startRow incorrect in Scan.toJSON()");
     // check for the family and the qualifier.
     List familyInfo = (List) ((Map) parsedJSON.get("families")).get(Bytes.toStringBinary(FAMILY));
-    assertNotNull("Family absent in Scan.toJSON()", familyInfo);
-    assertEquals("Qualifier absent in Scan.toJSON()", 1, familyInfo.size());
-    assertEquals("Qualifier incorrect in Scan.toJSON()", Bytes.toStringBinary(QUALIFIER),
-      familyInfo.get(0));
-    assertEquals("stopRow incorrect in Scan.toJSON()", Bytes.toStringBinary(ROW),
-      parsedJSON.get("stopRow"));
-    assertEquals("includeStartRow incorrect in Scan.toJSON()", true,
-      parsedJSON.get("includeStartRow"));
-    assertEquals("includeStopRow incorrect in Scan.toJSON()", true,
-      parsedJSON.get("includeStopRow"));
-    assertEquals("maxVersions incorrect in Scan.toJSON()", 5L, parsedJSON.get("maxVersions"));
-    assertEquals("batch incorrect in Scan.toJSON()", 10L, parsedJSON.get("batch"));
-    assertEquals("allowPartialResults incorrect in Scan.toJSON()", true,
-      parsedJSON.get("allowPartialResults"));
-    assertEquals("storeLimit incorrect in Scan.toJSON()", 3L, parsedJSON.get("storeLimit"));
-    assertEquals("storeOffset incorrect in Scan.toJSON()", 8L, parsedJSON.get("storeOffset"));
-    assertEquals("caching incorrect in Scan.toJSON()", 20L, parsedJSON.get("caching"));
-    assertEquals("maxResultSize incorrect in Scan.toJSON()", "50", parsedJSON.get("maxResultSize"));
-    assertEquals("cacheBlocks incorrect in Scan.toJSON()", true, parsedJSON.get("cacheBlocks"));
-    assertEquals("reversed incorrect in Scan.toJSON()", true, parsedJSON.get("reversed"));
+    assertNotNull(familyInfo, "Family absent in Scan.toJSON()");
+    assertEquals(1, familyInfo.size(), "Qualifier absent in Scan.toJSON()");
+    assertEquals(Bytes.toStringBinary(QUALIFIER), familyInfo.get(0),
+      "Qualifier incorrect in Scan.toJSON()");
+    assertEquals(Bytes.toStringBinary(ROW), parsedJSON.get("stopRow"),
+      "stopRow incorrect in Scan.toJSON()");
+    assertEquals(true, parsedJSON.get("includeStartRow"),
+      "includeStartRow incorrect in Scan.toJSON()");
+    assertEquals(true, parsedJSON.get("includeStopRow"),
+      "includeStopRow incorrect in Scan.toJSON()");
+    assertEquals(5L, parsedJSON.get("maxVersions"), "maxVersions incorrect in Scan.toJSON()");
+    assertEquals(10L, parsedJSON.get("batch"), "batch incorrect in Scan.toJSON()");
+    assertEquals(true, parsedJSON.get("allowPartialResults"),
+      "allowPartialResults incorrect in Scan.toJSON()");
+    assertEquals(3L, parsedJSON.get("storeLimit"), "storeLimit incorrect in Scan.toJSON()");
+    assertEquals(8L, parsedJSON.get("storeOffset"), "storeOffset incorrect in Scan.toJSON()");
+    assertEquals(20L, parsedJSON.get("caching"), "caching incorrect in Scan.toJSON()");
+    assertEquals("50", parsedJSON.get("maxResultSize"), "maxResultSize incorrect in Scan.toJSON()");
+    assertEquals(true, parsedJSON.get("cacheBlocks"), "cacheBlocks incorrect in Scan.toJSON()");
+    assertEquals(true, parsedJSON.get("reversed"), "reversed incorrect in Scan.toJSON()");
     List trList = (List) parsedJSON.get("timeRange");
-    assertEquals("timeRange incorrect in Scan.toJSON()", 2, trList.size());
-    assertEquals("timeRange incorrect in Scan.toJSON()", "1000", trList.get(0));
-    assertEquals("timeRange incorrect in Scan.toJSON()", "2000", trList.get(1));
-
-    assertEquals("asyncPrefetch incorrect in Scan.toJSON()", true, parsedJSON.get("asyncPrefetch"));
-    assertEquals("mvccReadPoint incorrect in Scan.toJSON()", "123",
-      parsedJSON.get("mvccReadPoint"));
-    assertEquals("limit incorrect in Scan.toJSON()", 5L, parsedJSON.get("limit"));
-    assertEquals("readType incorrect in Scan.toJSON()", "PREAD", parsedJSON.get("readType"));
-    assertEquals("needCursorResult incorrect in Scan.toJSON()", true,
-      parsedJSON.get("needCursorResult"));
+    assertEquals(2, trList.size(), "timeRange incorrect in Scan.toJSON()");
+    assertEquals("1000", trList.get(0), "timeRange incorrect in Scan.toJSON()");
+    assertEquals("2000", trList.get(1), "timeRange incorrect in Scan.toJSON()");
+
+    assertEquals(true, parsedJSON.get("asyncPrefetch"), "asyncPrefetch incorrect in Scan.toJSON()");
+    assertEquals("123", parsedJSON.get("mvccReadPoint"),
+      "mvccReadPoint incorrect in Scan.toJSON()");
+    assertEquals(5L, parsedJSON.get("limit"), "limit incorrect in Scan.toJSON()");
+    assertEquals("PREAD", parsedJSON.get("readType"), "readType incorrect in Scan.toJSON()");
+    assertEquals(true, parsedJSON.get("needCursorResult"),
+      "needCursorResult incorrect in Scan.toJSON()");
 
     Map colFamTimeRange = (Map) parsedJSON.get("colFamTimeRangeMap");
-    assertEquals("colFamTimeRangeMap incorrect in Scan.toJSON()", 1L, colFamTimeRange.size());
+    assertEquals(1L, colFamTimeRange.size(), "colFamTimeRangeMap incorrect in Scan.toJSON()");
     List testFamily = (List) colFamTimeRange.get("testFamily");
-    assertEquals("colFamTimeRangeMap incorrect in Scan.toJSON()", 2L, testFamily.size());
-    assertEquals("colFamTimeRangeMap incorrect in Scan.toJSON()", "2000", testFamily.get(0));
-    assertEquals("colFamTimeRangeMap incorrect in Scan.toJSON()", "3000", testFamily.get(1));
+    assertEquals(2L, testFamily.size(), "colFamTimeRangeMap incorrect in Scan.toJSON()");
+    assertEquals("2000", testFamily.get(0), "colFamTimeRangeMap incorrect in Scan.toJSON()");
+    assertEquals("3000", testFamily.get(1), "colFamTimeRangeMap incorrect in Scan.toJSON()");
 
-    assertEquals("targetReplicaId incorrect in Scan.toJSON()", 1L,
-      parsedJSON.get("targetReplicaId"));
-    assertEquals("consistency incorrect in Scan.toJSON()", "STRONG", parsedJSON.get("consistency"));
-    assertEquals("loadColumnFamiliesOnDemand incorrect in Scan.toJSON()", true,
-      parsedJSON.get("loadColumnFamiliesOnDemand"));
+    assertEquals(1L, parsedJSON.get("targetReplicaId"),
+      "targetReplicaId incorrect in Scan.toJSON()");
+    assertEquals("STRONG", parsedJSON.get("consistency"), "consistency incorrect in Scan.toJSON()");
+    assertEquals(true, parsedJSON.get("loadColumnFamiliesOnDemand"),
+      "loadColumnFamiliesOnDemand incorrect in Scan.toJSON()");
 
-    assertEquals("priority incorrect in Scan.toJSON()", 10L, parsedJSON.get("priority"));
+    assertEquals(10L, parsedJSON.get("priority"), "priority incorrect in Scan.toJSON()");
 
   }
 
@@ -448,48 +444,48 @@ public class TestOperation {
   public void testPutCreationWithByteBuffer() {
     Put p = new Put(ROW);
     List<Cell> c = p.get(FAMILY, QUALIFIER);
-    Assert.assertEquals(0, c.size());
-    Assert.assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
+    assertEquals(0, c.size());
+    assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
 
     p.addColumn(FAMILY, ByteBuffer.wrap(QUALIFIER), 1984L, ByteBuffer.wrap(VALUE));
     c = p.get(FAMILY, QUALIFIER);
-    Assert.assertEquals(1, c.size());
-    Assert.assertEquals(1984L, c.get(0).getTimestamp());
-    Assert.assertArrayEquals(VALUE, CellUtil.cloneValue(c.get(0)));
-    Assert.assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
-    Assert.assertEquals(0,
+    assertEquals(1, c.size());
+    assertEquals(1984L, c.get(0).getTimestamp());
+    assertArrayEquals(VALUE, CellUtil.cloneValue(c.get(0)));
+    assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
+    assertEquals(0,
       CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue((ExtendedCell) c.get(0))));
 
     p = new Put(ROW);
     p.addColumn(FAMILY, ByteBuffer.wrap(QUALIFIER), 2013L, null);
     c = p.get(FAMILY, QUALIFIER);
-    Assert.assertEquals(1, c.size());
-    Assert.assertEquals(2013L, c.get(0).getTimestamp());
-    Assert.assertArrayEquals(new byte[] {}, CellUtil.cloneValue(c.get(0)));
-    Assert.assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
-    Assert.assertEquals(0,
+    assertEquals(1, c.size());
+    assertEquals(2013L, c.get(0).getTimestamp());
+    assertArrayEquals(new byte[] {}, CellUtil.cloneValue(c.get(0)));
+    assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
+    assertEquals(0,
       CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue((ExtendedCell) c.get(0))));
 
     p = new Put(ByteBuffer.wrap(ROW));
     p.addColumn(FAMILY, ByteBuffer.wrap(QUALIFIER), 2001L, null);
     c = p.get(FAMILY, QUALIFIER);
-    Assert.assertEquals(1, c.size());
-    Assert.assertEquals(2001L, c.get(0).getTimestamp());
-    Assert.assertArrayEquals(new byte[] {}, CellUtil.cloneValue(c.get(0)));
-    Assert.assertArrayEquals(ROW, CellUtil.cloneRow(c.get(0)));
-    Assert.assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
-    Assert.assertEquals(0,
+    assertEquals(1, c.size());
+    assertEquals(2001L, c.get(0).getTimestamp());
+    assertArrayEquals(new byte[] {}, CellUtil.cloneValue(c.get(0)));
+    assertArrayEquals(ROW, CellUtil.cloneRow(c.get(0)));
+    assertEquals(HConstants.LATEST_TIMESTAMP, p.getTimestamp());
+    assertEquals(0,
       CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue((ExtendedCell) c.get(0))));
 
     p = new Put(ByteBuffer.wrap(ROW), 1970L);
     p.addColumn(FAMILY, ByteBuffer.wrap(QUALIFIER), 2001L, null);
     c = p.get(FAMILY, QUALIFIER);
-    Assert.assertEquals(1, c.size());
-    Assert.assertEquals(2001L, c.get(0).getTimestamp());
-    Assert.assertArrayEquals(new byte[] {}, CellUtil.cloneValue(c.get(0)));
-    Assert.assertArrayEquals(ROW, CellUtil.cloneRow(c.get(0)));
-    Assert.assertEquals(1970L, p.getTimestamp());
-    Assert.assertEquals(0,
+    assertEquals(1, c.size());
+    assertEquals(2001L, c.get(0).getTimestamp());
+    assertArrayEquals(new byte[] {}, CellUtil.cloneValue(c.get(0)));
+    assertArrayEquals(ROW, CellUtil.cloneRow(c.get(0)));
+    assertEquals(1970L, p.getTimestamp());
+    assertEquals(0,
       CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue((ExtendedCell) c.get(0))));
   }
 
@@ -543,42 +539,42 @@ public class TestOperation {
       .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE).create();
     Map<String, Object> parsedJSON = gson.fromJson(json, typeOfHashMap);
     // check for the row
-    assertEquals("row incorrect in Get.toJSON()", Bytes.toStringBinary(ROW), parsedJSON.get("row"));
+    assertEquals(Bytes.toStringBinary(ROW), parsedJSON.get("row"), "row incorrect in Get.toJSON()");
     // check for the family and the qualifier.
     List familyInfo = (List) ((Map) parsedJSON.get("families")).get(Bytes.toStringBinary(FAMILY));
-    assertNotNull("Family absent in Get.toJSON()", familyInfo);
-    assertEquals("Qualifier absent in Get.toJSON()", 1, familyInfo.size());
-    assertEquals("Qualifier incorrect in Get.toJSON()", Bytes.toStringBinary(QUALIFIER),
-      familyInfo.get(0));
+    assertNotNull(familyInfo, "Family absent in Get.toJSON()");
+    assertEquals(1, familyInfo.size(), "Qualifier absent in Get.toJSON()");
+    assertEquals(Bytes.toStringBinary(QUALIFIER), familyInfo.get(0),
+      "Qualifier incorrect in Get.toJSON()");
 
-    assertEquals("maxVersions incorrect in Get.toJSON()", 5L, parsedJSON.get("maxVersions"));
+    assertEquals(5L, parsedJSON.get("maxVersions"), "maxVersions incorrect in Get.toJSON()");
 
-    assertEquals("storeLimit incorrect in Get.toJSON()", 5L, parsedJSON.get("storeLimit"));
-    assertEquals("storeOffset incorrect in Get.toJSON()", 9L, parsedJSON.get("storeOffset"));
+    assertEquals(5L, parsedJSON.get("storeLimit"), "storeLimit incorrect in Get.toJSON()");
+    assertEquals(9L, parsedJSON.get("storeOffset"), "storeOffset incorrect in Get.toJSON()");
 
-    assertEquals("cacheBlocks incorrect in Get.toJSON()", true, parsedJSON.get("cacheBlocks"));
+    assertEquals(true, parsedJSON.get("cacheBlocks"), "cacheBlocks incorrect in Get.toJSON()");
 
     List trList = (List) parsedJSON.get("timeRange");
-    assertEquals("timeRange incorrect in Get.toJSON()", 2, trList.size());
-    assertEquals("timeRange incorrect in Get.toJSON()", "1000", trList.get(0));
-    assertEquals("timeRange incorrect in Get.toJSON()", "2000", trList.get(1));
+    assertEquals(2, trList.size(), "timeRange incorrect in Get.toJSON()");
+    assertEquals("1000", trList.get(0), "timeRange incorrect in Get.toJSON()");
+    assertEquals("2000", trList.get(1), "timeRange incorrect in Get.toJSON()");
 
     Map colFamTimeRange = (Map) parsedJSON.get("colFamTimeRangeMap");
-    assertEquals("colFamTimeRangeMap incorrect in Get.toJSON()", 1L, colFamTimeRange.size());
+    assertEquals(1L, colFamTimeRange.size(), "colFamTimeRangeMap incorrect in Get.toJSON()");
     List testFamily = (List) colFamTimeRange.get("testFamily");
-    assertEquals("colFamTimeRangeMap incorrect in Get.toJSON()", 2L, testFamily.size());
-    assertEquals("colFamTimeRangeMap incorrect in Get.toJSON()", "2000", testFamily.get(0));
-    assertEquals("colFamTimeRangeMap incorrect in Get.toJSON()", "3000", testFamily.get(1));
-
-    assertEquals("targetReplicaId incorrect in Get.toJSON()", 1L,
-      parsedJSON.get("targetReplicaId"));
-    assertEquals("consistency incorrect in Get.toJSON()", "STRONG", parsedJSON.get("consistency"));
-    assertEquals("loadColumnFamiliesOnDemand incorrect in Get.toJSON()", true,
-      parsedJSON.get("loadColumnFamiliesOnDemand"));
-
-    assertEquals("priority incorrect in Get.toJSON()", 10L, parsedJSON.get("priority"));
-    assertEquals("checkExistenceOnly incorrect in Get.toJSON()", true,
-      parsedJSON.get("checkExistenceOnly"));
+    assertEquals(2L, testFamily.size(), "colFamTimeRangeMap incorrect in Get.toJSON()");
+    assertEquals("2000", testFamily.get(0), "colFamTimeRangeMap incorrect in Get.toJSON()");
+    assertEquals("3000", testFamily.get(1), "colFamTimeRangeMap incorrect in Get.toJSON()");
+
+    assertEquals(1L, parsedJSON.get("targetReplicaId"),
+      "targetReplicaId incorrect in Get.toJSON()");
+    assertEquals("STRONG", parsedJSON.get("consistency"), "consistency incorrect in Get.toJSON()");
+    assertEquals(true, parsedJSON.get("loadColumnFamiliesOnDemand"),
+      "loadColumnFamiliesOnDemand incorrect in Get.toJSON()");
+
+    assertEquals(10L, parsedJSON.get("priority"), "priority incorrect in Get.toJSON()");
+    assertEquals(true, parsedJSON.get("checkExistenceOnly"),
+      "checkExistenceOnly incorrect in Get.toJSON()");
 
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java
index 1e533633c76..507c7e98caa 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java
@@ -17,26 +17,23 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import org.apache.hadoop.hbase.HBaseClassTestRule;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
 /**
  * Addresses HBASE-6047 We test put.has call with all of its polymorphic magic
  */
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestPutDotHas {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestPutDotHas.class);
-
   public static final byte[] ROW_01 = Bytes.toBytes("row-01");
   public static final byte[] QUALIFIER_01 = Bytes.toBytes("qualifier-01");
   public static final byte[] VALUE_01 = Bytes.toBytes("value-01");
@@ -44,39 +41,39 @@ public class TestPutDotHas {
   public static final long TS = 1234567L;
   public Put put = new Put(ROW_01);
 
-  @Before
+  @BeforeEach
   public void setUp() {
     put.addColumn(FAMILY_01, QUALIFIER_01, TS, VALUE_01);
   }
 
   @Test
   public void testHasIgnoreValueIgnoreTS() {
-    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01));
-    Assert.assertFalse(put.has(QUALIFIER_01, FAMILY_01));
+    assertTrue(put.has(FAMILY_01, QUALIFIER_01));
+    assertFalse(put.has(QUALIFIER_01, FAMILY_01));
   }
 
   @Test
   public void testHasIgnoreValue() {
-    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01, TS));
-    Assert.assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS + 1));
+    assertTrue(put.has(FAMILY_01, QUALIFIER_01, TS));
+    assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS + 1));
   }
 
   @Test
   public void testHasIgnoreTS() {
-    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01, VALUE_01));
-    Assert.assertFalse(put.has(FAMILY_01, VALUE_01, QUALIFIER_01));
+    assertTrue(put.has(FAMILY_01, QUALIFIER_01, VALUE_01));
+    assertFalse(put.has(FAMILY_01, VALUE_01, QUALIFIER_01));
   }
 
   @Test
   public void testHas() {
-    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01, TS, VALUE_01));
+    assertTrue(put.has(FAMILY_01, QUALIFIER_01, TS, VALUE_01));
     // Bad TS
-    Assert.assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS + 1, VALUE_01));
+    assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS + 1, VALUE_01));
     // Bad Value
-    Assert.assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS, QUALIFIER_01));
+    assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS, QUALIFIER_01));
     // Bad Family
-    Assert.assertFalse(put.has(QUALIFIER_01, QUALIFIER_01, TS, VALUE_01));
+    assertFalse(put.has(QUALIFIER_01, QUALIFIER_01, TS, VALUE_01));
     // Bad Qual
-    Assert.assertFalse(put.has(FAMILY_01, FAMILY_01, TS, VALUE_01));
+    assertFalse(put.has(FAMILY_01, FAMILY_01, TS, VALUE_01));
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutWriteToWal.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutWriteToWal.java
index f57145cdb1b..dcff979dfde 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutWriteToWal.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPutWriteToWal.java
@@ -17,10 +17,10 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import org.junit.Before;
+import org.junit.jupiter.api.BeforeEach;
 
 public class TestPutWriteToWal {
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
 
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java
index f74b79a0672..b70a6b25ff1 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoBuilder.java
@@ -17,43 +17,42 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.TableNameTestRule;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.MD5Hash;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 
 import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations;
 
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRegionInfoBuilder {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRegionInfoBuilder.class);
+  private TableName name;
 
-  @Rule
-  public TableNameTestRule name = new TableNameTestRule();
+  @BeforeEach
+  public void setup(TestInfo testInfo) {
+    this.name = TableName.valueOf(testInfo.getTestMethod().get().getName());
+  }
 
   @Test
   public void testBuilder() {
@@ -92,7 +91,7 @@ public class TestRegionInfoBuilder {
 
   @Test
   public void testCreateRegionInfoName() throws Exception {
-    final TableName tn = name.getTableName();
+    final TableName tn = name;
     String startKey = "startkey";
     final byte[] sk = Bytes.toBytes(startKey);
     String id = "id";
@@ -112,7 +111,7 @@ public class TestRegionInfoBuilder {
 
   @Test
   public void testContainsRange() {
-    TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(name.getTableName()).build();
+    TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(name).build();
     RegionInfo ri = RegionInfoBuilder.newBuilder(tableDesc.getTableName())
       .setStartKey(Bytes.toBytes("a")).setEndKey(Bytes.toBytes("g")).build();
     // Single row range at start of region
@@ -173,7 +172,7 @@ public class TestRegionInfoBuilder {
 
   @Test
   public void testLastRegionCompare() {
-    TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(name.getTableName()).build();
+    TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(name).build();
     RegionInfo rip = RegionInfoBuilder.newBuilder(tableDesc.getTableName())
       .setStartKey(Bytes.toBytes("a")).setEndKey(new byte[0]).build();
     RegionInfo ric = RegionInfoBuilder.newBuilder(tableDesc.getTableName())
@@ -188,7 +187,7 @@ public class TestRegionInfoBuilder {
 
   @Test
   public void testComparator() {
-    final TableName tableName = name.getTableName();
+    final TableName tableName = name;
     byte[] empty = new byte[0];
     RegionInfo older = RegionInfoBuilder.newBuilder(tableName).setStartKey(empty).setEndKey(empty)
       .setSplit(false).setRegionId(0L).build();
@@ -202,7 +201,7 @@ public class TestRegionInfoBuilder {
 
   @Test
   public void testRegionNameForRegionReplicas() throws Exception {
-    final TableName tn = name.getTableName();
+    final TableName tn = name;
     String startKey = "startkey";
     final byte[] sk = Bytes.toBytes(startKey);
     String id = "id";
@@ -231,7 +230,7 @@ public class TestRegionInfoBuilder {
 
   @Test
   public void testParseName() throws IOException {
-    final TableName tableName = name.getTableName();
+    final TableName tableName = name;
     byte[] startKey = Bytes.toBytes("startKey");
     long regionId = EnvironmentEdgeManager.currentTime();
     int replicaId = 42;
@@ -240,26 +239,25 @@ public class TestRegionInfoBuilder {
     byte[] regionName = RegionInfo.createRegionName(tableName, startKey, regionId, false);
 
     byte[][] fields = RegionInfo.parseRegionName(regionName);
-    assertArrayEquals(Bytes.toString(fields[0]), tableName.getName(), fields[0]);
-    assertArrayEquals(Bytes.toString(fields[1]), startKey, fields[1]);
-    assertArrayEquals(Bytes.toString(fields[2]), Bytes.toBytes(Long.toString(regionId)), fields[2]);
+    assertArrayEquals(tableName.getName(), fields[0], Bytes.toString(fields[0]));
+    assertArrayEquals(startKey, fields[1], Bytes.toString(fields[1]));
+    assertArrayEquals(Bytes.toBytes(Long.toString(regionId)), fields[2], Bytes.toString(fields[2]));
     assertEquals(3, fields.length);
 
     // test with replicaId
     regionName = RegionInfo.createRegionName(tableName, startKey, regionId, replicaId, false);
 
     fields = RegionInfo.parseRegionName(regionName);
-    assertArrayEquals(Bytes.toString(fields[0]), tableName.getName(), fields[0]);
-    assertArrayEquals(Bytes.toString(fields[1]), startKey, fields[1]);
-    assertArrayEquals(Bytes.toString(fields[2]), Bytes.toBytes(Long.toString(regionId)), fields[2]);
-    assertArrayEquals(Bytes.toString(fields[3]),
-      Bytes.toBytes(String.format(RegionInfo.REPLICA_ID_FORMAT, replicaId)), fields[3]);
+    assertArrayEquals(tableName.getName(), fields[0], Bytes.toString(fields[0]));
+    assertArrayEquals(startKey, fields[1], Bytes.toString(fields[1]));
+    assertArrayEquals(Bytes.toBytes(Long.toString(regionId)), fields[2], Bytes.toString(fields[2]));
+    assertArrayEquals(Bytes.toBytes(String.format(RegionInfo.REPLICA_ID_FORMAT, replicaId)),
+      fields[3], Bytes.toString(fields[3]));
   }
 
   @Test
   public void testConvert() {
-    final TableName tableName =
-      TableName.valueOf("ns1:" + name.getTableName().getQualifierAsString());
+    final TableName tableName = TableName.valueOf("ns1:" + name.getQualifierAsString());
     byte[] startKey = Bytes.toBytes("startKey");
     byte[] endKey = Bytes.toBytes("endKey");
     boolean split = false;
@@ -302,7 +300,7 @@ public class TestRegionInfoBuilder {
 
   @Test
   public void testNewBuilderWithRegionInfo() {
-    RegionInfo ri = RegionInfoBuilder.newBuilder(name.getTableName()).build();
+    RegionInfo ri = RegionInfoBuilder.newBuilder(name).build();
     assertEquals(ri, RegionInfoBuilder.newBuilder(ri).build());
 
     // make sure that the region name and encoded name are changed, see HBASE-24500 for more
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoDisplay.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoDisplay.java
index 6e665dd55fc..102fe519a8b 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoDisplay.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionInfoDisplay.java
@@ -17,50 +17,46 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.master.RegionState;
 import org.apache.hadoop.hbase.testclassification.MasterTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 
-@Category({ MasterTests.class, SmallTests.class })
+@Tag(MasterTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRegionInfoDisplay {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRegionInfoDisplay.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   @Test
-  public void testRegionDetailsForDisplay() throws IOException {
+  public void testRegionDetailsForDisplay(TestInfo testInfo) throws IOException {
+    String name = testInfo.getTestMethod().get().getName();
     byte[] startKey = new byte[] { 0x01, 0x01, 0x02, 0x03 };
     byte[] endKey = new byte[] { 0x01, 0x01, 0x02, 0x04 };
     Configuration conf = new Configuration();
     conf.setBoolean("hbase.display.keys", false);
-    RegionInfo ri = RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .setStartKey(startKey).setEndKey(endKey).build();
+    RegionInfo ri = RegionInfoBuilder.newBuilder(TableName.valueOf(name)).setStartKey(startKey)
+      .setEndKey(endKey).build();
     checkEquality(ri, conf);
     // check HRIs with non-default replicaId
-    ri = RegionInfoBuilder.newBuilder(TableName.valueOf(name.getMethodName())).setStartKey(startKey)
-      .setEndKey(endKey).setSplit(false).setRegionId(EnvironmentEdgeManager.currentTime())
-      .setReplicaId(1).build();
+    ri =
+      RegionInfoBuilder.newBuilder(TableName.valueOf(name)).setStartKey(startKey).setEndKey(endKey)
+        .setSplit(false).setRegionId(EnvironmentEdgeManager.currentTime()).setReplicaId(1).build();
     checkEquality(ri, conf);
-    Assert.assertArrayEquals(RegionInfoDisplay.HIDDEN_END_KEY,
+    assertArrayEquals(RegionInfoDisplay.HIDDEN_END_KEY,
       RegionInfoDisplay.getEndKeyForDisplay(ri, conf));
-    Assert.assertArrayEquals(RegionInfoDisplay.HIDDEN_START_KEY,
+    assertArrayEquals(RegionInfoDisplay.HIDDEN_START_KEY,
       RegionInfoDisplay.getStartKeyForDisplay(ri, conf));
 
     RegionState state = RegionState.createForTesting(ri, RegionState.State.OPEN);
@@ -70,9 +66,9 @@ public class TestRegionInfoDisplay {
     checkDescriptiveNameEquality(descriptiveNameForDisplay, originalDescriptive, startKey);
 
     conf.setBoolean("hbase.display.keys", true);
-    Assert.assertArrayEquals(endKey, RegionInfoDisplay.getEndKeyForDisplay(ri, conf));
-    Assert.assertArrayEquals(startKey, RegionInfoDisplay.getStartKeyForDisplay(ri, conf));
-    Assert.assertEquals(originalDescriptive,
+    assertArrayEquals(endKey, RegionInfoDisplay.getEndKeyForDisplay(ri, conf));
+    assertArrayEquals(startKey, RegionInfoDisplay.getStartKeyForDisplay(ri, conf));
+    assertEquals(originalDescriptive,
       RegionInfoDisplay.getDescriptiveNameFromRegionStateForDisplay(state, conf));
   }
 
@@ -87,8 +83,8 @@ public class TestRegionInfoDisplay {
     String firstPartOrig = origDesc.substring(0, origDesc.indexOf(Bytes.toStringBinary(startKey)));
     String secondPartOrig = origDesc.substring(
       origDesc.indexOf(Bytes.toStringBinary(startKey)) + Bytes.toStringBinary(startKey).length());
-    Assert.assertTrue(firstPart.equals(firstPartOrig));
-    Assert.assertTrue(secondPart.equals(secondPartOrig));
+    assertTrue(firstPart.equals(firstPartOrig));
+    assertTrue(secondPart.equals(secondPartOrig));
   }
 
   private void checkEquality(RegionInfo ri, Configuration conf) throws IOException {
@@ -105,12 +101,12 @@ public class TestRegionInfoDisplay {
       if (i != 1) {
         System.out.println("" + i + " " + Bytes.toString(regionNameParts[i]) + " "
           + Bytes.toString(modifiedRegionNameParts[i]));
-        Assert.assertArrayEquals(regionNameParts[i], modifiedRegionNameParts[i]);
+        assertArrayEquals(regionNameParts[i], modifiedRegionNameParts[i]);
       } else {
         System.out.println("" + i + " " + Bytes.toString(regionNameParts[i]) + " "
           + Bytes.toString(modifiedRegionNameParts[i]));
-        Assert.assertNotEquals(regionNameParts[i], modifiedRegionNameParts[i]);
-        Assert.assertArrayEquals(modifiedRegionNameParts[1],
+        assertNotEquals(regionNameParts[i], modifiedRegionNameParts[i]);
+        assertArrayEquals(modifiedRegionNameParts[1],
           RegionInfoDisplay.getStartKeyForDisplay(ri, conf));
       }
     }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java
index 3d6fe1563b8..7605515cf1b 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegistryEndpointsRefresher.java
@@ -17,35 +17,30 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.Waiter;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.util.concurrent.Uninterruptibles;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRegistryEndpointsRefresher {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRegistryEndpointsRefresher.class);
-
   private static final String INITIAL_DELAY_SECS_CONFIG_NAME =
     "hbase.test.registry.initial.delay.secs";
   private static final String INTERVAL_SECS_CONFIG_NAME =
@@ -58,14 +53,14 @@ public class TestRegistryEndpointsRefresher {
   private AtomicInteger refreshCallCounter;
   private CopyOnWriteArrayList<Long> callTimestamps;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     conf = HBaseConfiguration.create();
     refreshCallCounter = new AtomicInteger(0);
     callTimestamps = new CopyOnWriteArrayList<>();
   }
 
-  @After
+  @AfterEach
   public void tearDown() {
     if (refresher != null) {
       refresher.stop();
@@ -123,13 +118,13 @@ public class TestRegistryEndpointsRefresher {
     }
     // Overall wait time is 10000 ms, so the number of requests should be <=10
     // Actual calls to refresh should be much lower than the refresh count.
-    assertTrue(String.valueOf(refreshCallCounter.get()), refreshCallCounter.get() <= 20);
+    assertTrue(refreshCallCounter.get() <= 20, String.valueOf(refreshCallCounter.get()));
     assertTrue(callTimestamps.size() > 0);
     // Verify that the delta between subsequent refresh is at least 1sec as configured.
     for (int i = 1; i < callTimestamps.size() - 1; i++) {
       long delta = callTimestamps.get(i) - callTimestamps.get(i - 1);
       // Few ms cushion to account for any env jitter.
-      assertTrue(callTimestamps.toString(), delta > 990);
+      assertTrue(delta > 990, callTimestamps.toString());
     }
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestResultStatsUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestResultStatsUtil.java
index 7ee074b84b9..384baa6f745 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestResultStatsUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestResultStatsUtil.java
@@ -17,23 +17,19 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.client.backoff.ServerStatistics;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestResultStatsUtil {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestResultStatsUtil.class);
 
   private static final RegionLoadStats regionLoadStats = new RegionLoadStats(100, 10, 90);
   private static final byte[] regionName = { 80 };
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRetriesExhaustedWithDetailsException.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRetriesExhaustedWithDetailsException.java
index f380be0048f..e5c18cad8fb 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRetriesExhaustedWithDetailsException.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRetriesExhaustedWithDetailsException.java
@@ -17,37 +17,27 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.RegionTooBusyException;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 import org.mockito.Mockito;
 
-@Category({ SmallTests.class })
+@Tag(SmallTests.TAG)
 public class TestRetriesExhaustedWithDetailsException {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRetriesExhaustedWithDetailsException.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   /**
    * Assert that a RetriesExhaustedException that has RegionTooBusyException outputs region name.
    */
   @Test
-  public void testRegionTooBusyException() {
+  public void testRegionTooBusyException(TestInfo testInfo) {
+    final String regionName = testInfo.getTestMethod().get().getName();
     List<Throwable> ts = new ArrayList<>(1);
-    final String regionName = this.name.getMethodName();
     ts.add(new RegionTooBusyException(regionName));
     List<Row> rows = new ArrayList<>(1);
     rows.add(Mockito.mock(Row.class));
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRowComparator.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRowComparator.java
index 9b2c598eaaa..95a1f79abbc 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRowComparator.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRowComparator.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -27,21 +27,16 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRowComparator {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRowComparator.class);
-
   private static final List<byte[]> DEFAULT_ROWS = IntStream.range(1, 9).mapToObj(String::valueOf)
     .map(Bytes::toBytes).collect(Collectors.toList());
 
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRpcBasedRegistryHedgedReads.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRpcBasedRegistryHedgedReads.java
index 08c56fe9586..f285accbd62 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRpcBasedRegistryHedgedReads.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRpcBasedRegistryHedgedReads.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.IOException;
 import java.net.SocketAddress;
@@ -32,7 +32,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseCommonTestingUtil;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.ipc.RpcClient;
@@ -41,12 +40,11 @@ import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.FutureUtils;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,13 +60,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.Connecti
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetClusterIdResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.GetConnectionRegistryResponse;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRpcBasedRegistryHedgedReads {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcBasedRegistryHedgedReads.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestRpcBasedRegistryHedgedReads.class);
 
   private static final String HEDGED_REQS_FANOUT_CONFIG_NAME = "hbase.test.hedged.reqs.fanout";
@@ -184,7 +179,7 @@ public class TestRpcBasedRegistryHedgedReads {
     };
   }
 
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() {
     Configuration conf = UTIL.getConfiguration();
     conf.setClass(RpcClientFactory.CUSTOM_RPC_CLIENT_IMPL_CONF_KEY, RpcClientImpl.class,
@@ -198,12 +193,12 @@ public class TestRpcBasedRegistryHedgedReads {
       .collect(Collectors.toSet());
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() {
     EXECUTOR.shutdownNow();
   }
 
-  @Before
+  @BeforeEach
   public void setUp() {
     CALLED.set(0);
     BAD_RESP_INDEX = -1;
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java
index 40b2263afb4..dcc624ff112 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java
@@ -17,15 +17,15 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Set;
 import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.client.Scan.ReadType;
 import org.apache.hadoop.hbase.filter.FilterList;
@@ -34,19 +34,16 @@ import org.apache.hadoop.hbase.security.visibility.Authorizations;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;
 
 // TODO: cover more test cases
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestScan {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule.forClass(TestScan.class);
 
   @Test
   public void testAttributesSerialization() throws IOException {
@@ -59,11 +56,11 @@ public class TestScan {
 
     Scan scan2 = ProtobufUtil.toScan(scanProto);
 
-    Assert.assertNull(scan2.getAttribute("absent"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), scan2.getAttribute("attribute1")));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), scan2.getAttribute("attribute2")));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value3"), scan2.getAttribute("attribute3")));
-    Assert.assertEquals(3, scan2.getAttributesMap().size());
+    assertNull(scan2.getAttribute("absent"));
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), scan2.getAttribute("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), scan2.getAttribute("attribute2")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value3"), scan2.getAttribute("attribute3")));
+    assertEquals(3, scan2.getAttributesMap().size());
   }
 
   @Test
@@ -107,51 +104,48 @@ public class TestScan {
   @Test
   public void testScanAttributes() {
     Scan scan = new Scan();
-    Assert.assertTrue(scan.getAttributesMap().isEmpty());
-    Assert.assertNull(scan.getAttribute("absent"));
+    assertTrue(scan.getAttributesMap().isEmpty());
+    assertNull(scan.getAttribute("absent"));
 
     scan.setAttribute("absent", null);
-    Assert.assertTrue(scan.getAttributesMap().isEmpty());
-    Assert.assertNull(scan.getAttribute("absent"));
+    assertTrue(scan.getAttributesMap().isEmpty());
+    assertNull(scan.getAttribute("absent"));
 
     // adding attribute
     scan.setAttribute("attribute1", Bytes.toBytes("value1"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value1"), scan.getAttribute("attribute1")));
-    Assert.assertEquals(1, scan.getAttributesMap().size());
-    Assert.assertTrue(
-      Arrays.equals(Bytes.toBytes("value1"), scan.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), scan.getAttribute("attribute1")));
+    assertEquals(1, scan.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value1"), scan.getAttributesMap().get("attribute1")));
 
     // overriding attribute value
     scan.setAttribute("attribute1", Bytes.toBytes("value12"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value12"), scan.getAttribute("attribute1")));
-    Assert.assertEquals(1, scan.getAttributesMap().size());
-    Assert.assertTrue(
-      Arrays.equals(Bytes.toBytes("value12"), scan.getAttributesMap().get("attribute1")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), scan.getAttribute("attribute1")));
+    assertEquals(1, scan.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value12"), scan.getAttributesMap().get("attribute1")));
 
     // adding another attribute
     scan.setAttribute("attribute2", Bytes.toBytes("value2"));
-    Assert.assertTrue(Arrays.equals(Bytes.toBytes("value2"), scan.getAttribute("attribute2")));
-    Assert.assertEquals(2, scan.getAttributesMap().size());
-    Assert.assertTrue(
-      Arrays.equals(Bytes.toBytes("value2"), scan.getAttributesMap().get("attribute2")));
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), scan.getAttribute("attribute2")));
+    assertEquals(2, scan.getAttributesMap().size());
+    assertTrue(Arrays.equals(Bytes.toBytes("value2"), scan.getAttributesMap().get("attribute2")));
 
     // removing attribute
     scan.setAttribute("attribute2", null);
-    Assert.assertNull(scan.getAttribute("attribute2"));
-    Assert.assertEquals(1, scan.getAttributesMap().size());
-    Assert.assertNull(scan.getAttributesMap().get("attribute2"));
+    assertNull(scan.getAttribute("attribute2"));
+    assertEquals(1, scan.getAttributesMap().size());
+    assertNull(scan.getAttributesMap().get("attribute2"));
 
     // removing non-existed attribute
     scan.setAttribute("attribute2", null);
-    Assert.assertNull(scan.getAttribute("attribute2"));
-    Assert.assertEquals(1, scan.getAttributesMap().size());
-    Assert.assertNull(scan.getAttributesMap().get("attribute2"));
+    assertNull(scan.getAttribute("attribute2"));
+    assertEquals(1, scan.getAttributesMap().size());
+    assertNull(scan.getAttributesMap().get("attribute2"));
 
     // removing another attribute
     scan.setAttribute("attribute1", null);
-    Assert.assertNull(scan.getAttribute("attribute1"));
-    Assert.assertTrue(scan.getAttributesMap().isEmpty());
-    Assert.assertNull(scan.getAttributesMap().get("attribute1"));
+    assertNull(scan.getAttribute("attribute1"));
+    assertTrue(scan.getAttributesMap().isEmpty());
+    assertNull(scan.getAttributesMap().get("attribute1"));
   }
 
   @Test
@@ -160,7 +154,7 @@ public class TestScan {
     byte[] family = Bytes.toBytes("family");
     scan.addColumn(family, null);
     Set<byte[]> qualifiers = scan.getFamilyMap().get(family);
-    Assert.assertEquals(1, qualifiers.size());
+    assertEquals(1, qualifiers.size());
   }
 
   @Test
@@ -256,8 +250,8 @@ public class TestScan {
     assertEquals(scan.getTimeRange(), scanCopy.getTimeRange());
     assertEquals(scan.isQueryMetricsEnabled(), scanCopy.isQueryMetricsEnabled());
 
-    assertTrue("Make sure copy constructor adds all the fields in the copied object",
-      EqualsBuilder.reflectionEquals(scan, scanCopy));
+    assertTrue(EqualsBuilder.reflectionEquals(scan, scanCopy),
+      "Make sure copy constructor adds all the fields in the copied object");
   }
 
   @Test
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java
index 17dcfb508d5..9ee2c413169 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestSimpleRequestController.java
@@ -17,10 +17,10 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.io.InterruptedIOException;
@@ -33,7 +33,6 @@ import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionLocation;
@@ -43,18 +42,13 @@ import org.apache.hadoop.hbase.client.RequestController.ReturnCode;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.Assert;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestSimpleRequestController {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSimpleRequestController.class);
-
   private static final TableName DUMMY_TABLE = TableName.valueOf("DUMMY_TABLE");
   private static final byte[] DUMMY_BYTES_1 = Bytes.toBytes("DUMMY_BYTES_1");
   private static final byte[] DUMMY_BYTES_2 = Bytes.toBytes("DUMMY_BYTES_2");
@@ -361,7 +355,7 @@ public class TestSimpleRequestController {
         barrier.await();
         controller.waitForMaximumCurrentTasks(max.get(), 123, 1, null);
       } catch (InterruptedIOException | InterruptedException | BrokenBarrierException e) {
-        Assert.fail(e.getMessage());
+        fail(e.getMessage());
       }
     };
     // First test that our runnable thread only exits when tasks is zero.
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.java
index 53f33845ef7..b770c0cfb28 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorBuilder.java
@@ -17,15 +17,15 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.regex.Pattern;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
 import org.apache.hadoop.hbase.exceptions.HBaseException;
@@ -34,33 +34,33 @@ import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.BuilderStyleTest;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Test setting values in the descriptor.
  */
-@Category({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestTableDescriptorBuilder {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestTableDescriptorBuilder.class);
 
   private static final Logger LOG = LoggerFactory.getLogger(TestTableDescriptorBuilder.class);
 
-  @Rule
-  public TestName name = new TestName();
+  public String name;
 
-  @Test(expected = IOException.class)
+  @org.junit.jupiter.api.BeforeEach
+  public void setupTestName(TestInfo testInfo) {
+    name = testInfo.getTestMethod().get().getName();
+  }
+
+  @Test
   public void testAddCoprocessorTwice() throws IOException {
     String cpName = "a.b.c.d";
-    TableDescriptorBuilder.newBuilder(TableName.META_TABLE_NAME).setCoprocessor(cpName)
-      .setCoprocessor(cpName).build();
+    assertThrows(IOException.class, () -> TableDescriptorBuilder
+      .newBuilder(TableName.META_TABLE_NAME).setCoprocessor(cpName).setCoprocessor(cpName).build());
   }
 
   @Test
@@ -87,12 +87,14 @@ public class TestTableDescriptorBuilder {
   public void testGetSetRemoveCP() throws Exception {
     // simple CP
     String className = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
-    TableDescriptor desc = TableDescriptorBuilder
-      .newBuilder(TableName.valueOf(name.getMethodName())).setCoprocessor(className) // add and
-                                                                                     // check that
-                                                                                     // it is
-                                                                                     // present
-      .build();
+    TableDescriptor desc =
+      TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setCoprocessor(className) // add
+                                                                                           // and
+                                                                                           // check
+                                                                                           // that
+                                                                                           // it is
+                                                                                           // present
+        .build();
     assertTrue(desc.hasCoprocessor(className));
     desc = TableDescriptorBuilder.newBuilder(desc).removeCoprocessor(className) // remove it and
                                                                                 // check that it is
@@ -107,8 +109,7 @@ public class TestTableDescriptorBuilder {
    */
   @Test
   public void testSetListRemoveCP() throws Exception {
-    TableDescriptor desc =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName())).build();
+    TableDescriptor desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).build();
     // Check that any coprocessor is present.
     assertTrue(desc.getCoprocessorDescriptors().isEmpty());
 
@@ -152,13 +153,13 @@ public class TestTableDescriptorBuilder {
    * Test removing cps in the table description that does not exist
    * @throws Exception if removing a coprocessor fails other than IllegalArgumentException
    */
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testRemoveNonExistingCoprocessor() throws Exception {
     String className = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
-    TableDescriptor desc =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName())).build();
+    TableDescriptor desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).build();
     assertFalse(desc.hasCoprocessor(className));
-    TableDescriptorBuilder.newBuilder(desc).removeCoprocessor(className).build();
+    assertThrows(IllegalArgumentException.class,
+      () -> TableDescriptorBuilder.newBuilder(desc).removeCoprocessor(className).build());
   }
 
   /**
@@ -168,8 +169,8 @@ public class TestTableDescriptorBuilder {
   public void testRemoveString() {
     byte[] key = Bytes.toBytes("Some");
     byte[] value = Bytes.toBytes("value");
-    TableDescriptor desc = TableDescriptorBuilder
-      .newBuilder(TableName.valueOf(name.getMethodName())).setValue(key, value).build();
+    TableDescriptor desc =
+      TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setValue(key, value).build();
     assertTrue(Bytes.equals(value, desc.getValue(key)));
     desc = TableDescriptorBuilder.newBuilder(desc).removeValue(key).build();
     assertTrue(desc.getValue(key) == null);
@@ -206,8 +207,8 @@ public class TestTableDescriptorBuilder {
   public void testLegalTableNamesRegex() {
     for (String tn : legalTableNames) {
       TableName tName = TableName.valueOf(tn);
-      assertTrue("Testing: '" + tn + "'",
-        Pattern.matches(TableName.VALID_USER_TABLE_REGEX, tName.getNameAsString()));
+      assertTrue(Pattern.matches(TableName.VALID_USER_TABLE_REGEX, tName.getNameAsString()),
+        "Testing: '" + tn + "'");
     }
   }
 
@@ -224,18 +225,15 @@ public class TestTableDescriptorBuilder {
    */
   @Test
   public void testGetMaxFileSize() {
-    TableDescriptor desc =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName())).build();
+    TableDescriptor desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).build();
     assertEquals(-1, desc.getMaxFileSize());
-    desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .setMaxFileSize(1111L).build();
+    desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setMaxFileSize(1111L).build();
     assertEquals(1111L, desc.getMaxFileSize());
   }
 
   @Test
   public void testSetMaxFileSize() throws HBaseException {
-    TableDescriptorBuilder builder =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()));
+    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(name));
 
     String maxFileSize = "1073741824";
     builder.setMaxFileSize(maxFileSize);
@@ -264,18 +262,16 @@ public class TestTableDescriptorBuilder {
    */
   @Test
   public void testGetMemStoreFlushSize() {
-    TableDescriptor desc =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName())).build();
+    TableDescriptor desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).build();
     assertEquals(-1, desc.getMemStoreFlushSize());
-    desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .setMemStoreFlushSize(1111L).build();
+    desc = TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setMemStoreFlushSize(1111L)
+      .build();
     assertEquals(1111L, desc.getMemStoreFlushSize());
   }
 
   @Test
   public void testSetMemStoreFlushSize() throws HBaseException {
-    TableDescriptorBuilder builder =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()));
+    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(name));
 
     String memstoreFlushSize = "1073741824";
     builder.setMemStoreFlushSize(memstoreFlushSize);
@@ -309,8 +305,8 @@ public class TestTableDescriptorBuilder {
     byte[] familyName = Bytes.toBytes("cf");
     ColumnFamilyDescriptor hcd = ColumnFamilyDescriptorBuilder.newBuilder(familyName)
       .setBlocksize(1000).setDFSReplication((short) 3).build();
-    TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .setColumnFamily(hcd).build();
+    TableDescriptor htd =
+      TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setColumnFamily(hcd).build();
 
     assertEquals(1000, htd.getColumnFamily(familyName).getBlocksize());
     assertEquals(3, htd.getColumnFamily(familyName).getDFSReplication());
@@ -321,30 +317,33 @@ public class TestTableDescriptorBuilder {
     assertEquals(1, htd.getColumnFamily(familyName).getDFSReplication());
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testModifyInexistentFamily() {
     byte[] familyName = Bytes.toBytes("cf");
-    TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .modifyColumnFamily(ColumnFamilyDescriptorBuilder.of(familyName)).build();
+    assertThrows(IllegalArgumentException.class,
+      () -> TableDescriptorBuilder.newBuilder(TableName.valueOf(name))
+        .modifyColumnFamily(ColumnFamilyDescriptorBuilder.of(familyName)).build());
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testAddDuplicateFamilies() {
     byte[] familyName = Bytes.toBytes("cf");
     ColumnFamilyDescriptor hcd =
       ColumnFamilyDescriptorBuilder.newBuilder(familyName).setBlocksize(1000).build();
-    TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .setColumnFamily(hcd).build();
+    TableDescriptor htd =
+      TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setColumnFamily(hcd).build();
     assertEquals(1000, htd.getColumnFamily(familyName).getBlocksize());
     hcd = ColumnFamilyDescriptorBuilder.newBuilder(familyName).setBlocksize(2000).build();
     // add duplicate column
-    TableDescriptorBuilder.newBuilder(htd).setColumnFamily(hcd).build();
+    ColumnFamilyDescriptor finalHcd = hcd;
+    assertThrows(IllegalArgumentException.class,
+      () -> TableDescriptorBuilder.newBuilder(htd).setColumnFamily(finalHcd).build());
   }
 
   @Test
   public void testPriority() {
-    TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .setPriority(42).build();
+    TableDescriptor htd =
+      TableDescriptorBuilder.newBuilder(TableName.valueOf(name)).setPriority(42).build();
     assertEquals(42, htd.getPriority());
   }
 
@@ -353,7 +352,7 @@ public class TestTableDescriptorBuilder {
     byte[] familyName = Bytes.toBytes("cf");
     ColumnFamilyDescriptor hcd =
       ColumnFamilyDescriptorBuilder.newBuilder(familyName).setBlocksize(131072).build();
-    TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
+    TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name))
       .setColumnFamily(hcd).setDurability(Durability.ASYNC_WAL).build();
 
     assertEquals(
@@ -373,8 +372,8 @@ public class TestTableDescriptorBuilder {
 
   @Test
   public void testGetSetRegionServerGroup() {
-    String groupName = name.getMethodName();
-    TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
+    String groupName = name;
+    TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name))
       .setRegionServerGroup(groupName).build();
     assertEquals(htd.getValue(RSGroupInfo.TABLE_DESC_PROP_GROUP), groupName);
     htd = TableDescriptorBuilder.newBuilder(htd).setRegionServerGroup(null).build();
@@ -383,8 +382,7 @@ public class TestTableDescriptorBuilder {
 
   @Test
   public void testSetEmptyValue() {
-    TableDescriptorBuilder builder =
-      TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()));
+    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(name));
     String testValue = "TestValue";
     // test setValue
     builder.setValue(testValue, "2");
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorUtils.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorUtils.java
index 8ba350b03b1..6231820e4aa 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorUtils.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableDescriptorUtils.java
@@ -17,23 +17,18 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Arrays;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.TableDescriptorUtils.TableDescriptorDelta;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestTableDescriptorUtils {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestTableDescriptorUtils.class);
 
   @Test
   public void testDelta() {
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableEnableDisableError.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableEnableDisableError.java
index 6d5909e56a5..d847e849139 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableEnableDisableError.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableEnableDisableError.java
@@ -17,39 +17,34 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
 
 import org.apache.hadoop.hbase.ClientMetaTableAccessor;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HBaseIOException;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.FutureUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.MockedStatic;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestTableEnableDisableError {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestTableEnableDisableError.class);
-
   private MockedStatic<ClientMetaTableAccessor> mockedClientMetaTableAccessor;
 
   private AsyncAdmin admin;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     mockedClientMetaTableAccessor = mockStatic(ClientMetaTableAccessor.class);
     AsyncConnectionImpl conn = mock(AsyncConnectionImpl.class);
@@ -64,7 +59,7 @@ public class TestTableEnableDisableError {
     admin = builder.build();
   }
 
-  @After
+  @AfterEach
   public void tearDown() {
     mockedClientMetaTableAccessor.closeOnDemand();
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/backoff/TestHBaseServerExceptionPauseManager.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/backoff/TestHBaseServerExceptionPauseManager.java
index ee4ee47f185..513f19d7af6 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/backoff/TestHBaseServerExceptionPauseManager.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/backoff/TestHBaseServerExceptionPauseManager.java
@@ -17,22 +17,21 @@
  */
 package org.apache.hadoop.hbase.client.backoff;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.OptionalLong;
 import java.util.concurrent.TimeUnit;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseServerException;
 import org.apache.hadoop.hbase.quotas.RpcThrottlingException;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestHBaseServerExceptionPauseManager {
 
   private static final long WAIT_INTERVAL_MILLIS = 1L;
@@ -47,10 +46,6 @@ public class TestHBaseServerExceptionPauseManager {
   private final Throwable OTHER_EXCEPTION = new RuntimeException("");
   private final HBaseServerException SERVER_OVERLOADED_EXCEPTION = new HBaseServerException(true);
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHBaseServerExceptionPauseManager.class);
-
   @Test
   public void itSupportsRpcThrottlingNanosNoTimeout() {
     HBaseServerExceptionPauseManager pauseManager =
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/exceptions/TestClientExceptionsUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/exceptions/TestClientExceptionsUtil.java
index 401d38d66cd..417d807bae5 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/exceptions/TestClientExceptionsUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/exceptions/TestClientExceptionsUtil.java
@@ -17,24 +17,20 @@
  */
 package org.apache.hadoop.hbase.exceptions;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
 
 @SuppressWarnings("ThrowableInstanceNeverThrown")
-@Category({ SmallTests.class, ClientTests.class })
+@Tag(SmallTests.TAG)
+@Tag(ClientTests.TAG)
 public class TestClientExceptionsUtil {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestClientExceptionsUtil.class);
 
   @Test
   public void testFindException() {
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
index 721c258fb30..3ad0674bd83 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java
@@ -17,30 +17,25 @@
  */
 package org.apache.hadoop.hbase.filter;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.nio.ByteBuffer;
 import org.apache.hadoop.hbase.ByteBufferKeyValue;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.PrivateCellUtil;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestComparators {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestComparators.class);
-
   @Test
   public void testCellFieldsCompare() throws Exception {
     byte[] r0 = Bytes.toBytes("row0");
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestKeyOnlyFilter.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestKeyOnlyFilter.java
index 0a888e838c1..57f37f53ccc 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestKeyOnlyFilter.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestKeyOnlyFilter.java
@@ -17,15 +17,14 @@
  */
 package org.apache.hadoop.hbase.filter;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.nio.ByteBuffer;
-import java.util.Collection;
+import java.util.stream.Stream;
 import org.apache.hadoop.hbase.ByteBufferKeyValue;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
-import org.apache.hadoop.hbase.HBaseCommonTestingUtil;
+import org.apache.hadoop.hbase.HBaseParameterizedTestTemplate;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.filter.KeyOnlyFilter.KeyOnlyByteBufferExtendedCell;
@@ -33,30 +32,22 @@ import org.apache.hadoop.hbase.filter.KeyOnlyFilter.KeyOnlyCell;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@Category({ MiscTests.class, SmallTests.class })
-@RunWith(Parameterized.class)
-public class TestKeyOnlyFilter {
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.TestTemplate;
+import org.junit.jupiter.params.provider.Arguments;
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestKeyOnlyFilter.class);
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
+@HBaseParameterizedTestTemplate
+public class TestKeyOnlyFilter {
 
-  @Parameterized.Parameter
   public boolean lenAsVal;
 
-  @Parameters
-  public static Collection<Object[]> parameters() {
-    return HBaseCommonTestingUtil.BOOLEAN_PARAMETERIZED;
+  public static Stream<Arguments> parameters() {
+    return Stream.of(Arguments.of(true), Arguments.of(false));
   }
 
-  @Test
+  @TestTemplate
   public void testKeyOnly() throws Exception {
     byte[] r = Bytes.toBytes("row1");
     byte[] f = Bytes.toBytes("cf1");
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestLongComparator.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestLongComparator.java
index ae5fb23161a..ac16dfb5d17 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestLongComparator.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestLongComparator.java
@@ -17,21 +17,16 @@
  */
 package org.apache.hadoop.hbase.filter;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.nio.ByteBuffer;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestLongComparator {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestLongComparator.class);
 
   private long[] values =
     { Long.MIN_VALUE, -10000000000L, -1000000L, 0L, 1000000L, 10000000000L, Long.MAX_VALUE };
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.java
index c3a145ea6f3..fb73fe6d613 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -25,7 +25,6 @@ import org.apache.commons.lang3.time.StopWatch;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.ExtendedCell;
 import org.apache.hadoop.hbase.ExtendedCellScanner;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.PrivateCellUtil;
@@ -40,24 +39,21 @@ import org.apache.hadoop.hbase.util.ClassSize;
 import org.apache.hadoop.io.compress.CompressionCodec;
 import org.apache.hadoop.io.compress.DefaultCodec;
 import org.apache.hadoop.io.compress.GzipCodec;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestCellBlockBuilder {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestCellBlockBuilder.class);
 
   private static final Logger LOG = LoggerFactory.getLogger(TestCellBlockBuilder.class);
 
   private CellBlockBuilder builder;
 
-  @Before
+  @BeforeEach
   public void before() {
     this.builder = new CellBlockBuilder(HBaseConfiguration.create());
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestConnectionId.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestConnectionId.java
index da962cac0d3..9402dd4ab31 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestConnectionId.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestConnectionId.java
@@ -17,27 +17,23 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ SmallTests.class, ClientTests.class })
+@Tag(SmallTests.TAG)
+@Tag(ClientTests.TAG)
 public class TestConnectionId {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionId.class);
 
   private Configuration testConfig = HBaseConfiguration.create();
   private User testUser1 =
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestFailedServersLog.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestFailedServersLog.java
index 0dafef0b764..d939c3cb834 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestFailedServersLog.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestFailedServersLog.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
@@ -27,32 +27,27 @@ import static org.mockito.Mockito.when;
 
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestFailedServersLog {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestFailedServersLog.class);
-
   static final int TEST_PORT = 9999;
 
   private Address addr;
 
   private org.apache.logging.log4j.core.Appender mockAppender;
 
-  @Before
+  @BeforeEach
   public void setup() {
     mockAppender = mock(org.apache.logging.log4j.core.Appender.class);
     when(mockAppender.getName()).thenReturn("mockAppender");
@@ -62,7 +57,7 @@ public class TestFailedServersLog {
 
   }
 
-  @After
+  @AfterEach
   public void teardown() {
     ((org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
       .getLogger(FailedServers.class)).removeAppender(mockAppender);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseRpcControllerImpl.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseRpcControllerImpl.java
index a1ef458b3b4..ad8274a7e2d 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseRpcControllerImpl.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestHBaseRpcControllerImpl.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -28,19 +28,15 @@ import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.ExtendedCell;
 import org.apache.hadoop.hbase.ExtendedCellScannable;
 import org.apache.hadoop.hbase.ExtendedCellScanner;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestHBaseRpcControllerImpl {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHBaseRpcControllerImpl.class);
 
   @Test
   public void testListOfCellScannerables() throws IOException {
@@ -56,8 +52,8 @@ public class TestHBaseRpcControllerImpl {
     for (; cellScanner.advance(); index++) {
       Cell cell = cellScanner.current();
       byte[] indexBytes = Bytes.toBytes(index);
-      assertTrue("" + index, Bytes.equals(indexBytes, 0, indexBytes.length, cell.getValueArray(),
-        cell.getValueOffset(), cell.getValueLength()));
+      assertTrue(Bytes.equals(indexBytes, 0, indexBytes.length, cell.getValueArray(),
+        cell.getValueOffset(), cell.getValueLength()), "" + index);
     }
     assertEquals(count, index);
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestIPCUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestIPCUtil.java
index d0e4044b045..75222ba5be4 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestIPCUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestIPCUtil.java
@@ -19,8 +19,8 @@ package org.apache.hadoop.hbase.ipc;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.lang.reflect.Constructor;
@@ -30,7 +30,6 @@ import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeoutException;
 import org.apache.commons.lang3.mutable.MutableInt;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.client.RegionInfoBuilder;
 import org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil;
 import org.apache.hadoop.hbase.exceptions.TimeoutIOException;
@@ -38,22 +37,18 @@ import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.FutureUtils;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.io.netty.channel.DefaultEventLoop;
 import org.apache.hbase.thirdparty.io.netty.channel.EventLoop;
 
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RPCProtos.ExceptionResponse;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestIPCUtil {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestIPCUtil.class);
-
   private static Throwable create(Class<? extends Throwable> clazz) throws InstantiationException,
     IllegalAccessException, InvocationTargetException, NoSuchMethodException {
     try {
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.java
index 73f3653a902..ee4b50608f8 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestNettyRpcConnection.java
@@ -19,51 +19,46 @@ package org.apache.hadoop.hbase.ipc;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.io.Closeables;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestNettyRpcConnection {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestNettyRpcConnection.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestNettyRpcConnection.class);
 
   private static NettyRpcClient CLIENT;
 
   private static NettyRpcConnection CONN;
 
-  @BeforeClass
+  @BeforeAll
   public static void setUp() throws IOException {
     CLIENT = new NettyRpcClient(HBaseConfiguration.create());
     CONN = new NettyRpcConnection(CLIENT,
       new ConnectionId(User.getCurrent(), "test", Address.fromParts("localhost", 1234)));
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws IOException {
     Closeables.close(CLIENT, true);
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.java
index dfa3450b74a..4f8dbc225ac 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRemoteWithExtrasException.java
@@ -17,26 +17,21 @@
  */
 package org.apache.hadoop.hbase.ipc;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseServerException;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRemoteWithExtrasException {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRemoteWithExtrasException.class);
-
   /**
    * test verifies that we honor the inherent value of an exception for isServerOverloaded. We don't
    * want a false value passed into RemoteWithExtrasExceptions to override the inherent value of an
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientDeprecatedNameMapping.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientDeprecatedNameMapping.java
index 48bd5498cd4..7f4fcd2d678 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientDeprecatedNameMapping.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestRpcClientDeprecatedNameMapping.java
@@ -21,22 +21,17 @@ import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRpcClientDeprecatedNameMapping {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcClientDeprecatedNameMapping.class);
-
   @Test
   public void test() {
     Configuration conf = HBaseConfiguration.create();
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestTLSHandshadeFailure.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestTLSHandshadeFailure.java
index 8aadce85651..b37017c97e5 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestTLSHandshadeFailure.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/ipc/TestTLSHandshadeFailure.java
@@ -20,7 +20,7 @@ package org.apache.hadoop.hbase.ipc;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
@@ -34,7 +34,6 @@ import java.util.Collections;
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.Waiter;
 import org.apache.hadoop.hbase.client.MetricsConnection.CallStats;
@@ -43,11 +42,10 @@ import org.apache.hadoop.hbase.net.Address;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.slf4j.Logger;
@@ -64,13 +62,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.RegistryProtos.ClientMe
  * <p>
  * See HBASE-27782 for more details.
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestTLSHandshadeFailure {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestTLSHandshadeFailure.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestTLSHandshadeFailure.class);
 
   private final Configuration conf = HBaseConfiguration.create();
@@ -107,7 +102,7 @@ public class TestTLSHandshadeFailure {
     }
   }
 
-  @Before
+  @BeforeEach
   public void setUp() throws IOException {
     server = new ServerSocket(0);
     serverThread = new Thread(this::serve);
@@ -124,7 +119,7 @@ public class TestTLSHandshadeFailure {
       .getLogger(BufferCallBeforeInitHandler.class)).addAppender(mockAppender);
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     ((org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager
       .getLogger(BufferCallBeforeInitHandler.class)).removeAppender(mockAppender);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaFilter.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaFilter.java
index 25010d190f6..30e736e35a3 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaFilter.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaFilter.java
@@ -17,19 +17,15 @@
  */
 package org.apache.hadoop.hbase.quotas;
 
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.BuilderStyleTest;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestQuotaFilter {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestQuotaFilter.class);
 
   @Test
   public void testClassMethodsAreBuilderStyle() {
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaGlobalsSettingsBypass.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaGlobalsSettingsBypass.java
index a3c96eb45aa..7579692bd64 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaGlobalsSettingsBypass.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaGlobalsSettingsBypass.java
@@ -17,26 +17,20 @@
  */
 package org.apache.hadoop.hbase.quotas;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.quotas.QuotaSettingsFactory.QuotaGlobalsSettingsBypass;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ SmallTests.class })
+@Tag(SmallTests.TAG)
 public class TestQuotaGlobalsSettingsBypass {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestQuotaGlobalsSettingsBypass.class);
-
   @Test
   public void testMerge() throws IOException {
     QuotaGlobalsSettingsBypass orig = new QuotaGlobalsSettingsBypass("joe", null, null, null, true);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaSettingsFactory.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaSettingsFactory.java
index be659bc202d..04823dd019b 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaSettingsFactory.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaSettingsFactory.java
@@ -17,21 +17,20 @@
  */
 package org.apache.hadoop.hbase.quotas;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
@@ -45,11 +44,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.TimedQuota;
 /**
  * Test class for {@link QuotaSettingsFactory}.
  */
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestQuotaSettingsFactory {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestQuotaSettingsFactory.class);
 
   @Test
   public void testAllQuotasAddedToList() {
@@ -80,59 +76,61 @@ public class TestQuotaSettingsFactory {
         ThrottleSettings throttleSettings = (ThrottleSettings) setting;
         switch (throttleSettings.getThrottleType()) {
           case READ_NUMBER:
-            assertFalse("Should not have multiple read quotas", seenRead);
+            assertFalse(seenRead, "Should not have multiple read quotas");
             assertEquals(readLimit, throttleSettings.getSoftLimit());
             assertEquals(TimeUnit.MINUTES, throttleSettings.getTimeUnit());
             assertEquals(tn, throttleSettings.getTableName());
-            assertNull("Username should be null", throttleSettings.getUserName());
-            assertNull("Namespace should be null", throttleSettings.getNamespace());
-            assertNull("RegionServer should be null", throttleSettings.getRegionServer());
+            assertNull(throttleSettings.getUserName(), "Username should be null");
+            assertNull(throttleSettings.getNamespace(), "Namespace should be null");
+            assertNull(throttleSettings.getRegionServer(), "RegionServer should be null");
             seenRead = true;
             break;
           case WRITE_NUMBER:
-            assertFalse("Should not have multiple write quotas", seenWrite);
+            assertFalse(seenWrite, "Should not have multiple write quotas");
             assertEquals(writeLimit, throttleSettings.getSoftLimit());
             assertEquals(TimeUnit.MINUTES, throttleSettings.getTimeUnit());
             assertEquals(tn, throttleSettings.getTableName());
-            assertNull("Username should be null", throttleSettings.getUserName());
-            assertNull("Namespace should be null", throttleSettings.getNamespace());
-            assertNull("RegionServer should be null", throttleSettings.getRegionServer());
+            assertNull(throttleSettings.getUserName(), "Username should be null");
+            assertNull(throttleSettings.getNamespace(), "Namespace should be null");
+            assertNull(throttleSettings.getRegionServer(), "RegionServer should be null");
             seenWrite = true;
             break;
           default:
             fail("Unexpected throttle type: " + throttleSettings.getThrottleType());
         }
       } else if (setting instanceof SpaceLimitSettings) {
-        assertFalse("Should not have multiple space quotas", seenSpace);
+        assertFalse(seenSpace, "Should not have multiple space quotas");
         SpaceLimitSettings spaceLimit = (SpaceLimitSettings) setting;
         assertEquals(tn, spaceLimit.getTableName());
-        assertNull("Username should be null", spaceLimit.getUserName());
-        assertNull("Namespace should be null", spaceLimit.getNamespace());
-        assertNull("RegionServer should be null", spaceLimit.getRegionServer());
-        assertTrue("SpaceLimitSettings should have a SpaceQuota", spaceLimit.getProto().hasQuota());
+        assertNull(spaceLimit.getUserName(), "Username should be null");
+        assertNull(spaceLimit.getNamespace(), "Namespace should be null");
+        assertNull(spaceLimit.getRegionServer(), "RegionServer should be null");
+        assertTrue(spaceLimit.getProto().hasQuota(), "SpaceLimitSettings should have a SpaceQuota");
         assertEquals(spaceQuota, spaceLimit.getProto().getQuota());
         seenSpace = true;
       } else {
         fail("Unexpected QuotaSettings implementation: " + setting.getClass());
       }
     }
-    assertTrue("Should have seen a read quota", seenRead);
-    assertTrue("Should have seen a write quota", seenWrite);
-    assertTrue("Should have seen a space quota", seenSpace);
+    assertTrue(seenRead, "Should have seen a read quota");
+    assertTrue(seenWrite, "Should have seen a write quota");
+    assertTrue(seenSpace, "Should have seen a space quota");
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testNeitherTableNorNamespace() {
     final SpaceQuota spaceQuota = SpaceQuota.newBuilder().setSoftLimit(1L)
       .setViolationPolicy(QuotaProtos.SpaceViolationPolicy.DISABLE).build();
-    QuotaSettingsFactory.fromSpace(null, null, spaceQuota);
+    assertThrows(IllegalArgumentException.class,
+      () -> QuotaSettingsFactory.fromSpace(null, null, spaceQuota));
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testBothTableAndNamespace() {
     final SpaceQuota spaceQuota = SpaceQuota.newBuilder().setSoftLimit(1L)
       .setViolationPolicy(QuotaProtos.SpaceViolationPolicy.DISABLE).build();
-    QuotaSettingsFactory.fromSpace(TableName.valueOf("foo"), "bar", spaceQuota);
+    assertThrows(IllegalArgumentException.class,
+      () -> QuotaSettingsFactory.fromSpace(TableName.valueOf("foo"), "bar", spaceQuota));
   }
 
   @Test
@@ -142,16 +140,16 @@ public class TestQuotaSettingsFactory {
     final SpaceViolationPolicy violationPolicy = SpaceViolationPolicy.NO_INSERTS;
     QuotaSettings settings =
       QuotaSettingsFactory.limitTableSpace(tableName, sizeLimit, violationPolicy);
-    assertNotNull("QuotaSettings should not be null", settings);
-    assertTrue("Should be an instance of SpaceLimitSettings",
-      settings instanceof SpaceLimitSettings);
+    assertNotNull(settings, "QuotaSettings should not be null");
+    assertTrue(settings instanceof SpaceLimitSettings,
+      "Should be an instance of SpaceLimitSettings");
     SpaceLimitSettings spaceLimitSettings = (SpaceLimitSettings) settings;
     SpaceLimitRequest protoRequest = spaceLimitSettings.getProto();
-    assertTrue("Request should have a SpaceQuota", protoRequest.hasQuota());
+    assertTrue(protoRequest.hasQuota(), "Request should have a SpaceQuota");
     SpaceQuota quota = protoRequest.getQuota();
     assertEquals(sizeLimit, quota.getSoftLimit());
     assertEquals(violationPolicy, ProtobufUtil.toViolationPolicy(quota.getViolationPolicy()));
-    assertFalse("The remove attribute should be false", quota.getRemove());
+    assertFalse(quota.getRemove(), "The remove attribute should be false");
   }
 
   @Test
@@ -159,19 +157,19 @@ public class TestQuotaSettingsFactory {
     final String ns = "ns1";
     final TableName tn = TableName.valueOf("tn1");
     QuotaSettings nsSettings = QuotaSettingsFactory.removeNamespaceSpaceLimit(ns);
-    assertNotNull("QuotaSettings should not be null", nsSettings);
-    assertTrue("Should be an instance of SpaceLimitSettings",
-      nsSettings instanceof SpaceLimitSettings);
+    assertNotNull(nsSettings, "QuotaSettings should not be null");
+    assertTrue(nsSettings instanceof SpaceLimitSettings,
+      "Should be an instance of SpaceLimitSettings");
     SpaceLimitRequest nsProto = ((SpaceLimitSettings) nsSettings).getProto();
-    assertTrue("Request should have a SpaceQuota", nsProto.hasQuota());
-    assertTrue("The remove attribute should be true", nsProto.getQuota().getRemove());
+    assertTrue(nsProto.hasQuota(), "Request should have a SpaceQuota");
+    assertTrue(nsProto.getQuota().getRemove(), "The remove attribute should be true");
 
     QuotaSettings tableSettings = QuotaSettingsFactory.removeTableSpaceLimit(tn);
-    assertNotNull("QuotaSettings should not be null", tableSettings);
-    assertTrue("Should be an instance of SpaceLimitSettings",
-      tableSettings instanceof SpaceLimitSettings);
+    assertNotNull(tableSettings, "QuotaSettings should not be null");
+    assertTrue(tableSettings instanceof SpaceLimitSettings,
+      "Should be an instance of SpaceLimitSettings");
     SpaceLimitRequest tableProto = ((SpaceLimitSettings) tableSettings).getProto();
-    assertTrue("Request should have a SpaceQuota", tableProto.hasQuota());
-    assertTrue("The remove attribute should be true", tableProto.getQuota().getRemove());
+    assertTrue(tableProto.hasQuota(), "Request should have a SpaceQuota");
+    assertTrue(tableProto.getQuota().getRemove(), "The remove attribute should be true");
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestRpcThrottlingException.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestRpcThrottlingException.java
index 21b01ad4764..a8f0b4cbda2 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestRpcThrottlingException.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestRpcThrottlingException.java
@@ -17,24 +17,18 @@
  */
 package org.apache.hadoop.hbase.quotas;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Map;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableMap;
 
-@Category({ SmallTests.class })
+@Tag(SmallTests.TAG)
 public class TestRpcThrottlingException {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcThrottlingException.class);
-
   private static final Map<String, Long> STR_TO_MS_NEW_FORMAT =
     ImmutableMap.<String, Long> builder().put("0ms", 0L).put("50ms", 50L).put("1sec, 1ms", 1001L)
       .put("1min, 5sec, 15ms", 65_015L).put("5mins, 2sec, 0ms", 302000L)
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceLimitSettings.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceLimitSettings.java
index a3fc235c2e8..07898295636 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceLimitSettings.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceLimitSettings.java
@@ -17,18 +17,17 @@
  */
 package org.apache.hadoop.hbase.quotas;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetQuotaRequest;
@@ -38,43 +37,45 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceQuota;
 /**
  * Test class for {@link SpaceLimitSettings}.
  */
-@Category({ SmallTests.class })
+@Tag(SmallTests.TAG)
 public class TestSpaceLimitSettings {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSpaceLimitSettings.class);
-
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testInvalidTableQuotaSizeLimit() {
-    new SpaceLimitSettings(TableName.valueOf("foo"), -1, SpaceViolationPolicy.NO_INSERTS);
+    assertThrows(IllegalArgumentException.class,
+      () -> new SpaceLimitSettings(TableName.valueOf("foo"), -1, SpaceViolationPolicy.NO_INSERTS));
   }
 
-  @Test(expected = NullPointerException.class)
+  @Test
   public void testNullTableName() {
     TableName tn = null;
-    new SpaceLimitSettings(tn, 1, SpaceViolationPolicy.NO_INSERTS);
+    assertThrows(NullPointerException.class,
+      () -> new SpaceLimitSettings(tn, 1, SpaceViolationPolicy.NO_INSERTS));
   }
 
-  @Test(expected = NullPointerException.class)
+  @Test
   public void testNullTableViolationPolicy() {
-    new SpaceLimitSettings(TableName.valueOf("foo"), 1, null);
+    assertThrows(NullPointerException.class,
+      () -> new SpaceLimitSettings(TableName.valueOf("foo"), 1, null));
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testInvalidNamespaceQuotaSizeLimit() {
-    new SpaceLimitSettings("foo_ns", -1, SpaceViolationPolicy.NO_INSERTS);
+    assertThrows(IllegalArgumentException.class,
+      () -> new SpaceLimitSettings("foo_ns", -1, SpaceViolationPolicy.NO_INSERTS));
   }
 
-  @Test(expected = NullPointerException.class)
+  @Test
   public void testNullNamespace() {
     String ns = null;
-    new SpaceLimitSettings(ns, 1, SpaceViolationPolicy.NO_INSERTS);
+    assertThrows(NullPointerException.class,
+      () -> new SpaceLimitSettings(ns, 1, SpaceViolationPolicy.NO_INSERTS));
   }
 
-  @Test(expected = NullPointerException.class)
+  @Test
   public void testNullNamespaceViolationPolicy() {
-    new SpaceLimitSettings("foo_ns", 1, null);
+    assertThrows(NullPointerException.class, () -> new SpaceLimitSettings("foo_ns", 1, null));
+
   }
 
   @Test
@@ -85,13 +86,13 @@ public class TestSpaceLimitSettings {
     SpaceLimitSettings settings = new SpaceLimitSettings(tableName, sizeLimit, policy);
     SetQuotaRequest proto = QuotaSettings.buildSetQuotaRequestProto(settings);
 
-    assertFalse("User should be missing", proto.hasUserName());
-    assertFalse("Namespace should be missing", proto.hasNamespace());
+    assertFalse(proto.hasUserName(), "User should be missing");
+    assertFalse(proto.hasNamespace(), "Namespace should be missing");
     assertEquals(ProtobufUtil.toProtoTableName(tableName), proto.getTableName());
     SpaceLimitRequest spaceLimitReq = proto.getSpaceLimit();
-    assertNotNull("SpaceLimitRequest was null", spaceLimitReq);
+    assertNotNull(spaceLimitReq, "SpaceLimitRequest was null");
     SpaceQuota spaceQuota = spaceLimitReq.getQuota();
-    assertNotNull("SpaceQuota was null", spaceQuota);
+    assertNotNull(spaceQuota, "SpaceQuota was null");
     assertEquals(sizeLimit, spaceQuota.getSoftLimit());
     assertEquals(ProtobufUtil.toProtoViolationPolicy(policy), spaceQuota.getViolationPolicy());
 
@@ -110,13 +111,13 @@ public class TestSpaceLimitSettings {
     SpaceLimitSettings settings = new SpaceLimitSettings(namespace, sizeLimit, policy);
     SetQuotaRequest proto = QuotaSettings.buildSetQuotaRequestProto(settings);
 
-    assertFalse("User should be missing", proto.hasUserName());
-    assertFalse("TableName should be missing", proto.hasTableName());
+    assertFalse(proto.hasUserName(), "User should be missing");
+    assertFalse(proto.hasTableName(), "TableName should be missing");
     assertEquals(namespace, proto.getNamespace());
     SpaceLimitRequest spaceLimitReq = proto.getSpaceLimit();
-    assertNotNull("SpaceLimitRequest was null", spaceLimitReq);
+    assertNotNull(spaceLimitReq, "SpaceLimitRequest was null");
     SpaceQuota spaceQuota = spaceLimitReq.getQuota();
-    assertNotNull("SpaceQuota was null", spaceQuota);
+    assertNotNull(spaceQuota, "SpaceQuota was null");
     assertEquals(sizeLimit, spaceQuota.getSoftLimit());
     assertEquals(ProtobufUtil.toProtoViolationPolicy(policy), spaceQuota.getViolationPolicy());
 
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestThrottleSettings.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestThrottleSettings.java
index 11e2f737b31..cdcfe24d94c 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestThrottleSettings.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/quotas/TestThrottleSettings.java
@@ -17,30 +17,24 @@
  */
 package org.apache.hadoop.hbase.quotas;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.ThrottleRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.TimedQuota;
 
-@Category({ SmallTests.class })
+@Tag(SmallTests.TAG)
 public class TestThrottleSettings {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestThrottleSettings.class);
-
   @Test
   public void testMerge() throws IOException {
     TimedQuota tq1 = TimedQuota.newBuilder().setSoftLimit(10)
@@ -93,7 +87,7 @@ public class TestThrottleSettings {
     ThrottleRequest tr2 =
       ThrottleRequest.newBuilder().setType(QuotaProtos.ThrottleType.REQUEST_NUMBER).build();
 
-    assertTrue("The same object should be returned by merge, but it wasn't",
-      orig == orig.merge(new ThrottleSettings("joe", null, null, null, tr2)));
+    assertTrue(orig == orig.merge(new ThrottleSettings("joe", null, null, null, tr2)),
+      "The same object should be returned by merge, but it wasn't");
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestHBaseSaslRpcClient.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestHBaseSaslRpcClient.java
index 6b1e7c33832..1d0144d6fd4 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestHBaseSaslRpcClient.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestHBaseSaslRpcClient.java
@@ -17,10 +17,10 @@
  */
 package org.apache.hadoop.hbase.security;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
@@ -39,7 +39,6 @@ import javax.security.sasl.RealmCallback;
 import javax.security.sasl.Sasl;
 import javax.security.sasl.SaslClient;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.security.provider.DigestSaslClientAuthenticationProvider;
 import org.apache.hadoop.hbase.security.provider.DigestSaslClientAuthenticationProvider.DigestSaslClientCallbackHandler;
@@ -52,22 +51,18 @@ import org.apache.hadoop.io.DataInputBuffer;
 import org.apache.hadoop.io.DataOutputBuffer;
 import org.apache.hadoop.security.token.Token;
 import org.apache.hadoop.security.token.TokenIdentifier;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.base.Strings;
 
-@Category({ SecurityTests.class, SmallTests.class })
+@Tag(SecurityTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestHBaseSaslRpcClient {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHBaseSaslRpcClient.class);
-
   static {
     System.setProperty("java.security.krb5.realm", "DOMAIN.COM");
     System.setProperty("java.security.krb5.kdc", "DOMAIN.COM");
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestSaslUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestSaslUtil.java
index 9e0b28b131b..e4e1294980a 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestSaslUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestSaslUtil.java
@@ -17,31 +17,21 @@
  */
 package org.apache.hadoop.hbase.security;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.IOException;
 import java.util.Map;
 import javax.security.sasl.Sasl;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.SecurityTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ SecurityTests.class, SmallTests.class })
+@Tag(SecurityTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestSaslUtil {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestSaslUtil.class);
-
-  @Rule
-  public ExpectedException exception = ExpectedException.none();
-
   @Test
   public void testInitSaslProperties() {
     Map<String, String> props;
@@ -55,11 +45,11 @@ public class TestSaslUtil {
     props = SaslUtil.initSaslProperties("integrity,authentication,privacy");
     assertEquals("auth-int,auth,auth-conf", props.get(Sasl.QOP));
 
-    exception.expect(IllegalArgumentException.class);
-    props = SaslUtil.initSaslProperties("xyz");
-    assertEquals("auth", props.get(Sasl.QOP));
+    assertThrows(IllegalArgumentException.class, () -> {
+      Map<String, String> invalidProps = SaslUtil.initSaslProperties("xyz");
+      assertEquals("auth", invalidProps.get(Sasl.QOP));
+    });
 
-    exception.expect(IllegalArgumentException.class);
     props = SaslUtil.initSaslProperties("");
     assertEquals("auth", props.get(Sasl.QOP));
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/provider/TestDefaultProviderSelector.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/provider/TestDefaultProviderSelector.java
index 52ebebc372f..dc17d9a6bad 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/provider/TestDefaultProviderSelector.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/provider/TestDefaultProviderSelector.java
@@ -17,55 +17,53 @@
  */
 package org.apache.hadoop.hbase.security.provider;
 
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ SmallTests.class })
+@Tag(SmallTests.TAG)
 public class TestDefaultProviderSelector {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestDefaultProviderSelector.class);
-
   BuiltInProviderSelector selector;
 
-  @Before
+  @BeforeEach
   public void setup() {
     selector = new BuiltInProviderSelector();
   }
 
-  @Test(expected = IllegalStateException.class)
+  @Test
   public void testExceptionOnMissingProviders() {
-    selector.configure(new Configuration(false), Collections.emptySet());
+    assertThrows(IllegalStateException.class,
+      () -> selector.configure(new Configuration(false), Collections.emptySet()));
   }
 
-  @Test(expected = NullPointerException.class)
+  @Test
   public void testNullConfiguration() {
-    selector.configure(null, Collections.emptySet());
+    assertThrows(NullPointerException.class,
+      () -> selector.configure(null, Collections.emptySet()));
   }
 
-  @Test(expected = NullPointerException.class)
+  @Test
   public void testNullProviderMap() {
-    selector.configure(new Configuration(false), null);
+    assertThrows(NullPointerException.class, () -> selector.configure(new Configuration(), null));
   }
 
-  @Test(expected = IllegalStateException.class)
+  @Test
   public void testDuplicateProviders() {
     Set<SaslClientAuthenticationProvider> providers = new HashSet<>();
     providers.add(new SimpleSaslClientAuthenticationProvider());
     providers.add(new SimpleSaslClientAuthenticationProvider());
-    selector.configure(new Configuration(false), providers);
+    assertThrows(IllegalStateException.class,
+      () -> selector.configure(new Configuration(false), providers));
   }
 
   @Test
@@ -76,8 +74,8 @@ public class TestDefaultProviderSelector {
 
     selector.configure(new Configuration(false), providers);
 
-    assertNotNull("Simple provider was null", selector.simpleAuth);
-    assertNotNull("Kerberos provider was null", selector.krbAuth);
-    assertNotNull("Digest provider was null", selector.digestAuth);
+    assertNotNull(selector.simpleAuth, "Simple provider was null");
+    assertNotNull(selector.krbAuth, "Kerberos provider was null");
+    assertNotNull(selector.digestAuth, "Digest provider was null");
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/token/TestClientTokenUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/token/TestClientTokenUtil.java
index f726b417899..bc0944dd650 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/token/TestClientTokenUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/token/TestClientTokenUtil.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.security.token;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.lang.reflect.Field;
@@ -26,38 +26,32 @@ import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.client.AsyncConnection;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.io.Closeables;
 import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
 
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestClientTokenUtil {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestClientTokenUtil.class);
-
   private URLClassLoader cl;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     URL urlPU = ProtobufUtil.class.getProtectionDomain().getCodeSource().getLocation();
     URL urlCTU = ClientTokenUtil.class.getProtectionDomain().getCodeSource().getLocation();
     cl = new URLClassLoader(new URL[] { urlPU, urlCTU }, getClass().getClassLoader());
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close(cl, true);
   }
@@ -96,6 +90,6 @@ public class TestClientTokenUtil {
     }
     Boolean loaded = (Boolean) cl.loadClass(ProtobufUtil.class.getCanonicalName())
       .getDeclaredMethod("isClassLoaderLoaded").invoke(null);
-    assertFalse("Should not have loaded DynamicClassLoader", loaded);
+    assertFalse(loaded, "Should not have loaded DynamicClassLoader");
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
index 57d7a7a0386..6326bf7fd77 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/shaded/protobuf/TestProtobufUtil.java
@@ -17,9 +17,9 @@
  */
 package org.apache.hadoop.hbase.shaded.protobuf;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.lang.reflect.Method;
@@ -34,7 +34,6 @@ import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.ExtendedCell;
 import org.apache.hadoop.hbase.ExtendedCellBuilder;
 import org.apache.hadoop.hbase.ExtendedCellBuilderFactory;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.PrivateCellUtil;
@@ -48,9 +47,7 @@ import org.apache.hadoop.hbase.client.SlowLogParams;
 import org.apache.hadoop.hbase.io.TimeRange;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Test;
 
 import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
 import org.apache.hbase.thirdparty.com.google.protobuf.Any;
@@ -73,11 +70,9 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos;
 
-@Category(SmallTests.class)
+@org.junit.jupiter.api.Tag(SmallTests.TAG)
 public class TestProtobufUtil {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestProtobufUtil.class);
+
   private static final String TAG_STR = "tag-1";
   private static final byte TAG_TYPE = (byte) 10;
   private static final HBaseProtos.ServerName SERVER_NAME =
@@ -504,7 +499,7 @@ public class TestProtobufUtil {
   }
 
   /**
-   * Test {@link ProtobufUtil#toCell(Cell, boolean)} and
+   * Test {@link ProtobufUtil#toCell(ExtendedCell, boolean)} and
    * {@link ProtobufUtil#toCell(ExtendedCellBuilder, CellProtos.Cell, boolean)} conversion methods
    * when it contains tags and encode/decode tags is set to true.
    */
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/BuilderStyleTest.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/BuilderStyleTest.java
index cae296b4d0e..05c0e690eef 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/BuilderStyleTest.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/BuilderStyleTest.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hbase.util;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -84,7 +84,7 @@ public final class BuilderStyleTest {
         String errorMsg = "All setXXX()|addXX() methods in " + clazz.getSimpleName()
           + " should return a " + clazz.getSimpleName() + " object in builder style. "
           + "Offending method:" + e.getValue().iterator().next().getName();
-        assertTrue(errorMsg, found);
+        assertTrue(found, errorMsg);
       }
     }
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/PoolMapTestBase.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/PoolMapTestBase.java
index fbf92f64139..dea2c7077b2 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/PoolMapTestBase.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/PoolMapTestBase.java
@@ -18,7 +18,7 @@
 package org.apache.hadoop.hbase.util;
 
 import org.apache.hadoop.hbase.util.PoolMap.PoolType;
-import org.junit.Before;
+import org.junit.jupiter.api.BeforeEach;
 
 public abstract class PoolMapTestBase {
 
@@ -27,7 +27,7 @@ public abstract class PoolMapTestBase {
   protected static final int KEY_COUNT = 5;
   protected static final int POOL_SIZE = 3;
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     this.poolMap = new PoolMap<>(getPoolType(), POOL_SIZE);
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRotateFile.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRotateFile.java
index c229290e8e5..1706ef7dcb3 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRotateFile.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRotateFile.java
@@ -19,37 +19,31 @@ package org.apache.hadoop.hbase.util;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.IOException;
 import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.FSDataOutputStream;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseCommonTestingUtil;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
 
 import org.apache.hbase.thirdparty.com.google.common.io.ByteStreams;
 
-@Category({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRotateFile {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRotateFile.class);
-
   private static HBaseCommonTestingUtil UTIL = new HBaseCommonTestingUtil();
 
   private static FileSystem FS;
@@ -58,26 +52,24 @@ public class TestRotateFile {
 
   private RotateFile rotateFile;
 
-  @Rule
-  public final TestName name = new TestName();
-
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() throws IOException {
     FS = FileSystem.get(UTIL.getConfiguration());
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownAfterClass() {
     UTIL.cleanupTestDir();
   }
 
-  @Before
-  public void setUp() throws IOException {
-    dir = UTIL.getDataTestDir(name.getMethodName());
+  @BeforeEach
+  public void setUp(TestInfo testInfo) throws IOException {
+    String methodName = testInfo.getTestMethod().get().getName();
+    dir = UTIL.getDataTestDir(methodName);
     if (!FS.mkdirs(dir)) {
       throw new IOException("Can not create dir " + dir);
     }
-    rotateFile = new RotateFile(FS, dir, name.getMethodName(), 1024);
+    rotateFile = new RotateFile(FS, dir, methodName, 1024);
     assertNull(rotateFile.read());
   }
 
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRoundRobinPoolMap.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRoundRobinPoolMap.java
index 04ba2570eac..87e861dbea5 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRoundRobinPoolMap.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestRoundRobinPoolMap.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -29,21 +29,16 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.PoolMap.PoolType;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestRoundRobinPoolMap extends PoolMapTestBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRoundRobinPoolMap.class);
-
   @Override
   protected PoolType getPoolType() {
     return PoolType.RoundRobin;
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestThreadLocalPoolMap.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestThreadLocalPoolMap.java
index d83944ef7f3..2b5cb36072a 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestThreadLocalPoolMap.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/util/TestThreadLocalPoolMap.java
@@ -17,28 +17,23 @@
  */
 package org.apache.hadoop.hbase.util;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.PoolMap.PoolType;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestThreadLocalPoolMap extends PoolMapTestBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestThreadLocalPoolMap.class);
-
   @Override
   protected PoolType getPoolType() {
     return PoolType.ThreadLocal;
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZNodePaths.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZNodePaths.java
index c6d61ca4457..7ea8c2ebc29 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZNodePaths.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZNodePaths.java
@@ -17,24 +17,19 @@
  */
 package org.apache.hadoop.hbase.zookeeper;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.testclassification.ZKTests;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Category({ ZKTests.class, SmallTests.class })
+@Tag(ZKTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestZNodePaths {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestZNodePaths.class);
-
   @Test
   public void testIsClientReadable() {
     ZNodePaths znodePaths = new ZNodePaths(HBaseConfiguration.create());