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/28 09:09:33 UTC

(hbase) branch branch-2.6 updated: HBASE-29910 Upgrade hbase-client to use junit5 (#7791)

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

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


The following commit(s) were added to refs/heads/branch-2.6 by this push:
     new 00b1c2f7e9f HBASE-29910 Upgrade hbase-client to use junit5 (#7791)
00b1c2f7e9f is described below

commit 00b1c2f7e9f163d997ea84a96e07345f40e9eb11
Author: Liu Xiao <42...@users.noreply.github.com>
AuthorDate: Sat Feb 28 17:09:29 2026 +0800

    HBASE-29910 Upgrade hbase-client to use junit5 (#7791)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
---
 hbase-client/pom.xml                               |   7 +-
 .../apache/hadoop/hbase/TestHColumnDescriptor.java |  43 ++--
 .../apache/hadoop/hbase/TestHTableDescriptor.java  |  70 +++---
 .../apache/hadoop/hbase/TestRegionLocations.java   |  22 +-
 .../hbase/client/RpcRetryingCallerImplTest.java    |  22 +-
 .../hbase/client/TestAsyncAdminRpcPriority.java    |  38 ++-
 .../client/TestAsyncBatchRpcRetryingCaller.java    |  23 +-
 .../client/TestAsyncConnectionConfiguration.java   |  17 +-
 .../hbase/client/TestAsyncConnectionTracing.java   |  31 ++-
 .../client/TestAsyncMetaRegionLocatorFailFast.java |  24 +-
 .../hadoop/hbase/client/TestAsyncProcess.java      | 246 ++++++++++----------
 .../TestAsyncProcessWithRegionException.java       |  23 +-
 .../client/TestAsyncRegionLocatorTracing.java      |  29 +--
 .../hbase/client/TestAsyncTableRpcPriority.java    | 148 ++++++------
 .../hadoop/hbase/client/TestAsyncTableTracing.java |  31 ++-
 .../apache/hadoop/hbase/client/TestAttributes.java | 131 +++++------
 .../hadoop/hbase/client/TestBufferedMutator.java   |  25 +-
 .../hbase/client/TestBufferedMutatorParams.java    |  30 +--
 .../hbase/client/TestClientExponentialBackoff.java |  38 ++-
 .../hadoop/hbase/client/TestClientNoCluster.java   |  25 +-
 .../hadoop/hbase/client/TestClientScanner.java     |  76 +++---
 .../client/TestColumnFamilyDescriptorBuilder.java  |  44 ++--
 .../TestColumnFamilyDescriptorLowerCaseEnum.java   |  19 +-
 .../hbase/client/TestConnectionConfiguration.java  |  17 +-
 .../hbase/client/TestConnectionFactoryTracing.java |  21 +-
 .../TestConnectionImplementationTracing.java       |  21 +-
 .../hbase/client/TestConnectionRegistryLeak.java   |  23 +-
 .../hbase/client/TestCoprocessorDescriptor.java    |  30 +--
 .../hadoop/hbase/client/TestDelayingRunner.java    |  20 +-
 .../hadoop/hbase/client/TestDeleteTimeStamp.java   |  18 +-
 .../org/apache/hadoop/hbase/client/TestGet.java    |  85 ++++---
 .../client/TestHTableMultiplexerViaMocks.java      |  16 +-
 .../hadoop/hbase/client/TestHTableTracing.java     |  20 +-
 .../client/TestImmutableHColumnDescriptor.java     |  26 +--
 .../hbase/client/TestImmutableHRegionInfo.java     |  27 +--
 .../client/TestImmutableHTableDescriptor.java      |  32 +--
 .../hadoop/hbase/client/TestImmutableScan.java     |  17 +-
 .../apache/hadoop/hbase/client/TestIncrement.java  |  15 +-
 .../hadoop/hbase/client/TestInterfaceAlign.java    |  19 +-
 .../hadoop/hbase/client/TestMetricsConnection.java | 123 +++++-----
 .../apache/hadoop/hbase/client/TestMutation.java   |  33 ++-
 .../hadoop/hbase/client/TestOnlineLogRecord.java   |  28 ++-
 .../apache/hadoop/hbase/client/TestOperation.java  | 254 ++++++++++-----------
 .../hadoop/hbase/client/TestProcedureFuture.java   |  49 ++--
 .../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 +++--
 .../hbase/client/TestRegionLocatorTracing.java     |  20 +-
 .../client/TestRegistryEndpointsRefresher.java     |  31 ++-
 .../hadoop/hbase/client/TestResultStatsUtil.java   |  16 +-
 .../TestRetriesExhaustedWithDetailsException.java  |  24 +-
 .../hbase/client/TestReversedScannerCallable.java  |  34 ++-
 .../hadoop/hbase/client/TestRowComparator.java     |  19 +-
 .../client/TestRpcBasedRegistryHedgedReads.java    |  29 +--
 .../hbase/client/TestRpcRetryingCallerImpl.java    |  19 +-
 .../org/apache/hadoop/hbase/client/TestScan.java   |  84 ++++---
 .../hadoop/hbase/client/TestScannerCallable.java   |  33 ++-
 .../hbase/client/TestSimpleRequestController.java  |  24 +-
 .../hbase/client/TestTableDescriptorBuilder.java   | 119 +++++-----
 .../hbase/client/TestTableDescriptorUtils.java     |  13 +-
 .../hbase/client/TestTableEnableDisableError.java  |  25 +-
 .../hadoop/hbase/client/TestTableRpcPriority.java  |  55 ++---
 .../hadoop/hbase/client/TestTracingBase.java       |  16 +-
 .../TestHBaseServerExceptionPauseManager.java      |  19 +-
 .../hbase/exceptions/TestClientExceptionsUtil.java |  14 +-
 .../hadoop/hbase/filter/TestComparators.java       |  19 +-
 .../hadoop/hbase/filter/TestKeyOnlyFilter.java     |  41 ++--
 .../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 +-
 .../hadoop/hbase/security/TestEncryptionUtil.java  |  49 ++--
 .../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    |  17 +-
 .../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 +-
 96 files changed, 1561 insertions(+), 2032 deletions(-)

diff --git a/hbase-client/pom.xml b/hbase-client/pom.xml
index 54a3b2baed0..d369584a76d 100644
--- a/hbase-client/pom.xml
+++ b/hbase-client/pom.xml
@@ -187,14 +187,9 @@
       <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>
+      <artifactId>mockito-junit-jupiter</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java
index fc05d9eec52..3687f20e826 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java
@@ -17,8 +17,9 @@
  */
 package org.apache.hadoop.hbase;
 
-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.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
 import org.apache.hadoop.hbase.exceptions.HBaseException;
@@ -31,29 +32,19 @@ 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.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;
 
 /**
  * Tests the HColumnDescriptor with appropriate arguments.
  * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0 together with
  *             {@link HColumnDescriptor}.
  */
-@Category({ MiscTests.class, SmallTests.class })
 @Deprecated
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestHColumnDescriptor {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHColumnDescriptor.class);
-
-  @Rule
-  public ExpectedException expectedEx = ExpectedException.none();
-
   @Test
   public void testPb() throws DeserializationException {
     HColumnDescriptor hcd = new HColumnDescriptor(new HColumnDescriptor(HConstants.CATALOG_FAMILY)
@@ -104,9 +95,9 @@ public class TestHColumnDescriptor {
    */
   @Test
   public void testHColumnDescriptorShouldThrowIAEWhenFamilyNameEmpty() throws Exception {
-    expectedEx.expect(IllegalArgumentException.class);
-    expectedEx.expectMessage("Column Family name can not be empty");
-    new HColumnDescriptor(Bytes.toBytes(""));
+    IllegalArgumentException exception =
+      assertThrows(IllegalArgumentException.class, () -> new HColumnDescriptor(""));
+    assertEquals("Column Family name can not be empty", exception.getMessage());
   }
 
   /**
@@ -160,30 +151,30 @@ public class TestHColumnDescriptor {
 
     ttl = "50000";
     desc.setTimeToLive(ttl);
-    Assert.assertEquals(50000, desc.getTimeToLive());
+    assertEquals(50000, desc.getTimeToLive());
 
     ttl = "50000 seconds";
     desc.setTimeToLive(ttl);
-    Assert.assertEquals(50000, desc.getTimeToLive());
+    assertEquals(50000, desc.getTimeToLive());
 
     ttl = "";
     desc.setTimeToLive(ttl);
-    Assert.assertEquals(0, desc.getTimeToLive());
+    assertEquals(0, desc.getTimeToLive());
 
     ttl = "FOREVER";
     desc.setTimeToLive(ttl);
-    Assert.assertEquals(HConstants.FOREVER, desc.getTimeToLive());
+    assertEquals(HConstants.FOREVER, desc.getTimeToLive());
 
     ttl = "1 HOUR 10 minutes 1 second";
     desc.setTimeToLive(ttl);
-    Assert.assertEquals(4201, desc.getTimeToLive());
+    assertEquals(4201, desc.getTimeToLive());
 
     ttl = "500 Days 23 HOURS";
     desc.setTimeToLive(ttl);
-    Assert.assertEquals(43282800, desc.getTimeToLive());
+    assertEquals(43282800, desc.getTimeToLive());
 
     ttl = "43282800 SECONDS (500 Days 23 hours)";
     desc.setTimeToLive(ttl);
-    Assert.assertEquals(43282800, desc.getTimeToLive());
+    assertEquals(43282800, desc.getTimeToLive());
   }
 }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java
index cdf043dad76..27db8d0144c 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java
@@ -17,10 +17,11 @@
  */
 package org.apache.hadoop.hbase;
 
-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.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.Arrays;
@@ -31,11 +32,10 @@ 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.BeforeEach;
+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;
 
@@ -44,25 +44,26 @@ import org.slf4j.LoggerFactory;
  * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0 together with
  *             {@link HTableDescriptor}.
  */
-@Category({ MiscTests.class, SmallTests.class })
 @Deprecated
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestHTableDescriptor {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHTableDescriptor.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestHTableDescriptor.class);
 
-  @Rule
-  public TestName name = new TestName();
+  private String methodName;
+
+  @BeforeEach
+  public void setUpBeforeEach(TestInfo testInfo) {
+    methodName = testInfo.getTestMethod().get().getName();
+  }
 
-  @Test(expected = IOException.class)
+  @Test
   public void testAddCoprocessorTwice() throws IOException {
     HTableDescriptor htd = new HTableDescriptor(TableName.META_TABLE_NAME);
     String cpName = "a.b.c.d";
     htd.addCoprocessor(cpName);
-    htd.addCoprocessor(cpName);
+    assertThrows(IOException.class, () -> htd.addCoprocessor(cpName));
   }
 
   @Test
@@ -120,7 +121,7 @@ public class TestHTableDescriptor {
    */
   @Test
   public void testGetSetRemoveCP() throws Exception {
-    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(methodName));
     // simple CP
     String className = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
     // add and check that it is present
@@ -137,7 +138,7 @@ public class TestHTableDescriptor {
    */
   @Test
   public void testSetListRemoveCP() throws Exception {
-    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(methodName));
     // simple CP
     String className1 = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
     String className2 = "org.apache.hadoop.hbase.coprocessor.SampleRegionWALObserver";
@@ -173,7 +174,7 @@ public class TestHTableDescriptor {
    */
   @Test
   public void testAddGetRemoveString() {
-    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(methodName));
     String key = "Some";
     String value = "value";
     desc.setValue(key, value);
@@ -234,8 +235,8 @@ public class TestHTableDescriptor {
   public void testLegalHTableNamesRegex() {
     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 + "'");
     }
   }
 
@@ -252,7 +253,7 @@ public class TestHTableDescriptor {
    */
   @Test
   public void testGetMaxFileSize() {
-    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(methodName));
     assertEquals(-1, desc.getMaxFileSize());
     desc.setMaxFileSize(1111L);
     assertEquals(1111L, desc.getMaxFileSize());
@@ -263,7 +264,7 @@ public class TestHTableDescriptor {
    */
   @Test
   public void testGetMemStoreFlushSize() {
-    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(methodName));
     assertEquals(-1, desc.getMemStoreFlushSize());
     desc.setMemStoreFlushSize(1111L);
     assertEquals(1111L, desc.getMemStoreFlushSize());
@@ -274,7 +275,7 @@ public class TestHTableDescriptor {
    */
   @Test
   public void testAddGetRemoveConfiguration() throws Exception {
-    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(methodName));
     String key = "Some";
     String value = "value";
     desc.setConfiguration(key, value);
@@ -297,7 +298,7 @@ public class TestHTableDescriptor {
 
   @Test
   public void testModifyFamily() {
-    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(methodName));
     byte[] familyName = Bytes.toBytes("cf");
     HColumnDescriptor hcd = new HColumnDescriptor(familyName);
     hcd.setBlocksize(1000);
@@ -313,17 +314,17 @@ public class TestHTableDescriptor {
     assertEquals(1, htd.getFamily(familyName).getDFSReplication());
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testModifyInexistentFamily() {
-    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(methodName));
     byte[] familyName = Bytes.toBytes("cf");
     HColumnDescriptor hcd = new HColumnDescriptor(familyName);
-    htd.modifyFamily(hcd);
+    assertThrows(IllegalArgumentException.class, () -> htd.modifyFamily(hcd));
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testAddDuplicateFamilies() {
-    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(methodName));
     byte[] familyName = Bytes.toBytes("cf");
     HColumnDescriptor hcd = new HColumnDescriptor(familyName);
     hcd.setBlocksize(1000);
@@ -331,12 +332,13 @@ public class TestHTableDescriptor {
     assertEquals(1000, htd.getFamily(familyName).getBlocksize());
     hcd = new HColumnDescriptor(familyName);
     hcd.setBlocksize(2000);
-    htd.addFamily(hcd);
+    HColumnDescriptor finalHcd = hcd;
+    assertThrows(IllegalArgumentException.class, () -> htd.addFamily(finalHcd));
   }
 
   @Test
   public void testPriority() {
-    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(methodName));
     htd.setPriority(42);
     assertEquals(42, htd.getPriority());
   }
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 d87f3b3cb04..a53673f4ba5 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,25 +17,21 @@
  */
 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.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/RpcRetryingCallerImplTest.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/RpcRetryingCallerImplTest.java
index 965259983e6..4f4d3f4ffa4 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/RpcRetryingCallerImplTest.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/RpcRetryingCallerImplTest.java
@@ -17,26 +17,22 @@
  */
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.hadoop.hbase.CallDroppedException;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.ipc.RemoteWithExtrasException;
-import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
-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.protobuf.ServiceException;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(SmallTests.TAG)
+@Tag(SmallTests.TAG)
 public class RpcRetryingCallerImplTest {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(RpcRetryingCallerImplTest.class);
-
   @Test
   public void itTranslatesRemoteExceptionFromServiceException() throws DoNotRetryIOException {
     String message = "CDE for test";
@@ -44,7 +40,7 @@ public class RpcRetryingCallerImplTest {
       new RemoteWithExtrasException(CallDroppedException.class.getName(), message, false));
 
     Throwable result = RpcRetryingCallerImpl.translateException(exception);
-    Assert.assertTrue("Expect unwrap CallDroppedException", result instanceof CallDroppedException);
-    Assert.assertEquals(message, result.getMessage());
+    assertTrue(result instanceof CallDroppedException, "Expect unwrap CallDroppedException");
+    assertEquals(message, result.getMessage());
   }
 }
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 4475a29123a..0002ce8ed4f 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>() {
@@ -171,10 +165,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());
   }
@@ -184,9 +176,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 f4c9fc059bd..5fb354a850c 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.
  */
-@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 2292c0d09e5..a73c349fd1b 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;
@@ -35,22 +34,18 @@ 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.trace.HBaseSemanticAttributes;
-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 =
@@ -58,10 +53,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) {
@@ -74,7 +69,7 @@ public class TestAsyncConnectionTracing {
     conn = new AsyncConnectionImpl(CONF, registry, "test", 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/TestAsyncProcess.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcess.java
index 245c802845a..3b013f6bbc6 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcess.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcess.java
@@ -17,9 +17,12 @@
  */
 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.assertArrayEquals;
+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.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.io.InterruptedIOException;
@@ -51,7 +54,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.CallDroppedException;
 import org.apache.hadoop.hbase.CallQueueTooBigException;
 import org.apache.hadoop.hbase.Cell;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseIOException;
 import org.apache.hadoop.hbase.HBaseServerException;
 import org.apache.hadoop.hbase.HConstants;
@@ -74,24 +76,19 @@ import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.Threads;
-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;
 import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;
 
-@Category({ ClientTests.class, LargeTests.class })
+@Tag(ClientTests.TAG)
+@Tag(LargeTests.TAG)
 public class TestAsyncProcess {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncProcess.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestAsyncProcess.class);
   private static final TableName DUMMY_TABLE = TableName.valueOf("DUMMY_TABLE");
   private static final byte[] DUMMY_BYTES_1 = Bytes.toBytes("DUMMY_BYTES_1");
@@ -132,7 +129,7 @@ public class TestAsyncProcess {
   private int RPC_TIMEOUT;
   private int OPERATION_TIMEOUT;
 
-  @Before
+  @BeforeEach
   public void beforeEach() {
     this.CONF = new Configuration();
     CONF.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, NB_RETRIES);
@@ -771,7 +768,7 @@ public class TestAsyncProcess {
     puts.add(createPut(1, true));
 
     ap.submit(null, DUMMY_TABLE, puts, false, null, false);
-    Assert.assertTrue(puts.isEmpty());
+    assertTrue(puts.isEmpty());
   }
 
   @Test
@@ -790,9 +787,9 @@ public class TestAsyncProcess {
     puts.add(createPut(1, true));
 
     final AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, cb, false);
-    Assert.assertTrue(puts.isEmpty());
+    assertTrue(puts.isEmpty());
     ars.waitUntilDone();
-    Assert.assertEquals(1, updateCalled.get());
+    assertEquals(1, updateCalled.get());
   }
 
   @Test
@@ -811,11 +808,11 @@ public class TestAsyncProcess {
       ap.incTaskCounters(Collections.singleton(hri1.getRegionName()), sn);
     }
     ap.submit(null, DUMMY_TABLE, puts, false, null, false);
-    Assert.assertEquals(puts.size(), 1);
+    assertEquals(puts.size(), 1);
 
     ap.decTaskCounters(Collections.singleton(hri1.getRegionName()), sn);
     ap.submit(null, DUMMY_TABLE, puts, false, null, false);
-    Assert.assertEquals(0, puts.size());
+    assertEquals(0, puts.size());
     if (defaultClazz != null) {
       conn.getConfiguration().set(RequestControllerFactory.REQUEST_CONTROLLER_IMPL_CONF_KEY,
         defaultClazz);
@@ -841,12 +838,12 @@ public class TestAsyncProcess {
     puts.add(createPut(2, true)); // <== new region, but the rs is ok
 
     ap.submit(null, DUMMY_TABLE, puts, false, null, false);
-    Assert.assertEquals(" puts=" + puts, 1, puts.size());
+    assertEquals(1, puts.size(), " puts=" + puts);
 
     controller.taskCounterPerServer.put(sn2,
       new AtomicInteger(controller.maxConcurrentTasksPerServer - 1));
     ap.submit(null, DUMMY_TABLE, puts, false, null, false);
-    Assert.assertTrue(puts.isEmpty());
+    assertTrue(puts.isEmpty());
     if (defaultClazz != null) {
       conn.getConfiguration().set(RequestControllerFactory.REQUEST_CONTROLLER_IMPL_CONF_KEY,
         defaultClazz);
@@ -862,20 +859,20 @@ public class TestAsyncProcess {
     puts.add(p);
 
     AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true);
-    Assert.assertEquals(0, puts.size());
+    assertEquals(0, puts.size());
     ars.waitUntilDone();
     verifyResult(ars, false);
-    Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get());
+    assertEquals(NB_RETRIES + 1, ap.callsCt.get());
 
-    Assert.assertEquals(1, ars.getErrors().exceptions.size());
-    Assert.assertTrue("was: " + ars.getErrors().exceptions.get(0),
-      failure.equals(ars.getErrors().exceptions.get(0)));
-    Assert.assertTrue("was: " + ars.getErrors().exceptions.get(0),
-      failure.equals(ars.getErrors().exceptions.get(0)));
+    assertEquals(1, ars.getErrors().exceptions.size());
+    assertTrue(failure.equals(ars.getErrors().exceptions.get(0)),
+      "was: " + ars.getErrors().exceptions.get(0));
+    assertTrue(failure.equals(ars.getErrors().exceptions.get(0)),
+      "was: " + ars.getErrors().exceptions.get(0));
 
-    Assert.assertEquals(1, ars.getFailedOperations().size());
-    Assert.assertTrue("was: " + ars.getFailedOperations().get(0),
-      p.equals(ars.getFailedOperations().get(0)));
+    assertEquals(1, ars.getFailedOperations().size());
+    assertTrue(p.equals(ars.getFailedOperations().get(0)),
+      "was: " + ars.getFailedOperations().get(0));
   }
 
   @Test
@@ -898,7 +895,7 @@ public class TestAsyncProcess {
       @Override
       public void run() {
         Threads.sleep(1000);
-        Assert.assertFalse(checkPoint.get()); // TODO: this is timing-dependent
+        assertFalse(checkPoint.get()); // TODO: this is timing-dependent
         ai.decrementAndGet();
         controller.tasksInProgress.decrementAndGet();
         checkPoint2.set(true);
@@ -910,12 +907,12 @@ public class TestAsyncProcess {
     puts.add(p);
 
     ap.submit(null, DUMMY_TABLE, puts, false, null, false);
-    Assert.assertFalse(puts.isEmpty());
+    assertFalse(puts.isEmpty());
 
     t.start();
 
     ap.submit(null, DUMMY_TABLE, puts, true, null, false);
-    Assert.assertTrue(puts.isEmpty());
+    assertTrue(puts.isEmpty());
 
     checkPoint.set(true);
     while (!checkPoint2.get()) {
@@ -937,20 +934,20 @@ public class TestAsyncProcess {
     puts.add(createPut(1, true));
 
     AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true);
-    Assert.assertTrue(puts.isEmpty());
+    assertTrue(puts.isEmpty());
     ars.waitUntilDone();
     verifyResult(ars, false, true, true);
-    Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get());
+    assertEquals(NB_RETRIES + 1, ap.callsCt.get());
     ap.callsCt.set(0);
-    Assert.assertEquals(1, ars.getErrors().actions.size());
+    assertEquals(1, ars.getErrors().actions.size());
 
     puts.add(createPut(1, true));
     // Wait for AP to be free. While ars might have the result, ap counters are decreased later.
     ap.waitForMaximumCurrentTasks(0, null);
     ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true);
-    Assert.assertEquals(0, puts.size());
+    assertEquals(0, puts.size());
     ars.waitUntilDone();
-    Assert.assertEquals(1, ap.callsCt.get());
+    assertEquals(1, ap.callsCt.get());
     verifyResult(ars, true);
   }
 
@@ -966,9 +963,9 @@ public class TestAsyncProcess {
     AsyncRequestFuture ars = ap.submit(null, DUMMY_TABLE, puts, false, null, true);
     ars.waitUntilDone();
     verifyResult(ars, false, true, true);
-    Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get());
+    assertEquals(NB_RETRIES + 1, ap.callsCt.get());
 
-    Assert.assertEquals(1, ars.getFailedOperations().size());
+    assertEquals(1, ars.getFailedOperations().size());
   }
 
   @Test
@@ -1052,7 +1049,7 @@ public class TestAsyncProcess {
 
     try {
       ap.submit(null, DUMMY_TABLE, puts, false, null, false);
-      Assert.fail("We should have been interrupted.");
+      fail("We should have been interrupted.");
     } catch (InterruptedIOException expected) {
     }
 
@@ -1074,7 +1071,7 @@ public class TestAsyncProcess {
     long end = EnvironmentEdgeManager.currentTime();
 
     // Adds 100 to secure us against approximate timing.
-    Assert.assertTrue(start + 100L + sleepTime > end);
+    assertTrue(start + 100L + sleepTime > end);
     if (defaultClazz != null) {
       conn.getConfiguration().set(RequestControllerFactory.REQUEST_CONTROLLER_IMPL_CONF_KEY,
         defaultClazz);
@@ -1148,12 +1145,11 @@ public class TestAsyncProcess {
 
     Put put = createPut(1, true);
 
-    Assert.assertEquals(conn.getConnectionConfiguration().getWriteBufferSize(),
-      ht.getWriteBufferSize());
-    Assert.assertEquals(0, ht.getCurrentWriteBufferSize());
+    assertEquals(conn.getConnectionConfiguration().getWriteBufferSize(), ht.getWriteBufferSize());
+    assertEquals(0, ht.getCurrentWriteBufferSize());
     ht.mutate(put);
     ht.flush();
-    Assert.assertEquals(0, ht.getCurrentWriteBufferSize());
+    assertEquals(0, ht.getCurrentWriteBufferSize());
   }
 
   @Test
@@ -1177,20 +1173,20 @@ public class TestAsyncProcess {
     // The BufferedMutatorParams does nothing with the value
     bufferParam.setWriteBufferPeriodicFlushTimeoutMs(setTO);
     bufferParam.setWriteBufferPeriodicFlushTimerTickMs(setTT);
-    Assert.assertEquals(setTO, bufferParam.getWriteBufferPeriodicFlushTimeoutMs());
-    Assert.assertEquals(setTT, bufferParam.getWriteBufferPeriodicFlushTimerTickMs());
+    assertEquals(setTO, bufferParam.getWriteBufferPeriodicFlushTimeoutMs());
+    assertEquals(setTT, bufferParam.getWriteBufferPeriodicFlushTimerTickMs());
 
     // The BufferedMutatorImpl corrects illegal values (indirect via BufferedMutatorParams)
     BufferedMutatorImpl ht1 = new BufferedMutatorImpl(conn, bufferParam, ap);
-    Assert.assertEquals(expectTO, ht1.getWriteBufferPeriodicFlushTimeoutMs());
-    Assert.assertEquals(expectTT, ht1.getWriteBufferPeriodicFlushTimerTickMs());
+    assertEquals(expectTO, ht1.getWriteBufferPeriodicFlushTimeoutMs());
+    assertEquals(expectTT, ht1.getWriteBufferPeriodicFlushTimerTickMs());
 
     // The BufferedMutatorImpl corrects illegal values (direct via setter)
     BufferedMutatorImpl ht2 =
       new BufferedMutatorImpl(conn, createBufferedMutatorParams(ap, DUMMY_TABLE), ap);
     ht2.setWriteBufferPeriodicFlush(setTO, setTT);
-    Assert.assertEquals(expectTO, ht2.getWriteBufferPeriodicFlushTimeoutMs());
-    Assert.assertEquals(expectTT, ht2.getWriteBufferPeriodicFlushTimerTickMs());
+    assertEquals(expectTO, ht2.getWriteBufferPeriodicFlushTimeoutMs());
+    assertEquals(expectTT, ht2.getWriteBufferPeriodicFlushTimerTickMs());
 
   }
 
@@ -1207,57 +1203,57 @@ public class TestAsyncProcess {
     BufferedMutatorImpl ht = new BufferedMutatorImpl(conn, bufferParam, ap);
 
     // Verify if BufferedMutator has the right settings.
-    Assert.assertEquals(10000, ht.getWriteBufferSize());
-    Assert.assertEquals(1, ht.getWriteBufferPeriodicFlushTimeoutMs());
-    Assert.assertEquals(BufferedMutator.MIN_WRITE_BUFFER_PERIODIC_FLUSH_TIMERTICK_MS,
+    assertEquals(10000, ht.getWriteBufferSize());
+    assertEquals(1, ht.getWriteBufferPeriodicFlushTimeoutMs());
+    assertEquals(BufferedMutator.MIN_WRITE_BUFFER_PERIODIC_FLUSH_TIMERTICK_MS,
       ht.getWriteBufferPeriodicFlushTimerTickMs());
 
     Put put = createPut(1, true);
 
-    Assert.assertEquals(0, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertEquals(0, ht.getCurrentWriteBufferSize());
+    assertEquals(0, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertEquals(0, ht.getCurrentWriteBufferSize());
 
     // ----- Insert, flush immediately, MUST NOT flush automatically
     ht.mutate(put);
     ht.flush();
 
     Thread.sleep(1000);
-    Assert.assertEquals(0, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertEquals(0, ht.getCurrentWriteBufferSize());
+    assertEquals(0, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertEquals(0, ht.getCurrentWriteBufferSize());
 
     // ----- Insert, NO flush, MUST flush automatically
     ht.mutate(put);
-    Assert.assertEquals(0, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertTrue(ht.getCurrentWriteBufferSize() > 0);
+    assertEquals(0, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertTrue(ht.getCurrentWriteBufferSize() > 0);
 
     // The timerTick should fire every 100ms, so after twice that we must have
     // seen at least 1 tick and we should see an automatic flush
     Thread.sleep(200);
-    Assert.assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertEquals(0, ht.getCurrentWriteBufferSize());
+    assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertEquals(0, ht.getCurrentWriteBufferSize());
 
     // Ensure it does not flush twice
     Thread.sleep(200);
-    Assert.assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertEquals(0, ht.getCurrentWriteBufferSize());
+    assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertEquals(0, ht.getCurrentWriteBufferSize());
 
     // ----- DISABLE AUTO FLUSH, Insert, NO flush, MUST NOT flush automatically
     ht.disableWriteBufferPeriodicFlush();
     ht.mutate(put);
-    Assert.assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertTrue(ht.getCurrentWriteBufferSize() > 0);
+    assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertTrue(ht.getCurrentWriteBufferSize() > 0);
 
     // Wait for at least 1 timerTick, we should see NO flushes.
     Thread.sleep(200);
-    Assert.assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertTrue(ht.getCurrentWriteBufferSize() > 0);
+    assertEquals(1, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertTrue(ht.getCurrentWriteBufferSize() > 0);
 
     // Reenable periodic flushing, a flush seems to take about 1 second
     // so we wait for 2 seconds and it should have finished the flush.
     ht.setWriteBufferPeriodicFlush(1, 100);
     Thread.sleep(2000);
-    Assert.assertEquals(2, ht.getExecutedWriteBufferPeriodicFlushes());
-    Assert.assertEquals(0, ht.getCurrentWriteBufferSize());
+    assertEquals(2, ht.getExecutedWriteBufferPeriodicFlushes());
+    assertEquals(0, ht.getCurrentWriteBufferSize());
   }
 
   @Test
@@ -1282,18 +1278,18 @@ public class TestAsyncProcess {
     Put p = createPut(1, false);
     try {
       mutator.mutate(p);
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedWithDetailsException expected) {
       assertEquals(1, expected.getNumExceptions());
       assertTrue(expected.getRow(0) == p);
     }
     // Let's do all the retries.
     ap.waitForMaximumCurrentTasks(0, null);
-    Assert.assertEquals(0, mutator.size());
+    assertEquals(0, mutator.size());
 
     // There is no global error so the new put should not fail
     mutator.mutate(createPut(1, true));
-    Assert.assertEquals("the put should not been inserted.", 0, mutator.size());
+    assertEquals(0, mutator.size(), "the put should not been inserted.");
   }
 
   @SuppressWarnings("SelfComparison")
@@ -1334,17 +1330,17 @@ public class TestAsyncProcess {
     Object[] res = new Object[puts.size()];
     try {
       ht.batch(puts, res);
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedException expected) {
     }
 
-    Assert.assertEquals(success, res[0]);
-    Assert.assertEquals(success, res[1]);
-    Assert.assertEquals(success, res[2]);
-    Assert.assertEquals(success, res[3]);
-    Assert.assertEquals(failure, res[4]);
-    Assert.assertEquals(success, res[5]);
-    Assert.assertEquals(failure, res[6]);
+    assertEquals(success, res[0]);
+    assertEquals(success, res[1]);
+    assertEquals(success, res[2]);
+    assertEquals(success, res[3]);
+    assertEquals(failure, res[4]);
+    assertEquals(success, res[5]);
+    assertEquals(failure, res[6]);
   }
 
   @Test
@@ -1356,8 +1352,8 @@ public class TestAsyncProcess {
     BufferedMutatorImpl mutator = new BufferedMutatorImpl(conn, bufferParam, ap);
     configuration.setBoolean(ConnectionImplementation.RETRIES_BY_SERVER_KEY, true);
 
-    Assert.assertNotNull(ap.createServerErrorTracker());
-    Assert.assertTrue(ap.serverTrackerTimeout > 200L);
+    assertNotNull(ap.createServerErrorTracker());
+    assertTrue(ap.serverTrackerTimeout > 200L);
     ap.serverTrackerTimeout = 1L;
 
     Put p = createPut(1, false);
@@ -1365,13 +1361,13 @@ public class TestAsyncProcess {
 
     try {
       mutator.flush();
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedWithDetailsException expected) {
       assertEquals(1, expected.getNumExceptions());
       assertTrue(expected.getRow(0) == p);
     }
     // Checking that the ErrorsServers came into play and didn't make us stop immediately
-    Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get());
+    assertEquals(NB_RETRIES + 1, ap.callsCt.get());
   }
 
   @Test
@@ -1419,20 +1415,20 @@ public class TestAsyncProcess {
     BufferedMutatorParams bufferParam = createBufferedMutatorParams(ap, DUMMY_TABLE);
     BufferedMutatorImpl mutator = new BufferedMutatorImpl(conn, bufferParam, ap);
 
-    Assert.assertNotNull(ap.createServerErrorTracker());
+    assertNotNull(ap.createServerErrorTracker());
 
     Put p = createPut(1, true);
     mutator.mutate(p);
 
     try {
       mutator.flush();
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedWithDetailsException expected) {
       assertEquals(1, expected.getNumExceptions());
       assertTrue(expected.getRow(0) == p);
     }
     // Checking that the ErrorsServers came into play and didn't make us stop immediately
-    Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get());
+    assertEquals(NB_RETRIES + 1, ap.callsCt.get());
   }
 
   @Test
@@ -1442,19 +1438,19 @@ public class TestAsyncProcess {
       new AsyncProcessWithFailure(conn, CONF, new CallQueueTooBigException());
     BufferedMutatorParams bufferParam = createBufferedMutatorParams(ap, DUMMY_TABLE);
     BufferedMutatorImpl mutator = new BufferedMutatorImpl(conn, bufferParam, ap);
-    Assert.assertNotNull(ap.createServerErrorTracker());
+    assertNotNull(ap.createServerErrorTracker());
     Put p = createPut(1, true);
     mutator.mutate(p);
 
     try {
       mutator.flush();
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedWithDetailsException expected) {
       assertEquals(1, expected.getNumExceptions());
       assertTrue(expected.getRow(0) == p);
     }
     // Checking that the ErrorsServers came into play and didn't make us stop immediately
-    Assert.assertEquals(NB_RETRIES + 1, ap.callsCt.get());
+    assertEquals(NB_RETRIES + 1, ap.callsCt.get());
   }
 
   /**
@@ -1482,15 +1478,15 @@ public class TestAsyncProcess {
     ht.multiAp = ap;
     ht.batch(gets, null);
 
-    Assert.assertEquals(NB_REGS, ap.nbActions.get());
-    Assert.assertEquals("1 multi response per server", 2, ap.nbMultiResponse.get());
-    Assert.assertEquals("1 thread per server", 2, con.nbThreads.get());
+    assertEquals(NB_REGS, ap.nbActions.get());
+    assertEquals(2, ap.nbMultiResponse.get(), "1 multi response per server");
+    assertEquals(2, con.nbThreads.get(), "1 thread per server");
 
     int nbReg = 0;
     for (int i = 0; i < NB_REGS; i++) {
       if (con.usedRegions[i]) nbReg++;
     }
-    Assert.assertEquals("nbReg=" + nbReg, NB_REGS, nbReg);
+    assertEquals(NB_REGS, nbReg, "nbReg=" + nbReg);
   }
 
   @Test
@@ -1504,7 +1500,7 @@ public class TestAsyncProcess {
       .setRowAccess(rows).setResults(new Object[3]).setSubmittedRows(SubmittedRows.ALL).build();
     AsyncRequestFuture ars = ap.submit(task);
     verifyReplicaResult(ars, RR.TRUE, RR.TRUE, RR.FALSE);
-    Assert.assertEquals(2, ap.getReplicaCallCount());
+    assertEquals(2, ap.getReplicaCallCount());
   }
 
   @Test
@@ -1517,7 +1513,7 @@ public class TestAsyncProcess {
       .setRowAccess(rows).setResults(new Object[3]).setSubmittedRows(SubmittedRows.ALL).build();
     AsyncRequestFuture ars = ap.submit(task);
     verifyReplicaResult(ars, RR.FALSE, RR.FALSE, RR.FALSE);
-    Assert.assertEquals(0, ap.getReplicaCallCount());
+    assertEquals(0, ap.getReplicaCallCount());
   }
 
   @Test
@@ -1531,8 +1527,8 @@ public class TestAsyncProcess {
     AsyncRequestFuture ars = ap.submit(task);
     verifyReplicaResult(ars, RR.DONT_CARE, RR.DONT_CARE);
     long replicaCalls = ap.getReplicaCallCount();
-    Assert.assertTrue(replicaCalls >= 0);
-    Assert.assertTrue(replicaCalls <= 2);
+    assertTrue(replicaCalls >= 0);
+    assertTrue(replicaCalls <= 2);
   }
 
   @Test
@@ -1548,7 +1544,7 @@ public class TestAsyncProcess {
       .setRowAccess(rows).setResults(new Object[2]).setSubmittedRows(SubmittedRows.ALL).build();
     AsyncRequestFuture ars = ap.submit(task);
     verifyReplicaResult(ars, RR.FALSE, RR.TRUE);
-    Assert.assertEquals(1, ap.getReplicaCallCount());
+    assertEquals(1, ap.getReplicaCallCount());
   }
 
   @Test
@@ -1564,7 +1560,7 @@ public class TestAsyncProcess {
       .setRowAccess(rows).setResults(new Object[2]).setSubmittedRows(SubmittedRows.ALL).build();
     AsyncRequestFuture ars = ap.submit(task);
     verifyReplicaResult(ars, RR.FAILED, RR.FAILED);
-    Assert.assertEquals(0, ap.getReplicaCallCount());
+    assertEquals(0, ap.getReplicaCallCount());
   }
 
   @Test
@@ -1579,7 +1575,7 @@ public class TestAsyncProcess {
       .setRowAccess(rows).setResults(new Object[2]).setSubmittedRows(SubmittedRows.ALL).build();
     AsyncRequestFuture ars = ap.submit(task);
     verifyReplicaResult(ars, RR.TRUE, RR.TRUE);
-    Assert.assertEquals(2, ap.getReplicaCallCount());
+    assertEquals(2, ap.getReplicaCallCount());
   }
 
   @Test
@@ -1595,9 +1591,9 @@ public class TestAsyncProcess {
     AsyncRequestFuture ars = ap.submit(task);
     verifyReplicaResult(ars, RR.FAILED, RR.FALSE);
     // We should get 3 exceptions, for main + 2 replicas for DUMMY_BYTES_1
-    Assert.assertEquals(3, ars.getErrors().getNumExceptions());
+    assertEquals(3, ars.getErrors().getNumExceptions());
     for (int i = 0; i < ars.getErrors().getNumExceptions(); ++i) {
-      Assert.assertArrayEquals(DUMMY_BYTES_1, ars.getErrors().getRow(i).getRow());
+      assertArrayEquals(DUMMY_BYTES_1, ars.getErrors().getRow(i).getRow());
     }
   }
 
@@ -1638,9 +1634,9 @@ public class TestAsyncProcess {
 
   private void verifyResult(AsyncRequestFuture ars, boolean... expected) throws Exception {
     Object[] actual = ars.getResults();
-    Assert.assertEquals(expected.length, actual.length);
+    assertEquals(expected.length, actual.length);
     for (int i = 0; i < expected.length; ++i) {
-      Assert.assertEquals(expected[i], !(actual[i] instanceof Throwable));
+      assertEquals(expected[i], !(actual[i] instanceof Throwable));
     }
   }
 
@@ -1654,13 +1650,13 @@ public class TestAsyncProcess {
 
   private void verifyReplicaResult(AsyncRequestFuture ars, RR... expecteds) throws Exception {
     Object[] actuals = ars.getResults();
-    Assert.assertEquals(expecteds.length, actuals.length);
+    assertEquals(expecteds.length, actuals.length);
     for (int i = 0; i < expecteds.length; ++i) {
       Object actual = actuals[i];
       RR expected = expecteds[i];
-      Assert.assertEquals(actual.toString(), expected == RR.FAILED, actual instanceof Throwable);
+      assertEquals(expected == RR.FAILED, actual instanceof Throwable, actual.toString());
       if (expected != RR.FAILED && expected != RR.DONT_CARE) {
-        Assert.assertEquals(expected == RR.TRUE, ((Result) actual).isStale());
+        assertEquals(expected == RR.TRUE, ((Result) actual).isStale());
       }
     }
   }
@@ -1726,7 +1722,7 @@ public class TestAsyncProcess {
       .setOperationTimeout(OPERATION_TIMEOUT).setTableName(DUMMY_TABLE).setRowAccess(puts)
       .setSubmittedRows(SubmittedRows.NORMAL).build();
     ap.submit(task);
-    Assert.assertTrue(puts.isEmpty());
+    assertTrue(puts.isEmpty());
   }
 
   /**
@@ -1771,7 +1767,7 @@ public class TestAsyncProcess {
     BufferedMutatorParams bufferParam = createBufferedMutatorParams(ap, DUMMY_TABLE);
     BufferedMutatorImpl mutator = new BufferedMutatorImpl(conn, bufferParam, ap);
 
-    Assert.assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
+    assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
 
     Put p = createPut(1, true);
     mutator.mutate(p);
@@ -1779,7 +1775,7 @@ public class TestAsyncProcess {
     long startTime = EnvironmentEdgeManager.currentTime();
     try {
       mutator.flush();
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedWithDetailsException expected) {
       assertEquals(1, expected.getNumExceptions());
       assertTrue(expected.getRow(0) == p);
@@ -1792,8 +1788,8 @@ public class TestAsyncProcess {
       actualSleep += (long) (expectedPause * 0.01f);
     }
     LOG.debug("Expected to sleep " + expectedSleep + "ms, actually slept " + actualSleep + "ms");
-    Assert.assertTrue("Expected to sleep " + expectedSleep + " but actually " + actualSleep + "ms",
-      actualSleep >= expectedSleep);
+    assertTrue(actualSleep >= expectedSleep,
+      "Expected to sleep " + expectedSleep + " but actually " + actualSleep + "ms");
 
     // check and confirm normal IOE will use the normal pause
     final long normalPause =
@@ -1801,12 +1797,12 @@ public class TestAsyncProcess {
     ap = new AsyncProcessWithFailure(conn, testConf, new IOException());
     bufferParam = createBufferedMutatorParams(ap, DUMMY_TABLE);
     mutator = new BufferedMutatorImpl(conn, bufferParam, ap);
-    Assert.assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
+    assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
     mutator.mutate(p);
     startTime = EnvironmentEdgeManager.currentTime();
     try {
       mutator.flush();
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedWithDetailsException expected) {
       assertEquals(1, expected.getNumExceptions());
       assertTrue(expected.getRow(0) == p);
@@ -1819,7 +1815,7 @@ public class TestAsyncProcess {
     // plus an additional pause to balance the program execution time
     expectedSleep += normalPause;
     LOG.debug("Expected to sleep " + expectedSleep + "ms, actually slept " + actualSleep + "ms");
-    Assert.assertTrue("Slept for too long: " + actualSleep + "ms", actualSleep <= expectedSleep);
+    assertTrue(actualSleep <= expectedSleep, "Slept for too long: " + actualSleep + "ms");
   }
 
   @Test
@@ -1839,14 +1835,14 @@ public class TestAsyncProcess {
       createBufferedMutatorParams(ap, DUMMY_TABLE).operationTimeout(100);
     BufferedMutatorImpl mutator = new BufferedMutatorImpl(conn, bufferParam, ap);
 
-    Assert.assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
+    assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
 
     Put p = createPut(1, true);
     mutator.mutate(p);
 
     try {
       mutator.flush();
-      Assert.fail();
+      fail();
     } catch (RetriesExhaustedWithDetailsException expected) {
       assertEquals(1, expected.getNumExceptions());
       assertTrue(expected.getCause(0) instanceof OperationTimeoutExceededException);
@@ -1886,9 +1882,9 @@ public class TestAsyncProcess {
     BufferedMutatorParams bufferParam = createBufferedMutatorParams(ap, DUMMY_TABLE);
     BufferedMutatorImpl mutator = new BufferedMutatorImpl(conn, bufferParam, ap);
 
-    Assert.assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
+    assertNotNull(mutator.getAsyncProcess().createServerErrorTracker());
 
-    Assert.assertEquals(conn.locateRegion(DUMMY_TABLE, DUMMY_BYTES_1, true, true).toString(),
+    assertEquals(conn.locateRegion(DUMMY_TABLE, DUMMY_BYTES_1, true, true).toString(),
       new RegionLocations(loc1).toString());
 
     // simulate updateCachedLocations, by changing the loc for this row to loc3. only loc1 fails,
@@ -1912,7 +1908,7 @@ public class TestAsyncProcess {
     mutator.flush();
 
     // validate that we updated the location, as we expected
-    Assert.assertEquals(conn.locateRegion(DUMMY_TABLE, DUMMY_BYTES_1, true, true).toString(),
+    assertEquals(conn.locateRegion(DUMMY_TABLE, DUMMY_BYTES_1, true, true).toString(),
       new RegionLocations(loc3).toString());
     // this is a given since the location updated, but validate that we called updateCachedLocations
     Mockito.verify(conn, Mockito.atLeastOnce()).updateCachedLocations(Mockito.eq(DUMMY_TABLE),
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcessWithRegionException.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcessWithRegionException.java
index e63215c8ea5..f955eee4c3a 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcessWithRegionException.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestAsyncProcessWithRegionException.java
@@ -17,8 +17,8 @@
  */
 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.io.IOException;
 import java.io.InterruptedIOException;
@@ -28,7 +28,6 @@ import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.RegionLocations;
@@ -36,12 +35,11 @@ import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
-import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
-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;
 import org.mockito.Mockito;
 
 /**
@@ -58,13 +56,10 @@ import org.mockito.Mockito;
  * encounter this issue. We still backport the fix to branch-1.3 and branch-1.2 in case we ignore
  * some write paths.
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(LargeTests.TAG)
 public class TestAsyncProcessWithRegionException {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestAsyncProcessWithRegionException.class);
-
   private static final Result EMPTY_RESULT = Result.create(null, true);
   private static final IOException IOE = new IOException("YOU CAN'T PASS");
   private static final Configuration CONF = new Configuration();
@@ -84,7 +79,7 @@ public class TestAsyncProcessWithRegionException {
   private static final HRegionLocation REGION_LOCATION =
     new HRegionLocation(REGION_INFO, SERVER_NAME);
 
-  @BeforeClass
+  @BeforeAll
   public static void setUpBeforeClass() {
     // disable the retry
     CONF.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 0);
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 a6fabe39aff..94d419cb6f6 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;
@@ -54,35 +53,31 @@ import org.apache.hadoop.hbase.security.UserProvider;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
 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(
@@ -102,7 +97,7 @@ public class TestAsyncRegionLocatorTracing {
     }, "test", 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 2bcf9c3ac12..2ae79ac429a 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 f7da22c4531..a19fdef5987 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/TestBufferedMutator.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutator.java
index 2d83c29bae9..ec69a400469 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutator.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestBufferedMutator.java
@@ -17,33 +17,24 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 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.TableName;
 import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
 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({ SmallTests.class, ClientTests.class })
+@Tag(SmallTests.TAG)
+@Tag(ClientTests.TAG)
 public class TestBufferedMutator {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestBufferedMutator.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   /**
    * My BufferedMutator. Just to prove that I can insert a BM other than default.
    */
@@ -55,9 +46,9 @@ public class TestBufferedMutator {
   }
 
   @Test
-  public void testAlternateBufferedMutatorImpl() throws IOException {
+  public void testAlternateBufferedMutatorImpl(TestInfo testInfo) throws IOException {
     BufferedMutatorParams params =
-      new BufferedMutatorParams(TableName.valueOf(name.getMethodName()));
+      new BufferedMutatorParams(TableName.valueOf(testInfo.getTestMethod().get().getName()));
     Configuration conf = HBaseConfiguration.create();
     conf.set(HConstants.CLIENT_CONNECTION_REGISTRY_IMPL_CONF_KEY,
       DoNothingConnectionRegistry.class.getName());
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/TestClientNoCluster.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
index a094004f6a7..593d655a7a3 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
@@ -17,8 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.net.SocketTimeoutException;
@@ -39,7 +39,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
@@ -61,11 +60,10 @@ import org.apache.hadoop.hbase.util.Pair;
 import org.apache.hadoop.hbase.util.Threads;
 import org.apache.hadoop.util.Tool;
 import org.apache.hadoop.util.ToolRunner;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -105,13 +103,10 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.RegionSpeci
  * Test client behavior w/o setting up a cluster. Mock up cluster emissions. See below for a method
  * that tests retries/timeouts currently commented out.
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestClientNoCluster extends Configured implements Tool {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestClientNoCluster.class);
-
   private static final Logger LOG = LoggerFactory.getLogger(TestClientNoCluster.class);
   private Configuration conf;
   /**
@@ -123,7 +118,7 @@ public class TestClientNoCluster extends Configured implements Tool {
   public static final ServerName META_SERVERNAME =
     ServerName.valueOf("meta.example.org", 16010, 12345);
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     this.conf = HBaseConfiguration.create();
     // Run my Connection overrides. Use my little ConnectionImplementation below which
@@ -157,7 +152,7 @@ public class TestClientNoCluster extends Configured implements Tool {
   /**
    * Remove the @Ignore to try out timeout and retry settings
    */
-  @Ignore
+  @Disabled
   @Test
   public void testTimeoutAndRetries() throws IOException {
     Configuration localConfig = HBaseConfiguration.create(this.conf);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientScanner.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientScanner.java
index e039be8baa8..bc977601eb1 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientScanner.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientScanner.java
@@ -19,11 +19,11 @@ 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.assertNotNull;
-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.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -37,7 +37,6 @@ import java.util.concurrent.Executors;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellScanner;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.RegionLocations;
@@ -46,28 +45,19 @@ import org.apache.hadoop.hbase.client.ScannerCallable.MoreResults;
 import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
 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.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.junit.rules.TestName;
+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.TestInfo;
 import org.mockito.InOrder;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-/**
- * Test the ClientScanner.
- */
-@Category(SmallTests.class)
+@Tag(SmallTests.TAG)
 public class TestClientScanner {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestClientScanner.class);
-
   Scan scan;
   ExecutorService pool;
   Configuration conf;
@@ -77,11 +67,11 @@ public class TestClientScanner {
   RpcRetryingCallerFactory rpcFactory;
   RpcControllerFactory controllerFactory;
 
-  @Rule
-  public TestName name = new TestName();
+  private String methodName;
 
-  @Before
-  public void setup() throws IOException {
+  @BeforeEach
+  public void setup(TestInfo testInfo) throws IOException {
+    methodName = testInfo.getTestMethod().get().getName();
     clusterConn = Mockito.mock(ClusterConnection.class);
     rpcFactory = Mockito.mock(RpcRetryingCallerFactory.class);
     controllerFactory = Mockito.mock(RpcControllerFactory.class);
@@ -93,7 +83,7 @@ public class TestClientScanner {
     Mockito.when(clusterConn.getConnectionConfiguration()).thenReturn(connectionConfig);
   }
 
-  @After
+  @AfterEach
   public void teardown() {
     if (null != pool) {
       pool.shutdownNow();
@@ -176,9 +166,9 @@ public class TestClientScanner {
     scan.setCaching(100);
     scan.setMaxResultSize(1000 * 1000);
 
-    try (MockClientScanner scanner =
-      new MockClientScanner(conf, scan, TableName.valueOf(name.getMethodName()), clusterConn,
-        rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
+    try (
+      MockClientScanner scanner = new MockClientScanner(conf, scan, TableName.valueOf(methodName),
+        clusterConn, rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
 
       scanner.setRpcFinished(true);
 
@@ -240,9 +230,9 @@ public class TestClientScanner {
     // The single key-value will exit the loop
     scan.setMaxResultSize(1);
 
-    try (MockClientScanner scanner =
-      new MockClientScanner(conf, scan, TableName.valueOf(name.getMethodName()), clusterConn,
-        rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
+    try (
+      MockClientScanner scanner = new MockClientScanner(conf, scan, TableName.valueOf(methodName),
+        clusterConn, rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
       InOrder inOrder = Mockito.inOrder(caller);
 
       scanner.loadCache();
@@ -303,9 +293,9 @@ public class TestClientScanner {
     // Set a very large size
     scan.setMaxResultSize(1000 * 1000);
 
-    try (MockClientScanner scanner =
-      new MockClientScanner(conf, scan, TableName.valueOf(name.getMethodName()), clusterConn,
-        rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
+    try (
+      MockClientScanner scanner = new MockClientScanner(conf, scan, TableName.valueOf(methodName),
+        clusterConn, rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
       InOrder inOrder = Mockito.inOrder(caller);
 
       scanner.loadCache();
@@ -374,9 +364,9 @@ public class TestClientScanner {
     scan.setCaching(100);
     scan.setMaxResultSize(1000 * 1000);
 
-    try (MockClientScanner scanner =
-      new MockClientScanner(conf, scan, TableName.valueOf(name.getMethodName()), clusterConn,
-        rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
+    try (
+      MockClientScanner scanner = new MockClientScanner(conf, scan, TableName.valueOf(methodName),
+        clusterConn, rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
       scanner.setRpcFinished(true);
 
       InOrder inOrder = Mockito.inOrder(caller);
@@ -441,9 +431,9 @@ public class TestClientScanner {
     scan.setCaching(100);
     scan.setMaxResultSize(1000 * 1000);
 
-    try (MockClientScanner scanner =
-      new MockClientScanner(conf, scan, TableName.valueOf(name.getMethodName()), clusterConn,
-        rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
+    try (
+      MockClientScanner scanner = new MockClientScanner(conf, scan, TableName.valueOf(methodName),
+        clusterConn, rpcFactory, controllerFactory, pool, Integer.MAX_VALUE, connectionConfig)) {
       InOrder inOrder = Mockito.inOrder(caller);
       scanner.setRpcFinished(true);
 
@@ -487,8 +477,8 @@ public class TestClientScanner {
       anyInt())).thenReturn(new RegionLocations(null, null, null));
 
     try (MockClientScanner scanner =
-      new MockClientScanner(conf, scan, TableName.valueOf(name.getMethodName()), clusterConn,
-        rpcFactory, new RpcControllerFactory(conf), pool, Integer.MAX_VALUE, connectionConfig)) {
+      new MockClientScanner(conf, scan, TableName.valueOf(methodName), clusterConn, rpcFactory,
+        new RpcControllerFactory(conf), pool, Integer.MAX_VALUE, connectionConfig)) {
       Iterator<Result> iter = scanner.iterator();
       while (iter.hasNext()) {
         iter.next();
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 7a6f8e92226..9e23e9d2f05 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,12 +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.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.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeepDeletedCells;
@@ -38,21 +38,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.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({ MiscTests.class, SmallTests.class })
+@Tag(MiscTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestColumnFamilyDescriptorBuilder {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestColumnFamilyDescriptorBuilder.class);
-
-  @Rule
-  public ExpectedException expectedEx = ExpectedException.none();
 
   @Test
   public void testBuilder() throws DeserializationException {
@@ -105,9 +96,8 @@ public class TestColumnFamilyDescriptorBuilder {
    */
   @Test
   public void testHColumnDescriptorShouldThrowIAEWhenFamilyNameEmpty() throws Exception {
-    expectedEx.expect(IllegalArgumentException.class);
-    expectedEx.expectMessage("Column Family name can not be empty");
-    ColumnFamilyDescriptorBuilder.of("");
+    assertThrows(IllegalArgumentException.class, () -> ColumnFamilyDescriptorBuilder.of(""),
+      "Column Family name can not be empty");
   }
 
   /**
@@ -163,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 d3031fe85c7..66375000049 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,25 +17,20 @@
  */
 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.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 TestConnectionConfiguration {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionConfiguration.class);
-
   @Test
   public void itHandlesDeprecatedPauseForCQTBE() {
     Configuration conf = new Configuration();
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryTracing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryTracing.java
index 0e61dfc9db2..dbbda77d2e8 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryTracing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionFactoryTracing.java
@@ -22,38 +22,33 @@ import static org.apache.hadoop.hbase.HConstants.CLIENT_CONNECTION_REGISTRY_IMPL
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 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.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;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestConnectionFactoryTracing extends TestTracingBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionFactoryTracing.class);
-
   private User currentUser;
   private Object connection;
 
   @Override
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     super.setUp();
     currentUser = UserProvider.instantiate(conf).getCurrent();
     conf.set(CLIENT_CONNECTION_REGISTRY_IMPL_CONF_KEY, RegistryForTracingTest.class.getName());
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close((Closeable) connection, true);
   }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementationTracing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementationTracing.java
index a207186785a..a1f91d583db 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementationTracing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestConnectionImplementationTracing.java
@@ -19,37 +19,32 @@ package org.apache.hadoop.hbase.client;
 
 import java.io.IOException;
 import java.util.Collections;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.security.UserProvider;
 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.apache.hbase.thirdparty.com.google.common.io.Closeables;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestConnectionImplementationTracing extends TestTracingBase {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestConnectionImplementationTracing.class);
-
   ConnectionImplementation conn;
 
   @Override
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     super.setUp();
     conn = new ConnectionImplementation(conf, null, UserProvider.instantiate(conf).getCurrent(),
       Collections.emptyMap());
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close(conn, true);
   }
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/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/TestDelayingRunner.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestDelayingRunner.java
index 30d7c2cb2eb..1a02b4de000 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestDelayingRunner.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestDelayingRunner.java
@@ -17,27 +17,21 @@
  */
 package org.apache.hadoop.hbase.client;
 
-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.util.concurrent.atomic.AtomicLong;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-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 TestDelayingRunner {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestDelayingRunner.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");
@@ -61,8 +55,8 @@ public class TestDelayingRunner {
     long startTime = EnvironmentEdgeManager.currentTime();
     runner.run();
     long delay = endTime.get() - startTime;
-    assertTrue("DelayingRunner did not delay long enough", delay >= sleepTime);
-    assertFalse("DelayingRunner delayed too long", delay > sleepTime + sleepTime * 0.2);
+    assertTrue(delay >= sleepTime, "DelayingRunner did not delay long enough");
+    assertFalse(delay > sleepTime + sleepTime * 0.2, "DelayingRunner delayed too long");
   }
 
 }
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 3815951d4e3..b9f0de4d367 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/TestHTableMultiplexerViaMocks.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestHTableMultiplexerViaMocks.java
index 22b8576611f..3ca5164c156 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestHTableMultiplexerViaMocks.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestHTableMultiplexerViaMocks.java
@@ -26,25 +26,19 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 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.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 TestHTableMultiplexerViaMocks {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHTableMultiplexerViaMocks.class);
-
   private HTableMultiplexer mockMultiplexer;
   private ClusterConnection mockConnection;
 
-  @Before
+  @BeforeEach
   public void setupTest() {
     mockMultiplexer = mock(HTableMultiplexer.class);
     mockConnection = mock(ClusterConnection.class);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestHTableTracing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestHTableTracing.java
index 3a0f54a2af1..68a793f29b2 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestHTableTracing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestHTableTracing.java
@@ -52,7 +52,6 @@ import java.util.stream.Collectors;
 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.HRegionLocation;
 import org.apache.hadoop.hbase.MatcherPredicate;
 import org.apache.hadoop.hbase.ServerName;
@@ -65,11 +64,10 @@ 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.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;
 
@@ -92,18 +90,16 @@ 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 TestHTableTracing extends TestTracingBase {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestHTableTracing.class);
 
   private ClientProtos.ClientService.BlockingInterface stub;
   private ConnectionImplementation conn;
   private Table table;
 
   @Override
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     super.setUp();
 
@@ -230,7 +226,7 @@ public class TestHTableTracing extends TestTracingBase {
     table = conn.getTable(TableName.META_TABLE_NAME, 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/TestImmutableHColumnDescriptor.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHColumnDescriptor.java
index f7c2e3b5226..1a783e0d729 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHColumnDescriptor.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHColumnDescriptor.java
@@ -17,12 +17,12 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.fail;
 
+import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.Consumer;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.KeepDeletedCells;
 import org.apache.hadoop.hbase.MemoryCompactionPolicy;
@@ -33,21 +33,14 @@ import org.apache.hadoop.hbase.testclassification.ClientTests;
 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;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestImmutableHColumnDescriptor {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestImmutableHColumnDescriptor.class);
-
-  @Rule
-  public TestName name = new TestName();
   private static final List<Consumer<ImmutableHColumnDescriptor>> TEST_FUNCTION = Arrays.asList(
     hcd -> hcd.setValue("a", "a"), hcd -> hcd.setValue(Bytes.toBytes("a"), Bytes.toBytes("a")),
     hcd -> hcd.setConfiguration("aaa", "ccc"), hcd -> hcd.remove(Bytes.toBytes("aaa")),
@@ -71,9 +64,10 @@ public class TestImmutableHColumnDescriptor {
     hcd -> hcd.setVersions(1, 10));
 
   @Test
-  public void testImmutable() {
+  public void testImmutable(TestInfo testInfo) {
+    String methodName = testInfo.getTestMethod().map(Method::getName).orElse("default");
     ImmutableHColumnDescriptor hcd =
-      new ImmutableHColumnDescriptor(new HColumnDescriptor(Bytes.toBytes(name.getMethodName())));
+      new ImmutableHColumnDescriptor(new HColumnDescriptor(Bytes.toBytes(methodName)));
     for (int i = 0; i != TEST_FUNCTION.size(); ++i) {
       try {
         TEST_FUNCTION.get(i).accept(hcd);
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHRegionInfo.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHRegionInfo.java
index 341f77f3c2d..2d1f4df359a 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHRegionInfo.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHRegionInfo.java
@@ -17,41 +17,34 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.fail;
 
+import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.Consumer;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HRegionInfo;
 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;
 
 /**
  * Test ImmutableHRegionInfo
  */
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestImmutableHRegionInfo {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestImmutableHRegionInfo.class);
-
-  @Rule
-  public TestName name = new TestName();
-
   private final List<Consumer<ImmutableHRegionInfo>> TEST_FUNCTIONS =
     Arrays.asList(hri -> hri.setOffline(true), hri -> hri.setSplit(true));
 
   @Test
-  public void testImmutable() {
-    HRegionInfo hri = new HRegionInfo(TableName.valueOf(name.getMethodName()));
+  public void testImmutable(TestInfo testInfo) {
+    String methodName = testInfo.getTestMethod().map(Method::getName).orElse("default");
+    HRegionInfo hri = new HRegionInfo(TableName.valueOf(methodName));
     ImmutableHRegionInfo immutableHri = new ImmutableHRegionInfo(hri);
 
     TEST_FUNCTIONS.forEach(f -> {
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHTableDescriptor.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHTableDescriptor.java
index be0649f3751..0d55a1a4135 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHTableDescriptor.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestImmutableHTableDescriptor.java
@@ -17,13 +17,12 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.Consumer;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableName;
@@ -31,21 +30,15 @@ import org.apache.hadoop.hbase.testclassification.ClientTests;
 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.BeforeEach;
+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 TestImmutableHTableDescriptor {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestImmutableHTableDescriptor.class);
-
-  @Rule
-  public TestName name = new TestName();
   private static final List<Consumer<ImmutableHTableDescriptor>> TEST_FUNCTION = Arrays.asList(
     htd -> htd.setValue("a", "a"), htd -> htd.setValue(Bytes.toBytes("a"), Bytes.toBytes("a")),
     htd -> htd.setValue(new Bytes(Bytes.toBytes("a")), new Bytes(Bytes.toBytes("a"))),
@@ -66,9 +59,16 @@ public class TestImmutableHTableDescriptor {
       }
     });
 
+  private String methodName;
+
+  @BeforeEach
+  public void setUp(TestInfo testInfo) {
+    methodName = testInfo.getTestMethod().get().getName();
+  }
+
   @Test
   public void testImmutable() {
-    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(methodName));
     ImmutableHTableDescriptor immutableHtd = new ImmutableHTableDescriptor(htd);
     TEST_FUNCTION.forEach(f -> {
       try {
@@ -81,7 +81,7 @@ public class TestImmutableHTableDescriptor {
 
   @Test
   public void testImmutableHColumnDescriptor() {
-    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));
+    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(methodName));
     htd.addFamily(new HColumnDescriptor(Bytes.toBytes("family")));
     ImmutableHTableDescriptor immutableHtd = new ImmutableHTableDescriptor(htd);
     for (HColumnDescriptor hcd : immutableHtd.getColumnFamilies()) {
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 aa05f5a3c7d..9bb27b6e702 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 ebdb7adc588..cb48ee62742 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
    */
@@ -62,14 +57,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 6da0ee5bfa9..b3d19794668 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,10 +17,12 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertEquals;
-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.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.codahale.metrics.Counter;
 import com.codahale.metrics.RatioGauge;
@@ -28,14 +30,14 @@ 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.CompletableFuture;
 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;
@@ -44,16 +46,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.mockito.Mockito;
+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;
 
@@ -68,12 +65,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;
@@ -82,27 +78,29 @@ 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 TestMetricsConnection(boolean tableMetricsEnabled) {
+    this.tableMetricsEnabled = tableMetricsEnabled;
   }
 
-  @Before
+  public static Stream<Arguments> parameters() {
+    return Stream.of(Arguments.of(true), Arguments.of(false));
+  }
+
+  @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 testMetricsConnectionScopeAsyncClient() throws IOException {
     Configuration conf = new Configuration();
     String clusterId = "foo";
@@ -111,18 +109,18 @@ public class TestMetricsConnection {
 
     AsyncConnectionImpl impl = new AsyncConnectionImpl(conf, null, "foo", 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", 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);
@@ -142,11 +140,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++) {
@@ -156,42 +154,41 @@ 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 testMetricsConnectionScopeBlockingClient() throws IOException {
     Configuration conf = new Configuration();
     String clusterId = "foo";
     String scope = "testScope";
     conf.setBoolean(MetricsConnection.CLIENT_SIDE_METRICS_ENABLED_KEY, true);
 
-    ConnectionRegistry mockRegistry = Mockito.mock(ConnectionRegistry.class);
-    Mockito.when(mockRegistry.getClusterId())
-      .thenReturn(CompletableFuture.completedFuture(clusterId));
+    ConnectionRegistry mockRegistry = mock(ConnectionRegistry.class);
+    when(mockRegistry.getClusterId()).thenReturn(CompletableFuture.completedFuture(clusterId));
 
     ConnectionImplementation impl =
       new ConnectionImplementation(conf, null, User.getCurrent(), mockRegistry);
     MetricsConnection metrics = impl.getConnectionMetrics();
-    assertNotNull("Metrics should be present", metrics);
+    assertNotNull(metrics, "Metrics should be present");
     assertEquals(clusterId + "@" + Integer.toHexString(impl.hashCode()), metrics.getMetricScope());
     conf.set(MetricsConnection.METRICS_SCOPE_KEY, scope);
     impl = new ConnectionImplementation(conf, null, User.getCurrent(), mockRegistry);
 
     metrics = impl.getConnectionMetrics();
-    assertNotNull("Metrics should be present", metrics);
+    assertNotNull(metrics, "Metrics should be present");
     assertEquals(scope, metrics.getMetricScope());
   }
 
-  @Test
+  @TestTemplate
   public void testStaticMetrics() throws IOException {
     final byte[] foo = Bytes.toBytes("foo");
     String table = "TableX";
@@ -257,19 +254,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);
 
@@ -277,9 +274,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());
@@ -303,10 +300,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);
       }
@@ -322,10 +319,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);
       }
@@ -344,7 +341,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
@@ -354,10 +351,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);
       }
     }
 
@@ -366,7 +363,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
@@ -376,10 +373,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 718ca05b92f..acc85fc4e1f 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;
@@ -26,23 +26,18 @@ import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellBuilderFactory;
 import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 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"));
@@ -122,11 +117,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<Cell> originCells = origin.getCellList(family);
       List<Cell> cloneCells = clone.getCellList(family);
-      Assert.assertEquals(originCells.size(), cloneCells.size());
+      Assertions.assertEquals(originCells.size(), cloneCells.size());
       for (int i = 0; i != cloneCells.size(); ++i) {
         Cell originCell = originCells.get(i);
         Cell cloneCell = cloneCells.get(i);
@@ -134,14 +129,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());
     }
@@ -151,8 +146,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 644062ca991..170a569d5ba 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;
@@ -29,7 +30,6 @@ import java.util.Map;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellComparatorImpl;
 import org.apache.hadoop.hbase.CellUtil;
-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;
@@ -62,10 +62,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;
@@ -77,11 +75,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");
@@ -269,8 +265,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]");
   }
 
   /**
@@ -289,14 +285,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);
@@ -305,13 +301,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);
@@ -320,16 +316,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);
@@ -338,14 +334,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()");
   }
 
   /**
@@ -389,57 +385,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()");
 
   }
 
@@ -447,45 +443,45 @@ 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, CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue(c.get(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(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, CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue(c.get(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(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, CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue(c.get(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(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, CellComparatorImpl.COMPARATOR.compare(c.get(0), new KeyValue(c.get(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(c.get(0))));
   }
 
   @Test
@@ -538,42 +534,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/TestProcedureFuture.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestProcedureFuture.java
index d066a72c60c..e1685026bd6 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestProcedureFuture.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestProcedureFuture.java
@@ -17,33 +17,28 @@
  */
 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.io.IOException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
-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.mockito.Mockito;
 
 import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProcedureResultRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetProcedureResultResponse;
 
-@Category({ ClientTests.class, SmallTests.class })
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestProcedureFuture {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestProcedureFuture.class);
-
   private static class TestFuture extends HBaseAdmin.ProcedureFuture<Void> {
     private boolean postOperationResultCalled = false;
     private boolean waitOperationResultCalled = false;
@@ -108,10 +103,10 @@ public class TestProcedureFuture {
     TestFuture f = new TestFuture(admin, 100L);
     f.get(1, TimeUnit.MINUTES);
 
-    assertTrue("expected getProcedureResult() to be called", f.wasGetProcedureResultCalled());
-    assertTrue("expected convertResult() to be called", f.wasConvertResultCalled());
-    assertFalse("unexpected waitOperationResult() called", f.wasWaitOperationResultCalled());
-    assertTrue("expected postOperationResult() to be called", f.wasPostOperationResultCalled());
+    assertTrue(f.wasGetProcedureResultCalled(), "expected getProcedureResult() to be called");
+    assertTrue(f.wasConvertResultCalled(), "expected convertResult() to be called");
+    assertFalse(f.wasWaitOperationResultCalled(), "unexpected waitOperationResult() called");
+    assertTrue(f.wasPostOperationResultCalled(), "expected postOperationResult() to be called");
   }
 
   /**
@@ -136,9 +131,9 @@ public class TestProcedureFuture {
     f.get(1, TimeUnit.MINUTES);
 
     assertEquals(10, spinCount.get());
-    assertTrue("expected convertResult() to be called", f.wasConvertResultCalled());
-    assertFalse("unexpected waitOperationResult() called", f.wasWaitOperationResultCalled());
-    assertTrue("expected postOperationResult() to be called", f.wasPostOperationResultCalled());
+    assertTrue(f.wasConvertResultCalled(), "expected convertResult() to be called");
+    assertFalse(f.wasWaitOperationResultCalled(), "unexpected waitOperationResult() called");
+    assertTrue(f.wasPostOperationResultCalled(), "expected postOperationResult() to be called");
   }
 
   /**
@@ -150,10 +145,10 @@ public class TestProcedureFuture {
     TestFuture f = new TestFuture(admin, null);
     f.get(1, TimeUnit.MINUTES);
 
-    assertFalse("unexpected getProcedureResult() called", f.wasGetProcedureResultCalled());
-    assertFalse("unexpected convertResult() called", f.wasConvertResultCalled());
-    assertTrue("expected waitOperationResult() to be called", f.wasWaitOperationResultCalled());
-    assertTrue("expected postOperationResult() to be called", f.wasPostOperationResultCalled());
+    assertFalse(f.wasGetProcedureResultCalled(), "unexpected getProcedureResult() called");
+    assertFalse(f.wasConvertResultCalled(), "unexpected convertResult() called");
+    assertTrue(f.wasWaitOperationResultCalled(), "expected waitOperationResult() to be called");
+    assertTrue(f.wasPostOperationResultCalled(), "expected postOperationResult() to be called");
   }
 
   /**
@@ -176,9 +171,9 @@ public class TestProcedureFuture {
     };
     f.get(1, TimeUnit.MINUTES);
 
-    assertTrue("expected getProcedureResult() to be called", f.wasGetProcedureResultCalled());
-    assertFalse("unexpected convertResult() called", f.wasConvertResultCalled());
-    assertTrue("expected waitOperationResult() to be called", f.wasWaitOperationResultCalled());
-    assertTrue("expected postOperationResult() to be called", f.wasPostOperationResultCalled());
+    assertTrue(f.wasGetProcedureResultCalled(), "expected getProcedureResult() to be called");
+    assertFalse(f.wasConvertResultCalled(), "unexpected convertResult() called");
+    assertTrue(f.wasWaitOperationResultCalled(), "expected waitOperationResult() to be called");
+    assertTrue(f.wasPostOperationResultCalled(), "expected postOperationResult() to be called");
   }
 }
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 678eb28ce2e..4b13dae6019 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,10 +17,14 @@
  */
 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.HRegionInfo;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.master.RegionState;
@@ -28,40 +32,32 @@ 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(convert(ri), RegionState.State.OPEN);
@@ -71,9 +67,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));
   }
 
@@ -88,8 +84,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 {
@@ -106,12 +102,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/TestRegionLocatorTracing.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionLocatorTracing.java
index 1e9860b283b..8c22660b826 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionLocatorTracing.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRegionLocatorTracing.java
@@ -33,38 +33,34 @@ import io.opentelemetry.sdk.trace.data.SpanData;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.security.UserProvider;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
-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;
 
-@Category({ ClientTests.class, MediumTests.class })
+@Tag(ClientTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestRegionLocatorTracing extends TestTracingBase {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRegionLocatorTracing.class);
 
   ConnectionImplementation conn;
 
   @Override
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     super.setUp();
     conn = new ConnectionImplementation(conf, null, UserProvider.instantiate(conf).getCurrent(),
       Collections.emptyMap());
   }
 
-  @After
+  @AfterEach
   public void tearDown() throws IOException {
     Closeables.close(conn, true);
   }
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/TestReversedScannerCallable.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestReversedScannerCallable.java
index e9e1d7efa83..df87f5e2209 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestReversedScannerCallable.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestReversedScannerCallable.java
@@ -17,7 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -26,7 +27,6 @@ import static org.mockito.Mockito.when;
 import java.io.IOException;
 import java.util.Collections;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HRegionLocation;
@@ -38,22 +38,18 @@ import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-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.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 
-@RunWith(MockitoJUnitRunner.class)
-@Category({ ClientTests.class, SmallTests.class })
+@ExtendWith(MockitoExtension.class)
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestReversedScannerCallable {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestReversedScannerCallable.class);
-
   private static final TableName TABLE_NAME = TableName.valueOf("TestReversedScannerCallable");
 
   private static final String HOSTNAME = "localhost";
@@ -70,13 +66,13 @@ public class TestReversedScannerCallable {
   @Mock
   private HRegionLocation regionLocation;
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     when(connection.getConfiguration()).thenReturn(new Configuration());
-    when(regionLocations.size()).thenReturn(1);
-    when(regionLocations.getRegionLocation(0)).thenReturn(regionLocation);
-    when(regionLocation.getHostname()).thenReturn(HOSTNAME);
-    when(regionLocation.getServerName()).thenReturn(SERVERNAME);
+    lenient().when(regionLocations.size()).thenReturn(1);
+    lenient().when(regionLocations.getRegionLocation(0)).thenReturn(regionLocation);
+    lenient().when(regionLocation.getHostname()).thenReturn(HOSTNAME);
+    lenient().when(regionLocation.getServerName()).thenReturn(SERVERNAME);
   }
 
   @Test
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 52e060745e6..cdc6336ecaf 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.HBaseCommonTestingUtility;
 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/TestRpcRetryingCallerImpl.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRpcRetryingCallerImpl.java
index a0177190035..d80f1d5a766 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRpcRetryingCallerImpl.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestRpcRetryingCallerImpl.java
@@ -17,28 +17,23 @@
  */
 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 org.apache.hadoop.hbase.CallDroppedException;
 import org.apache.hadoop.hbase.CallQueueTooBigException;
-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 TestRpcRetryingCallerImpl {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestRpcRetryingCallerImpl.class);
-
   @Test
   public void itUsesSpecialPauseForCQTBE() throws Exception {
     itUsesSpecialPauseForServerOverloaded(CallQueueTooBigException.class);
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 05d0fc865f7..4bc1ad2c8b1 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,16 +17,16 @@
  */
 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.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.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;
@@ -35,19 +35,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 {
@@ -60,11 +57,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
@@ -108,51 +105,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
@@ -161,7 +155,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
@@ -257,8 +251,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/TestScannerCallable.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScannerCallable.java
index e675b06b574..cf471bfda1c 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScannerCallable.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScannerCallable.java
@@ -17,7 +17,8 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static org.junit.Assert.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -25,7 +26,6 @@ import static org.mockito.Mockito.when;
 import java.io.IOException;
 import java.util.Collections;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.RegionLocations;
 import org.apache.hadoop.hbase.ServerName;
@@ -35,20 +35,17 @@ import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-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.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 
-@RunWith(MockitoJUnitRunner.class)
-@Category({ ClientTests.class, SmallTests.class })
+@ExtendWith(MockitoExtension.class)
+@Tag(ClientTests.TAG)
+@Tag(SmallTests.TAG)
 public class TestScannerCallable {
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestScannerCallable.class);
 
   private static final TableName TABLE_NAME = TableName.valueOf("TestScannerCallable");
 
@@ -66,13 +63,13 @@ public class TestScannerCallable {
   @Mock
   private HRegionLocation regionLocation;
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     when(connection.getConfiguration()).thenReturn(new Configuration());
-    when(regionLocations.size()).thenReturn(1);
-    when(regionLocations.getRegionLocation(0)).thenReturn(regionLocation);
-    when(regionLocation.getHostname()).thenReturn(HOSTNAME);
-    when(regionLocation.getServerName()).thenReturn(SERVERNAME);
+    lenient().when(regionLocations.size()).thenReturn(1);
+    lenient().when(regionLocations.getRegionLocation(0)).thenReturn(regionLocation);
+    lenient().when(regionLocation.getHostname()).thenReturn(HOSTNAME);
+    lenient().when(regionLocation.getServerName()).thenReturn(SERVERNAME);
   }
 
   @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 6cb9960b96b..7458e0acc90 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.HRegionInfo;
@@ -44,18 +43,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");
@@ -362,7 +356,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 8a653ddd8ab..01f0a8cae92 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,16 +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.HColumnDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
 import org.apache.hadoop.hbase.exceptions.HBaseException;
@@ -34,33 +33,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 +86,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 +108,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());
 
@@ -156,8 +156,7 @@ public class TestTableDescriptorBuilder {
   @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));
     desc = TableDescriptorBuilder.newBuilder(desc).removeCoprocessor(className).build();
     assertFalse(desc.hasCoprocessor(className));
@@ -170,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);
@@ -208,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 + "'");
     }
   }
 
@@ -226,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);
@@ -266,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);
@@ -311,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());
@@ -323,31 +317,33 @@ public class TestTableDescriptorBuilder {
     assertEquals(1, htd.getColumnFamily(familyName).getDFSReplication());
   }
 
-  @Test(expected = IllegalArgumentException.class)
+  @Test
   public void testModifyInexistentFamily() {
     byte[] familyName = Bytes.toBytes("cf");
-    HColumnDescriptor hcd = new HColumnDescriptor(familyName);
-    TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()))
-      .modifyColumnFamily(hcd).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());
   }
 
@@ -356,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(
@@ -376,8 +372,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 4a49abaf2cc..06de7d91a3b 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.AsyncMetaTableAccessor;
-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<AsyncMetaTableAccessor> mockedClientMetaTableAccessor;
 
   private AsyncAdmin admin;
 
-  @Before
+  @BeforeEach
   public void setUp() {
     mockedClientMetaTableAccessor = mockStatic(AsyncMetaTableAccessor.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/TestTableRpcPriority.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableRpcPriority.java
index 3bdd83effeb..ec30bbfd53e 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableRpcPriority.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTableRpcPriority.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.Mockito.argThat;
 import static org.mockito.Mockito.atLeast;
@@ -43,7 +43,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.RegionLocations;
@@ -55,12 +54,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;
@@ -74,21 +71,18 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;
  * Test that correct rpc priority is sent to server from blocking Table calls. Currently only
  * implements checks for scans, but more could be added here.
  */
-@Category({ ClientTests.class, MediumTests.class })
+@Tag(ClientTests.TAG)
+@Tag(MediumTests.TAG)
 public class TestTableRpcPriority {
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestTableRpcPriority.class);
-
-  @Rule
-  public TestName name = new TestName();
+  private String methodName;
 
   private ClientProtos.ClientService.BlockingInterface stub;
   private Connection conn;
 
-  @Before
-  public void setUp() throws IOException, ServiceException {
+  @BeforeEach
+  public void setUp(TestInfo testInfo) throws IOException, ServiceException {
+    methodName = testInfo.getTestMethod().get().getName();
     stub = mock(ClientProtos.ClientService.BlockingInterface.class);
 
     Configuration conf = HBaseConfiguration.create();
@@ -124,7 +118,7 @@ public class TestTableRpcPriority {
   @Test
   public void testScan() throws Exception {
     mockScan(19);
-    testForTable(TableName.valueOf(name.getMethodName()), Optional.of(19));
+    testForTable(TableName.valueOf(methodName), Optional.of(19));
   }
 
   /**
@@ -134,20 +128,19 @@ public class TestTableRpcPriority {
   @Test
   public void testScanSuperHighPriority() throws Exception {
     mockScan(1000);
-    testForTable(TableName.valueOf(name.getMethodName()), Optional.of(1000));
+    testForTable(TableName.valueOf(methodName), Optional.of(1000));
   }
 
   @Test
   public void testScanNormalTable() throws Exception {
     mockScan(NORMAL_QOS);
-    testForTable(TableName.valueOf(name.getMethodName()), Optional.of(NORMAL_QOS));
+    testForTable(TableName.valueOf(methodName), Optional.of(NORMAL_QOS));
   }
 
   @Test
   public void testScanSystemTable() throws Exception {
     mockScan(SYSTEMTABLE_QOS);
-    testForTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, name.getMethodName()),
-      Optional.empty());
+    testForTable(TableName.valueOf(SYSTEM_NAMESPACE_NAME_STR, methodName), Optional.empty());
   }
 
   @Test
@@ -190,8 +183,8 @@ public class TestTableRpcPriority {
       @Override
       public ClientProtos.ScanResponse answer(InvocationOnMock invocation) throws Throwable {
         ClientProtos.ScanRequest req = invocation.getArgument(1);
-        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);
         ClientProtos.ScanResponse.Builder builder = ClientProtos.ScanResponse.newBuilder();
 
         if (!req.hasScannerId()) {
@@ -214,10 +207,10 @@ public class TestTableRpcPriority {
       @Override
       public ClientProtos.ScanResponse answer(InvocationOnMock invocation) throws Throwable {
         ClientProtos.ScanRequest req = invocation.getArgument(1);
-        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");
 
         return ClientProtos.ScanResponse.getDefaultInstance();
       }
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTracingBase.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTracingBase.java
index d1eefe72a03..155f482781d 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTracingBase.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestTracingBase.java
@@ -21,12 +21,12 @@ import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.has
 import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
 import static org.hamcrest.Matchers.allOf;
 import static org.hamcrest.Matchers.hasItem;
-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 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.util.Objects;
 import java.util.Optional;
@@ -43,8 +43,8 @@ import org.apache.hadoop.hbase.Waiter;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.trace.HBaseSemanticAttributes;
 import org.hamcrest.Matcher;
-import org.junit.Before;
-import org.junit.ClassRule;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.RegisterExtension;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,10 +57,10 @@ public class TestTracingBase {
 
   protected Configuration conf;
 
-  @ClassRule
-  public static OpenTelemetryRule TRACE_RULE = OpenTelemetryRule.create();
+  @RegisterExtension
+  public static final OpenTelemetryExtension TRACE_RULE = OpenTelemetryExtension.create();
 
-  @Before
+  @BeforeEach
   public void setUp() throws Exception {
     conf = HBaseConfiguration.create();
     conf.set(HConstants.CLIENT_CONNECTION_REGISTRY_IMPL_CONF_KEY,
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 f1f1e37ff52..e42057057eb 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.HBaseCommonTestingUtility;
+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,26 @@ 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 HBaseCommonTestingUtility.BOOLEAN_PARAMETERIZED;
+  public TestKeyOnlyFilter(boolean lenAsVal) {
+    this.lenAsVal = lenAsVal;
+  }
+
+  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 fccea923635..628866c7d45 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;
@@ -26,7 +26,6 @@ import org.apache.commons.lang3.time.StopWatch;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.CellUtil;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.PrivateCellUtil;
@@ -41,24 +40,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 a0b68646b14..b8a04fbbc30 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;
@@ -26,19 +26,15 @@ import java.util.List;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellScannable;
 import org.apache.hadoop.hbase.CellScanner;
-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 {
@@ -54,8 +50,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/TestEncryptionUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestEncryptionUtil.java
index 6f7be831585..51f47dd5df1 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestEncryptionUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/security/TestEncryptionUtil.java
@@ -17,15 +17,15 @@
  */
 package org.apache.hadoop.hbase.security;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+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.security.Key;
 import java.security.KeyException;
 import javax.crypto.spec.SecretKeySpec;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.io.crypto.Encryption;
 import org.apache.hadoop.hbase.io.crypto.KeyProviderForTesting;
@@ -33,20 +33,16 @@ import org.apache.hadoop.hbase.io.crypto.aes.AES;
 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 TestEncryptionUtil {
 
   private static final String INVALID_HASH_ALG = "this-hash-algorithm-not-exists hopefully... :)";
   private static final String DEFAULT_HASH_ALGORITHM = "use-default";
 
-  @ClassRule
-  public static final HBaseClassTestRule CLASS_RULE =
-    HBaseClassTestRule.forClass(TestEncryptionUtil.class);
-
   // There does not seem to be a ready way to test either getKeyFromBytesOrMasterKey
   // or createEncryptionContext, and the existing code under MobUtils appeared to be
   // untested. Not ideal!
@@ -71,9 +67,9 @@ public class TestEncryptionUtil {
     testKeyWrapping("SHA-384");
   }
 
-  @Test(expected = RuntimeException.class)
+  @Test
   public void testKeyWrappingWithInvalidHashAlg() throws Exception {
-    testKeyWrapping(INVALID_HASH_ALG);
+    assertThrows(RuntimeException.class, () -> testKeyWrapping(INVALID_HASH_ALG));
   }
 
   @Test
@@ -96,12 +92,12 @@ public class TestEncryptionUtil {
     testWALKeyWrapping("SHA-384");
   }
 
-  @Test(expected = RuntimeException.class)
+  @Test
   public void testWALKeyWrappingWithInvalidHashAlg() throws Exception {
-    testWALKeyWrapping(INVALID_HASH_ALG);
+    assertThrows(RuntimeException.class, () -> testWALKeyWrapping(INVALID_HASH_ALG));
   }
 
-  @Test(expected = KeyException.class)
+  @Test
   public void testWALKeyWrappingWithIncorrectKey() throws Exception {
     // set up the key provider for testing to resolve a key for our test subject
     Configuration conf = new Configuration(); // we don't need HBaseConfiguration for this
@@ -118,14 +114,15 @@ public class TestEncryptionUtil {
     assertNotNull(wrappedKeyBytes);
 
     // unwrap with an incorrect key
-    EncryptionUtil.unwrapWALKey(conf, "other", wrappedKeyBytes);
+    assertThrows(KeyException.class,
+      () -> EncryptionUtil.unwrapWALKey(conf, "other", wrappedKeyBytes));
   }
 
-  @Test(expected = KeyException.class)
+  @Test
   public void testHashAlgorithmMismatchWhenFailExpected() throws Exception {
     Configuration conf = new Configuration(); // we don't need HBaseConfiguration for this
     conf.setBoolean(Encryption.CRYPTO_KEY_FAIL_ON_ALGORITHM_MISMATCH_CONF_KEY, true);
-    testKeyWrappingWithMismatchingAlgorithms(conf);
+    assertThrows(KeyException.class, () -> testKeyWrappingWithMismatchingAlgorithms(conf));
   }
 
   @Test
@@ -165,8 +162,8 @@ public class TestEncryptionUtil {
     // only secretkeyspec supported for now
     assertTrue(unwrappedKey instanceof SecretKeySpec);
     // did we get back what we wrapped?
-    assertTrue("Unwrapped key bytes do not match original",
-      Bytes.equals(keyBytes, unwrappedKey.getEncoded()));
+    assertTrue(Bytes.equals(keyBytes, unwrappedKey.getEncoded()),
+      "Unwrapped key bytes do not match original");
 
     // unwrap with an incorrect key
     try {
@@ -201,8 +198,8 @@ public class TestEncryptionUtil {
     // only secretkeyspec supported for now
     assertTrue(unwrappedKey instanceof SecretKeySpec);
     // did we get back what we wrapped?
-    assertTrue("Unwrapped key bytes do not match original",
-      Bytes.equals(keyBytes, unwrappedKey.getEncoded()));
+    assertTrue(Bytes.equals(keyBytes, unwrappedKey.getEncoded()),
+      "Unwrapped key bytes do not match original");
   }
 
   private void testKeyWrappingWithMismatchingAlgorithms(Configuration conf) throws Exception {
@@ -230,8 +227,8 @@ public class TestEncryptionUtil {
     assertNotNull(unwrappedKey);
 
     // did we get back what we wrapped?
-    assertTrue("Unwrapped key bytes do not match original",
-      Bytes.equals(keyBytes, unwrappedKey.getEncoded()));
+    assertTrue(Bytes.equals(keyBytes, unwrappedKey.getEncoded()),
+      "Unwrapped key bytes do not match original");
   }
 
 }
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 a2f26e073e7..f9a4b6364f0 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,43 +17,37 @@
  */
 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;
 import java.net.URL;
 import java.net.URLClassLoader;
-import org.apache.hadoop.hbase.HBaseClassTestRule;
 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.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);
   }
@@ -86,6 +80,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 a68fc58e6ff..8dd124b3cec 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;
@@ -33,7 +33,6 @@ import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellComparatorImpl;
 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;
@@ -47,9 +46,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;
@@ -72,11 +69,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 =
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 5f36d468350..8020cd75c09 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.HBaseCommonTestingUtility;
 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 HBaseCommonTestingUtility UTIL = new HBaseCommonTestingUtility();
 
   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());